From 54a1059cc60af88d09aa452b0be94692d5097e14 Mon Sep 17 00:00:00 2001 From: Michael Demoret Date: Tue, 26 Apr 2022 15:57:46 -0600 Subject: [PATCH 01/73] Creating 22.06 branch --- README.md | 4 ++-- docs/source/index.rst | 2 +- docs/source/morpheus_quickstart_guide.md | 12 +++++------ models/README.md | 26 ++++++++++++------------ 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 3bd3702939..22052d1a1b 100644 --- a/README.md +++ b/README.md @@ -51,13 +51,13 @@ git lfs pull Pre-built Morpheus Docker images can be downloaded from NGC. See [here](docs/source/morpheus_quickstart_guide.md#set-up-ngc-api-key-and-install-ngc-registry-cli) for details on accessing NGC. The `runtime` image includes pre-installed Morpheus and dependencies: ```bash -docker pull nvcr.io/nvidia/morpheus/morpheus:22.04-runtime +docker pull nvcr.io/nvidia/morpheus/morpheus:22.06-runtime ``` Run the pre-built `runtime` container: ```bash -DOCKER_IMAGE_TAG=22.04-runtime ./docker/run_container_release.sh +DOCKER_IMAGE_TAG=22.06-runtime ./docker/run_container_release.sh ``` #### Manually build `runtime` Docker image diff --git a/docs/source/index.rst b/docs/source/index.rst index 1da623f6fc..030678af20 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -71,7 +71,7 @@ To get started, first pull the NGC container: .. code-block:: console - $ docker pull nvcr.io/nvidia/morpheus/morpheus:22.04-runtime + $ docker pull nvcr.io/nvidia/morpheus/morpheus:22.06-runtime Launch an interactive container to start using Morpheus: diff --git a/docs/source/morpheus_quickstart_guide.md b/docs/source/morpheus_quickstart_guide.md index 0b0171e754..f8cf38860f 100644 --- a/docs/source/morpheus_quickstart_guide.md +++ b/docs/source/morpheus_quickstart_guide.md @@ -148,7 +148,7 @@ The Morpheus AI Engine consists of the following components: Follow the below steps to install Morpheus AI Engine: ```bash -$ helm fetch https://helm.ngc.nvidia.com/nvidia/morpheus/charts/morpheus-ai-engine-22.04.tgz --username='$oauthtoken' --password=$API_KEY --untar +$ helm fetch https://helm.ngc.nvidia.com/nvidia/morpheus/charts/morpheus-ai-engine-22.06.tgz --username='$oauthtoken' --password=$API_KEY --untar ``` ```bash $ helm install --set ngc.apiKey="$API_KEY" \ @@ -190,7 +190,7 @@ replicaset.apps/zookeeper-87f9f4dd 1 1 1 54s Run the following commands to pull and install the Morpheus CLI on your instance: ```bash -$ helm fetch https://helm.ngc.nvidia.com/nvidia/morpheus/charts/morpheus-sdk-client-22.04.tgz --username='$oauthtoken' --password=$API_KEY --untar +$ helm fetch https://helm.ngc.nvidia.com/nvidia/morpheus/charts/morpheus-sdk-client-22.06.tgz --username='$oauthtoken' --password=$API_KEY --untar ``` ```bash @@ -239,7 +239,7 @@ The Morpheus MLFlow Triton Plugin is used to deploy, update, and remove models f Follow the below steps to install Morpheus MlFLow Triton Plugin: ```bash -$ helm fetch https://helm.ngc.nvidia.com/nvidia/morpheus/charts/morpheus-mlflow-22.04.tgz --username='$oauthtoken' --password=$API_KEY --untar +$ helm fetch https://helm.ngc.nvidia.com/nvidia/morpheus/charts/morpheus-mlflow-22.06.tgz --username='$oauthtoken' --password=$API_KEY --untar ``` ```bash $ helm install --set ngc.apiKey="$API_KEY" \ @@ -1131,9 +1131,9 @@ This section lists solutions to problems you might encounter with Morpheus or fr Let's add any important issues that need to be brought to the attention of users here. --> -[Morpheus Pipeline Examples]: https://github.com/NVIDIA/Morpheus/tree/branch-22.04/examples -[Morpheus Contribution]: https://github.com/NVIDIA/Morpheus/blob/branch-22.04/CONTRIBUTING.md -[Morpheus Developer Guide]: https://github.com/NVIDIA/Morpheus/tree/branch-22.04/docs/source/developer_guide/guides +[Morpheus Pipeline Examples]: https://github.com/NVIDIA/Morpheus/tree/branch-22.06/examples +[Morpheus Contribution]: https://github.com/NVIDIA/Morpheus/blob/branch-22.06/CONTRIBUTING.md +[Morpheus Developer Guide]: https://github.com/NVIDIA/Morpheus/tree/branch-22.06/docs/source/developer_guide/guides [Triton Inference Server Model Configuration]: https://github.com/triton-inference-server/server/blob/main/docs/model_configuration.md [NVIDIA’s Cloud Native Core Stack]: https://github.com/NVIDIA/cloud-native-core [NGC Registry CLI User Guide]: https://docs.nvidia.com/dgx/ngc-registry-cli-user-guide/index.html#topic_4_1 diff --git a/models/README.md b/models/README.md index b8f15633f2..13af809486 100644 --- a/models/README.md +++ b/models/README.md @@ -44,7 +44,7 @@ In the root directory, the file `model-information.csv` contains the following i # Model Card Info ## Sensitive Information Detection (SID) -### Model Overview +### Model Overview SID is a classifier, designed to detect sensitive information (e.g., AWS credentials, GitHub credentials) in unencrypted data. This example model classifies text containing these 10 categories of sensitive information- address, bank account, credit card number, email address, government id number, full name, password, phone number, secret keys, and usernames. ### Model Architecture Compact BERT-mini transformer model @@ -60,7 +60,7 @@ Multi-label sequence classification for 10 sensitive information categories Well-Read Students Learn Better: On the Importance of Pre-training Compact Models, 2019, https://arxiv.org/abs/1908.08962 ## Phishing Email Detection -### Model Overview +### Model Overview Phishing email detection is a binary classifier differentiating between phishing and non-phishing emails. ### Model Architecture BERT-base uncased transformer model @@ -74,8 +74,8 @@ Entire email as a string Binary sequence classification as phishing or non-phishing ### References - Radev, D. (2008), CLAIR collection of fraud email, ACL Data and Code Repository, ADCR2008T001, http://aclweb.org/aclwiki -- Devlin J. et al. (2018), BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding -https://arxiv.org/abs/1810.04805 +- Devlin J. et al. (2018), BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding +https://arxiv.org/abs/1810.04805 ## Anomalous Behavior Profiling (ABP) @@ -86,7 +86,7 @@ XGBoost ### Training Training consisted of ~1000 labeled nv-smi logs generated from processes running either GPU malware or bengin GPU-based workflows. ### How To Use This Model -This model can be used to flag anomalous GPU activity. +This model can be used to flag anomalous GPU activity. #### Input nv-smi data #### Output @@ -108,8 +108,8 @@ aws-cloudtrail logs ### Output Anomalous score of Autoencoder, Binary classification of time series anomaly detection ### References -- https://github.com/AlliedToasters/dfencoder/blob/master/dfencoder/autoencoder.py -- https://github.com/rapidsai/clx/blob/branch-22.04/notebooks/anomaly_detection/FFT_Outlier_Detection.ipynb +- https://github.com/AlliedToasters/dfencoder/blob/master/dfencoder/autoencoder.py +- https://github.com/rapidsai/clx/blob/branch-22.06/notebooks/anomaly_detection/FFT_Outlier_Detection.ipynb - Rasheed Peng Alhajj Rokne Jon: Fourier Transform Based Spatial Outlier Mining 2009 - https://link.springer.com/chapter/10.1007/978-3-642-04394-9_39 ## Flexible Log Parsing @@ -126,16 +126,16 @@ raw apache web logs #### Output parsed apache web log as jsonlines ### References -- Devlin J. et al. (2018), BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding +- Devlin J. et al. (2018), BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding - https://arxiv.org/abs/1810.04805 - https://medium.com/rapids-ai/cybert-28b35a4c81c4 - https://www.splunk.com/en_us/blog/it/how-splunk-is-parsing-machine-logs-with-machine-learning-on-nvidia-s-triton-and-morpheus.html -## Fraud Detection +## Fraud Detection ### Model Overview -This model shows an application of a graph neural network for fraud detection in a credit card transaction graph. A transaction dataset that includes three types of nodes, transaction, client, and merchant nodes is used for modeling. A combination of `GraphSAGE` along `XGBoost` is used to identify frauds in the transaction networks. +This model shows an application of a graph neural network for fraud detection in a credit card transaction graph. A transaction dataset that includes three types of nodes, transaction, client, and merchant nodes is used for modeling. A combination of `GraphSAGE` along `XGBoost` is used to identify frauds in the transaction networks. ### Model Architecture -It uses a bipartite heterogeneous graph representation as input for `GraphSAGE` for feature learning and `XGBoost` as a classifier. Since the input graph is heterogenous, a heterogeneous implementation of `GraphSAGE` (HinSAGE) is used for feature embedding. +It uses a bipartite heterogeneous graph representation as input for `GraphSAGE` for feature learning and `XGBoost` as a classifier. Since the input graph is heterogenous, a heterogeneous implementation of `GraphSAGE` (HinSAGE) is used for feature embedding. ### Training A training data consists of raw 753 labeled credit card transaction data with data augmentation in a total of 12053 labeled transaction data. The `GraphSAGE` is trained to output embedded representation of transactions out of the graph. The `XGBoost` is trained using the embedded features as a binary classifier to classify fraud and genuine transactions. ### How To Use This Model @@ -143,8 +143,8 @@ This model is an example of a fraud detection pipeline using a graph neural netw #### Input Transaction data with nodes including transaction, client, and merchant. #### Output -An anomalous score of transactions indicates a probability score of being a fraud. +An anomalous score of transactions indicates a probability score of being a fraud. ### References - https://stellargraph.readthedocs.io/en/stable/hinsage.html?highlight=hinsage - https://github.com/rapidsai/clx/blob/branch-0.20/examples/forest_inference/xgboost_training.ipynb -- Rafaël Van Belle, Charles Van Damme, Hendrik Tytgat, Jochen De Weerdt,Inductive Graph Representation Learning for fraud detection (https://www.sciencedirect.com/science/article/abs/pii/S0957417421017449) \ No newline at end of file +- Rafaël Van Belle, Charles Van Damme, Hendrik Tytgat, Jochen De Weerdt,Inductive Graph Representation Learning for fraud detection (https://www.sciencedirect.com/science/article/abs/pii/S0957417421017449) From d665158815fe1893facdd448f4a7a5ea3b2b24a6 Mon Sep 17 00:00:00 2001 From: David Gardner Date: Tue, 26 Apr 2022 15:46:45 -0700 Subject: [PATCH 02/73] Update license header to Apache v2 --- examples/log_parsing/README.md | 34 +++++++++++----------------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/examples/log_parsing/README.md b/examples/log_parsing/README.md index 96548d2b08..f62ad6a930 100644 --- a/examples/log_parsing/README.md +++ b/examples/log_parsing/README.md @@ -1,29 +1,17 @@ # Example cyBERT Morpheus Pipeline for Apache Log Parsing From 322d8a41b394a59a19c502e8108fd9ec2980850a Mon Sep 17 00:00:00 2001 From: David Gardner Date: Tue, 26 Apr 2022 16:51:57 -0700 Subject: [PATCH 03/73] Fix path to log_parsing --- examples/log_parsing/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/log_parsing/README.md b/examples/log_parsing/README.md index f62ad6a930..c22d7a4dae 100644 --- a/examples/log_parsing/README.md +++ b/examples/log_parsing/README.md @@ -56,7 +56,7 @@ python ./examples/log_parsing/run.py \ Use `--help` to display information about the command line options: ``` -python ./examples/log-parsing/run.py --help +python ./examples/log_parsing/run.py --help Options: --num_threads INTEGER RANGE Number of internal pipeline threads to use From 7356a7393e221afa684961edd88eaeb3783ff946 Mon Sep 17 00:00:00 2001 From: David Gardner Date: Wed, 27 Apr 2022 08:22:35 -0700 Subject: [PATCH 04/73] Formatting --- examples/log_parsing/run.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/log_parsing/run.py b/examples/log_parsing/run.py index 6e3502ceb6..6f9322c961 100644 --- a/examples/log_parsing/run.py +++ b/examples/log_parsing/run.py @@ -12,8 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -import click import os + +import click from inference import LogParsingInferenceStage from postprocessing import LogParsingPostProcessingStage from preprocessing import PreprocessLogParsingStage From 454f7d21fb5331a9755b8631e8d9fee5f610f74f Mon Sep 17 00:00:00 2001 From: David Gardner Date: Wed, 27 Apr 2022 08:35:49 -0700 Subject: [PATCH 05/73] Removed unused SubwordTokenizer per feedback from Eli --- examples/log_parsing/preprocessing.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/log_parsing/preprocessing.py b/examples/log_parsing/preprocessing.py index 04f6633e4b..6a26cdbe46 100644 --- a/examples/log_parsing/preprocessing.py +++ b/examples/log_parsing/preprocessing.py @@ -19,7 +19,6 @@ import neo import cudf -from cudf.core.subword_tokenizer import SubwordTokenizer import morpheus._lib.stages as neos from morpheus.config import Config @@ -80,7 +79,6 @@ def __init__(self, self._do_lower_case = do_lower_case self._add_special_tokens = add_special_tokens - self._tokenizer: SubwordTokenizer = None @property def name(self) -> str: From 3603da7f5f86f2664f9b12f757e5817b85749f14 Mon Sep 17 00:00:00 2001 From: Bartley Richardson <3215767+BartleyR@users.noreply.github.com> Date: Thu, 28 Apr 2022 13:00:18 -0400 Subject: [PATCH 06/73] README changes --- README.md | 7 ++++++- img/morpheus-banner.png | Bin 0 -> 447952 bytes 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 img/morpheus-banner.png diff --git a/README.md b/README.md index 22052d1a1b..bbf535ac9d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -# Morpheus SDK +![NVIDIA Morpheus](./img/morpheus-banner.png "Morpheus banner image") + +# NVIDIA Morpheus NVIDIA Morpheus is an open AI application framework that provides cybersecurity developers with a highly optimized AI framework and pre-trained AI capabilities that allow them to instantaneously inspect all IP traffic across their data center fabric. The Morpheus developer framework allows teams to build their own optimized pipelines that address cybersecurity and information security use cases. Bringing a new level of security to data centers, Morpheus provides development capabilities around dynamic protection, real-time telemetry, adaptive policies, and cyber defenses for detecting and remediating cybersecurity threats. @@ -398,3 +400,6 @@ Complete! ``` This indicates that only 3 out of 314 rows did not match the validation dataset. If you see errors similar to `:/ ( %)` or very high percentages, then the workflow did not complete sucessfully. + +## Contributing +Please see our [guide for contributing to Morpheus](./CONTRIBUTING.md). \ No newline at end of file diff --git a/img/morpheus-banner.png b/img/morpheus-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..203aea9045700ef23dfc3b1206510254ef97cf70 GIT binary patch literal 447952 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 z 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
+`f+a0;iYo;n-M-2Gf>?SoYELWzraHwd}C& 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 z Date: Thu, 28 Apr 2022 15:24:47 -0400 Subject: [PATCH 07/73] Updated README with docs link --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index bbf535ac9d..4ca400eef1 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,9 @@ NVIDIA Morpheus is an open AI application framework that provides cybersecurity There are two basic ways to get started with Morpheus - using the production deployment containers on NGC or using GitHub to run the pre-built container or build from source. +## Documentation +Full documentation (including a quick start guide, a developer/user guide, and API documentation) is available online at [https://docs.nvidia.com/morpheus/](https://docs.nvidia.com/morpheus/). + ## Getting Started with Containers on NGC Morpheus pre-built containers are hosted on NGC (NVIDIA GPU Cloud) and make it easy to get started running Morpheus. Use the link below to access the Morpheus collection. From b6c78a67dd8dd1dc1e25663254fc0e5d40a69b98 Mon Sep 17 00:00:00 2001 From: Bartley Richardson <3215767+BartleyR@users.noreply.github.com> Date: Thu, 28 Apr 2022 17:40:33 -0400 Subject: [PATCH 08/73] README updates for clarity --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4ca400eef1..b3f85e8bf3 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ NVIDIA Morpheus is an open AI application framework that provides cybersecurity developers with a highly optimized AI framework and pre-trained AI capabilities that allow them to instantaneously inspect all IP traffic across their data center fabric. The Morpheus developer framework allows teams to build their own optimized pipelines that address cybersecurity and information security use cases. Bringing a new level of security to data centers, Morpheus provides development capabilities around dynamic protection, real-time telemetry, adaptive policies, and cyber defenses for detecting and remediating cybersecurity threats. -There are two basic ways to get started with Morpheus - using the production deployment containers on NGC or using GitHub to run the pre-built container or build from source. +There are two basic ways to get started with Morpheus - (1) using the production deployment containers on NGC or (2) building the container/source from GitHub. ## Documentation Full documentation (including a quick start guide, a developer/user guide, and API documentation) is available online at [https://docs.nvidia.com/morpheus/](https://docs.nvidia.com/morpheus/). From f1de88fa3f65b1d179c3402496952b48edf7b4de Mon Sep 17 00:00:00 2001 From: David Gardner Date: Thu, 28 Apr 2022 15:05:37 -0700 Subject: [PATCH 09/73] Install new apt key --- docker/Dockerfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index fe1b5f5e19..15fbbc7652 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -39,8 +39,11 @@ ARG TENSORRT_VERSION=8.2.1.3 # Capture argument used for FROM ARG CUDA_VER + + # Install dependencies to build vcpkg dependencies -RUN apt-get update &&\ +RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/3bf863cc.pub && \ + apt-get update &&\ apt-get upgrade -y &&\ curl -sL https://deb.nodesource.com/setup_12.x | bash - &&\ apt-get install --no-install-recommends -y \ From e217d92e87db7197a19bda4f52999306b6adfe78 Mon Sep 17 00:00:00 2001 From: Jeffrey James Date: Thu, 28 Apr 2022 19:51:22 -0400 Subject: [PATCH 10/73] docs: small fixes in README.md and CONTRIBUTING.md fixes typos in README.md removes one remaining gitlab merge-request term in CONTRIBUTING.md --- CONTRIBUTING.md | 2 +- README.md | 56 ++++++++++++++++++++++++------------------------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 665c54d161..c462b698bd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -28,7 +28,7 @@ More information can be found at: [Contributor Code of Conduct](CODE_OF_CONDUCT. 1. Find an issue to work on. The best way is to look for issues with the [good first issue](https://github.com/NVIDIA/Morpheus/issues) label. 2. Comment on the issue stating that you are going to work on it. 3. Code! Make sure to update unit tests! Ensure the [license headers are set properly](#Licensing). -4. When done, [create your merge request](https://github.com/NVIDIA/Morpheus/compare). +4. When done, [create your pull request](https://github.com/NVIDIA/Morpheus/compare). 5. Wait for other developers to review your code and update code as needed. 6. Once reviewed and approved, a Morpheus developer will merge your pull request. diff --git a/README.md b/README.md index 22052d1a1b..2967447d7b 100644 --- a/README.md +++ b/README.md @@ -2,18 +2,18 @@ NVIDIA Morpheus is an open AI application framework that provides cybersecurity developers with a highly optimized AI framework and pre-trained AI capabilities that allow them to instantaneously inspect all IP traffic across their data center fabric. The Morpheus developer framework allows teams to build their own optimized pipelines that address cybersecurity and information security use cases. Bringing a new level of security to data centers, Morpheus provides development capabilities around dynamic protection, real-time telemetry, adaptive policies, and cyber defenses for detecting and remediating cybersecurity threats. -There are two basic ways to get started with Morpheus - using the production deployment containers on NGC or using GitHub to run the pre-built container or build from source. +There are two basic ways to get started with Morpheus - using the production deployment containers on NGC or using GitHub to run the pre-built container or build from source. ## Getting Started with Containers on NGC -Morpheus pre-built containers are hosted on NGC (NVIDIA GPU Cloud) and make it easy to get started running Morpheus. Use the link below to access the Morpheus collection. +Morpheus pre-built containers are hosted on NGC (NVIDIA GPU Cloud) and make it easy to get started with running Morpheus. Use the link below to access the Morpheus collection. [https://catalog.ngc.nvidia.com/orgs/nvidia/teams/morpheus/collections/morpheus](https://catalog.ngc.nvidia.com/orgs/nvidia/teams/morpheus/collections/morpheus) Complete instructions on how to get up-and-running with the NGC containers are available in the Morpheus Quick Start Guide. ## Getting Started with Installation via GitHub -If you prefer to run Morpheus from GitLab, the instructions below provide guidelines on how to get started with the pre-built container or build from source. +If you prefer to run Morpheus from GitHub, the instructions below provide guidelines on how to get started with the pre-built container or build from source. #### Prerequisites @@ -27,7 +27,7 @@ If you prefer to run Morpheus from GitLab, the instructions below provide guidel The large model and data files in this repo are stored using [Git Large File Storage (LFS)](https://git-lfs.github.com/). These files will be required for running the training/validation scripts and example pipelines for the Morpheus pre-trained models. -If `Git LFS` is not installed before cloning the repository, the large files will not be pulled. If this is the case, follow the instructions for installing `Git LFS` from [here](https://git-lfs.github.com/), and then run the following command. +If `Git LFS` is not installed before cloning the repository, the large files will not be pulled. If this is the case, follow the instructions for installing `Git LFS` from [here](https://git-lfs.github.com/), and then run the following command: ```bash git lfs install ``` @@ -46,7 +46,7 @@ cd $MORPHEUS_ROOT git lfs pull ``` -#### Pre-built `runtime` Docker image +#### Pre-built `runtime` Docker Image Pre-built Morpheus Docker images can be downloaded from NGC. See [here](docs/source/morpheus_quickstart_guide.md#set-up-ngc-api-key-and-install-ngc-registry-cli) for details on accessing NGC. The `runtime` image includes pre-installed Morpheus and dependencies: @@ -60,14 +60,14 @@ Run the pre-built `runtime` container: DOCKER_IMAGE_TAG=22.06-runtime ./docker/run_container_release.sh ``` -#### Manually build `runtime` Docker image +#### Manually Build `runtime` Docker Image -The Morpheus `runtime` image can also be manually built. This allows you to use a Morpheus build from the development branch or other branch/tag. -To manually build the `runtime` image, run the following from the repo root: +The Morpheus `runtime` image can also be built manually. This allows you to use a Morpheus build from the development branch or another branch/tag. +To manually build the `runtime` image, run the following from the repo's root: -#### Building locally (outside a container) +#### Building Locally (Outside a Container) -To build Morpheus outside a container, all the necessary dependencies will need to be installed locally or in a virtual environment. Due to the increased complexity of installing outside of a container, this section has been moved to the [`CONTRIBUTING.md`](CONTRIBUTING.md). Please see the "Build in a Conda Environment" section for more information. +To build Morpheus outside a container, all the necessary dependencies will need to be installed locally or in a virtual environment. Due to the increased complexity of installing outside of a container, this section has been moved to [`CONTRIBUTING.md`](CONTRIBUTING.md). Please see the "Build in a Conda Environment" section for more information. Note: Once `morpheus` CLI is installed, shell command completion can be installed with: ```bash @@ -81,13 +81,13 @@ Run the manually built `runtime` container: ./docker/run_container_release.sh ``` -#### Build from source +#### Build from Source Build instructions for developers and contributors can be found in [CONTRIBUTING.md](./CONTRIBUTING.md). ## Running Morpheus -Depending on your configuration, it may be necessary to start additional services that Morpheus will interact with, before launching the pipeline. See the following list of stages that require additional services: +Depending on your configuration, it may be necessary to start additional services that Morpheus will interact with before launching the pipeline. See the following list of stages that require additional services: - `from-kafka`/`to-kafka` - Requires a running Kafka cluster @@ -96,9 +96,9 @@ Depending on your configuration, it may be necessary to start additional service - Requires a running Triton server - See the launching Triton section. -### Quick Launch Kafka Cluster +### Quick-Launch Kafka Cluster -Launching a full production Kafka cluster is outside the scope of this project. However, if a quick cluster is needed for testing or development, one can be quickly launched via Docker Compose. The following commands outline that process. See [this](https://medium.com/big-data-engineering/hello-kafka-world-the-complete-guide-to-kafka-with-docker-and-python-f788e2588cfc) guide for more in depth information: +Launching a full production Kafka cluster is outside the scope of this project. However, if a quick cluster is needed for testing or development, one can be quickly launched via Docker Compose. The following commands outline that process. See [this](https://medium.com/big-data-engineering/hello-kafka-world-the-complete-guide-to-kafka-with-docker-and-python-f788e2588cfc) guide for more in-depth information: 1. Install `docker-compose` if not already installed: ```bash @@ -108,11 +108,11 @@ Launching a full production Kafka cluster is outside the scope of this project. ```bash git clone https://github.com/wurstmeister/kafka-docker.git ``` -3. Change directory to `kafka-docker` +3. Change directory to `kafka-docker`: ```bash cd kafka-docker ``` -4. Export the IP address of your Docker `bridge` network +4. Export the IP address of your Docker `bridge` network: ```bash export KAFKA_ADVERTISED_HOST_NAME=$(docker network inspect bridge | jq -r '.[0].IPAM.Config[0].Gateway') ``` @@ -126,17 +126,17 @@ Launching a full production Kafka cluster is outside the scope of this project. $ echo $KAFKA_ADVERTISED_HOST_NAME "172.17.0.1" ``` -6. Launch kafka with 3 instances +6. Launch kafka with 3 instances: ```bash docker-compose up -d --scale kafka=3 ``` - In practice, 3 instances has been shown to work well. Use as many instances as required. Keep in mind each instance takes about 1 Gb of memory each. -7. Create the topic + In practice, 3 instances has been shown to work well. Use as many instances as required. Keep in mind each instance takes about 1 Gb of memory. +7. Create the topic: ```bash ./start-kafka-shell.sh $KAFKA_ADVERTISED_HOST_NAME $KAFKA_HOME/bin/kafka-topics.sh --create --topic=$MY_INPUT_TOPIC_NAME --bootstrap-server `broker-list.sh` ``` - Replace `` with the input name of your choice. If you are using `to-kafka` ensure your output topic is also created. + Replace `` with the input name of your choice. If you are using `to-kafka`, ensure your output topic is also created. 8. Generate input messages 1. In order for Morpheus to read from Kafka, messages need to be published to the cluster. For debugging/testing purposes, the following container can be used: @@ -169,13 +169,13 @@ docker run --rm -ti --gpus=all -p8000:8000 -p8001:8001 -p8002:8002 -v $PWD/model --load-model sid-minibert-onnx \ --load-model phishing-bert-onnx ``` -This will launch Triton using the port 8001 for the GRPC server. This needs to match the Morpheus configuration. +This will launch Triton using port 8001 for the GRPC server. This needs to match the Morpheus configuration. ## Configuration The Morpheus pipeline can be configured in two ways: -1. Manual configuration in Python script. -2. Configuration via the provided CLI (i.e. `morpheus`) +1. Manual configuration via Python script. +2. Using the provided CLI (i.e., `morpheus`). ### Starting the Pipeline (via Manual Python Config) @@ -234,7 +234,7 @@ Options: #### CLI Stage Configuration -When configuring a pipeline via the CLI, you start with the command `morpheus run pipeline` and then list the stages in order from start to finish. The order that the commands are placed in will be the order that data flows from start to end. The output of each stage will be linked to the input of the next. For example, to build a simple pipeline that reads from kafka, deserializes messages, serializes them, and then writes to a file, use the following: +When configuring a pipeline via the CLI, you start with the command `morpheus run pipeline` and then list the stages in order from start to finish. The order that the commands are placed in will be the order that data flows from start to end. The output of each stage will be linked to the input of the next. For example, to build a simple pipeline that reads from Kafka, deserializes messages, serializes them, and then writes to a file, use the following: ```bash $ morpheus run pipeline-nlp from-kafka --input_topic test_pcap deserialize serialize to-file --filename .tmp/temp_out.json @@ -272,7 +272,7 @@ Traceback (most recent call last): RuntimeError: The to-file stage cannot handle input of . Accepted input types: (typing.List[str],) ``` -This indicates that the `to-file` stage cannot accept the input type of `morpheus.pipeline.messages.MultiMessage`. This is because the `to-file` stage has no idea how to write that class to a file, it only knows how to write strings. To ensure you have a valid pipeline, look at the `Accepted input types: (typing.List[str],)` portion of the message. This indicates you need a stage that converts from the output type of the `deserialize` stage, `morpheus.pipeline.messages.MultiMessage`, to `typing.List[str]`, which is exactly what the `serialize` stage does. +This indicates that the `to-file` stage cannot accept the input type of `morpheus.pipeline.messages.MultiMessage`. This is because the `to-file` stage has no idea how to write that class to a file; it only knows how to write strings. To ensure you have a valid pipeline, look at the `Accepted input types: (typing.List[str],)` portion of the message. This indicates you need a stage that converts from the output type of the `deserialize` stage, `morpheus.pipeline.messages.MultiMessage`, to `typing.List[str]`, which is exactly what the `serialize` stage does. ## Pipeline Stages @@ -339,7 +339,7 @@ Commands: validate Validates pipeline output against an expected output ``` -And for AE pipeline: +And for the AE pipeline: ```bash $ morpheus run pipeline-fil --help @@ -369,12 +369,12 @@ Commands: validate Validates pipeline output against an expected output ``` -Note: The available commands for different types of pipelines are not the same. And the same stage in different pipelines may have different options. Please check the CLI help for the most up to date information during development. +Note: The available commands for different types of pipelines are not the same. This means that the same stage, when used in different pipelines, may have different options. Please check the CLI help for the most up-to-date information during development. ## Pipeline Validation -To verify that all pipelines are working correctly, validation scripts have been added at `${MORPHEUS_ROOT}/scripts/validation`. There are scripts for each of the main workflows: Anomalous Behavioral Profilirun_container_release.shng (ABP), Humans-as-Machines-Machines-as-Humans (HAMMAH), Phishing Detection (Phishing), and Sensitive Information Detection (SID). +To verify that all pipelines are working correctly, validation scripts have been added at `${MORPHEUS_ROOT}/scripts/validation`. There are scripts for each of the main workflows: Anomalous Behavior Profiling (ABP), Humans-as-Machines-Machines-as-Humans (HAMMAH), Phishing Detection (Phishing), and Sensitive Information Detection (SID). To run all of the validation workflow scripts, use the following commands: From 60e430ef463db2cf5ab5d943362ddb8753742f22 Mon Sep 17 00:00:00 2001 From: Pete MacKinnon Date: Fri, 29 Apr 2022 08:48:22 -0400 Subject: [PATCH 11/73] Update README.md Add trailing underscore to collection name --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 22052d1a1b..793f85838d 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ There are two basic ways to get started with Morpheus - using the production de Morpheus pre-built containers are hosted on NGC (NVIDIA GPU Cloud) and make it easy to get started running Morpheus. Use the link below to access the Morpheus collection. -[https://catalog.ngc.nvidia.com/orgs/nvidia/teams/morpheus/collections/morpheus](https://catalog.ngc.nvidia.com/orgs/nvidia/teams/morpheus/collections/morpheus) +[https://catalog.ngc.nvidia.com/orgs/nvidia/teams/morpheus/collections/morpheus_](https://catalog.ngc.nvidia.com/orgs/nvidia/teams/morpheus/collections/morpheus_) Complete instructions on how to get up-and-running with the NGC containers are available in the Morpheus Quick Start Guide. From 0c3882701f6c65126f97493b0979b3d5de2a1b46 Mon Sep 17 00:00:00 2001 From: Pete MacKinnon Date: Wed, 4 May 2022 16:28:02 -0400 Subject: [PATCH 12/73] Rename mlflow conda env file --- models/mlflow/README.md | 4 ++-- models/mlflow/docker/Dockerfile | 4 ++-- .../mlflow/docker/conda/{environment.yml => mlflow-env.yml} | 0 3 files changed, 4 insertions(+), 4 deletions(-) rename models/mlflow/docker/conda/{environment.yml => mlflow-env.yml} (100%) diff --git a/models/mlflow/README.md b/models/mlflow/README.md index 5fcd913c7e..7271a7bcf6 100644 --- a/models/mlflow/README.md +++ b/models/mlflow/README.md @@ -5,7 +5,7 @@ are included for publishing TensorRT, ONNX and FIL models to your MLFlow Model R ## Requirements -* MLflow (tested on 1.21.0) +* MLflow (tested on 1.24.0) * Python (tested on 3.8) ## Install Triton Docker Image @@ -51,7 +51,7 @@ docker run --gpus=1 --rm -p8000:8000 -p8001:8001 -p8002:8002 -v /opt/triton_mode Build MLFlow image from Dockerfile: ``` -docker build -t mlflow-morpheus:latest -f docker/Dockerfile . +docker build -t mlflow-triton-plugin:latest -f docker/Dockerfile . ``` Create MLFlow container with volume mount to Triton model repository: diff --git a/models/mlflow/docker/Dockerfile b/models/mlflow/docker/Dockerfile index e343b4de81..92a091603d 100644 --- a/models/mlflow/docker/Dockerfile +++ b/models/mlflow/docker/Dockerfile @@ -1,4 +1,4 @@ -ARG FROM_IMAGE=gpuci/miniconda-cuda +ARG FROM_IMAGE=gpuci/miniforge-cuda ARG CUDA_VER=11.4 ARG LINUX_VER=ubuntu20.04 ARG TRITON_VER=r22.02 @@ -10,7 +10,7 @@ COPY . ./ # need to do an upgrade in case gpuci is stale for whatever reason RUN apt-get update && apt upgrade -y && apt-get install -y procps vim -RUN /opt/conda/bin/conda env create -f docker/conda/environment.yml +RUN /opt/conda/bin/conda env create -f docker/conda/mlflow-env.yml RUN sed -i 's/conda activate base/conda activate mlflow/g' ~/.bashrc SHELL ["/opt/conda/bin/conda", "run", "-n", "mlflow", "/bin/bash", "-c"] diff --git a/models/mlflow/docker/conda/environment.yml b/models/mlflow/docker/conda/mlflow-env.yml similarity index 100% rename from models/mlflow/docker/conda/environment.yml rename to models/mlflow/docker/conda/mlflow-env.yml From 8040ef0b442986b4de1c91b56ab3e2a135052f41 Mon Sep 17 00:00:00 2001 From: David Gardner <96306125+dagardner-nv@users.noreply.github.com> Date: Wed, 4 May 2022 15:38:50 -0700 Subject: [PATCH 13/73] * Update version fo triton (#61) * Remove ref to git submodule * Fix path to labels file * Remove buffer stages * Add `--truncation=True` to the preprocess stage * Morpheus stops on its own now --- examples/nlp_si_detection/README.md | 94 +++++++++++++++-------------- 1 file changed, 48 insertions(+), 46 deletions(-) diff --git a/examples/nlp_si_detection/README.md b/examples/nlp_si_detection/README.md index 40f1e8a452..5fe1eca108 100644 --- a/examples/nlp_si_detection/README.md +++ b/examples/nlp_si_detection/README.md @@ -70,21 +70,17 @@ Below is a visualization of the pipeline showing all of the stages and data type ## Setup -This example utilizes the Triton Inference Server to perform inference. The neural network model is provided in a separate submodule repo. Make sure the Morpheus Models repo is checked out with: - -```bash -git submodule update --init --recursive -``` +This example utilizes the Triton Inference Server to perform inference. The neural network model is provided in the `models/sid-models` directory of the Morpheus repo. ### Launching Triton From the Morpheus repo root directory, run the following to launch Triton and load the `sid-minibert` model: ```bash -docker run --rm -ti --gpus=all -p8000:8000 -p8001:8001 -p8002:8002 -v $PWD/models:/models nvcr.io/nvidia/tritonserver:21.03-py3 tritonserver --model-repository=/models/triton-model-repo --exit-on-error=false --model-control-mode=explicit --load-model sid-minibert-onnx +docker run --rm -ti --gpus=all -p8000:8000 -p8001:8001 -p8002:8002 -v $PWD/models:/models nvcr.io/nvidia/tritonserver:22.02-py3 tritonserver --model-repository=/models/triton-model-repo --exit-on-error=false --model-control-mode=explicit --load-model sid-minibert-onnx ``` -Where `21.03` can be replaced with the current year and month of the Triton version to use. For example, to use May 2021, specify `nvcr.io/nvidia/tritonserver:21.05-py3`. Ensure that the version of TensorRT that is used in Triton matches the version of TensorRT elsewhere (see [NGC Deep Learning Frameworks Support Matrix](https://docs.nvidia.com/deeplearning/frameworks/support-matrix/index.html)). +Where `22.02-py3` can be replaced with the current year and month of the Triton version to use. For example, to use May 2021, specify `nvcr.io/nvidia/tritonserver:21.05-py3`. Ensure that the version of TensorRT that is used in Triton matches the version of TensorRT elsewhere (see [NGC Deep Learning Frameworks Support Matrix](https://docs.nvidia.com/deeplearning/frameworks/support-matrix/index.html)). This will launch Triton and only load the `sid-minibert-onnx` model. This model has been configured with a max batch size of 32, and to use dynamic batching for increased performance. @@ -112,28 +108,24 @@ morpheus --debug --log_level=DEBUG \ `# Run a pipeline with 8 threads and a model batch size of 32 (Must match Triton config)` \ run --num_threads=8 --pipeline_batch_size=1024 --model_max_batch_size=32 \ `# Specify a NLP pipeline with 256 sequence length (Must match Triton config)` \ - pipeline-nlp --model_seq_length=256 --viz_file ./pipeline.png \ + pipeline-nlp --model_seq_length=256 --labels_file=$MORPHEUS_ROOT/data/labels_nlp.txt \ `# 1st Stage: Read from file` \ from-file --filename=$MORPHEUS_ROOT/data/pcap_dump.jsonlines \ - `# 2nd Stage: Buffer upstream stage data (improves performance)` \ - buffer \ - `# 3rd Stage: Deserialize from JSON strings to objects` \ + `# 2nd Stage: Deserialize from JSON strings to objects` \ deserialize \ - `# 4th Stage: Preprocessing converts the input data into BERT tokens` \ - preprocess --vocab_hash_file=$MORPHEUS_ROOT/data/bert-base-uncased-hash.txt --do_lower_case=True \ - `# 5th Stage: Another buffer before inference for performance` \ - buffer \ - `# 6th Stage: Send messages to Triton for inference. Specify the model loaded in Setup` \ + `# 3rd Stage: Preprocessing converts the input data into BERT tokens` \ + preprocess --vocab_hash_file=$MORPHEUS_ROOT/data/bert-base-uncased-hash.txt --do_lower_case=True --truncation=True \ + `# 4th Stage: Send messages to Triton for inference. Specify the model loaded in Setup` \ inf-triton --model_name=sid-minibert-onnx --server_url=localhost:8001 --force_convert_inputs=True \ - `# 7th Stage: Monitor stage prints throughput information to the console` \ + `# 5th Stage: Monitor stage prints throughput information to the console` \ monitor --description "Inference Rate" --smoothing=0.001 --unit inf \ - `# 8th Stage: Add results from inference to the messages` \ + `# 6th Stage: Add results from inference to the messages` \ add-class \ - `# 9th Stage: Filtering removes any messages that did not detect SI` \ + `# 7th Stage: Filtering removes any messages that did not detect SI` \ filter \ - `# 10th Stage: Convert from objects back into strings` \ + `# 8th Stage: Convert from objects back into strings` \ serialize --exclude '^_ts_' \ - `# 11th Stage: Write out the JSON lines to the detections.jsonlines file` \ + `# 9th Stage: Write out the JSON lines to the detections.jsonlines file` \ to-file --filename=detections.jsonlines --overwrite ``` @@ -141,11 +133,27 @@ If successful, you should see the following output: ```bash Configuring Pipeline via CLI +Loaded labels file. Current labels: [['address', 'bank_acct', 'credit_card', 'email', 'govt_id', 'name', 'password', 'phone_num', 'secret_keys', 'user']] Starting pipeline via CLI... Ctrl+C to Quit Config: { + "ae": null, + "class_labels": [ + "address", + "bank_acct", + "credit_card", + "email", + "govt_id", + "name", + "password", + "phone_num", + "secret_keys", + "user" + ], "debug": true, + "edge_buffer_size": 128, "feature_length": 256, + "fil": null, "log_config_file": null, "log_level": 10, "mode": "NLP", @@ -153,39 +161,33 @@ Config: "num_threads": 8, "pipeline_batch_size": 1024 } +CPP Enabled: True +====Registering Pipeline==== +====Registering Pipeline Complete!==== +====Starting Pipeline==== ====Building Pipeline==== -Added source: - └─> cudf.DataFrame -Added stage: - └─ cudf.DataFrame -> cudf.DataFrame -Adding timestamp info for stage: 'deserialize' -Added stage: - └─ cudf.DataFrame -> morpheus.MultiMessage -Adding timestamp info for stage: 'preprocess-nlp' -Added stage: +Added source: + └─> morpheus.MessageMeta +Added stage: + └─ morpheus.MessageMeta -> morpheus.MultiMessage +Added stage: └─ morpheus.MultiMessage -> morpheus.MultiInferenceNLPMessage -Added stage: - └─ morpheus.MultiInferenceNLPMessage -> morpheus.MultiInferenceNLPMessage -Adding timestamp info for stage: 'inference' -Added stage: +Added stage: └─ morpheus.MultiInferenceNLPMessage -> morpheus.MultiResponseProbsMessage -Added stage: +Added stage: └─ morpheus.MultiResponseProbsMessage -> morpheus.MultiResponseProbsMessage -Added stage: +Added stage: └─ morpheus.MultiResponseProbsMessage -> morpheus.MultiResponseProbsMessage -Added stage: +Added stage: └─ morpheus.MultiResponseProbsMessage -> morpheus.MultiResponseProbsMessage -Added stage: - └─ morpheus.MultiResponseProbsMessage -> List[str] -Added stage: - └─ List[str] -> List[str] +Added stage: + └─ morpheus.MultiResponseProbsMessage -> morpheus.MessageMeta +Added stage: + └─ morpheus.MessageMeta -> morpheus.MessageMeta ====Building Pipeline Complete!==== -Pipeline visualization saved to ./pipeline.png -====Starting Pipeline==== +Starting! Time: 1651079123.1867409 ====Pipeline Started==== -Inference Rate: 93085inf [01:50, 885.45inf/s] +Inference Rate[Complete]: 93085inf [00:06, 153.30inf/s] ``` -**Note:** The pipeline will not shut down when complete. Once the number of inferences has stopped changing, press Ctrl+C to exit. - The output file `detections.jsonlines` will contain PCAP messages that contain some SI (any class with a predection greater that 0.5). From f5bf0ff654973202bd705a7715b872ae668b2160 Mon Sep 17 00:00:00 2001 From: David Gardner <96306125+dagardner-nv@users.noreply.github.com> Date: Wed, 4 May 2022 15:42:02 -0700 Subject: [PATCH 14/73] Clear the log handlers on both the root and morpheus logger after each test (#66) --- tests/conftest.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index 5556c9b122..1ee3bd3304 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -79,6 +79,18 @@ def pytest_collection_modifyitems(items): item.add_marker(pytest.mark.use_cpp) +def clear_handlers(logger): + handlers = logger.handlers.copy() + for h in handlers: + logger.removeHandler(h) + + +@pytest.hookimpl(trylast=True) +def pytest_runtest_teardown(item, nextitem): + clear_handlers(logging.getLogger("morpheus")) + clear_handlers(logging.getLogger()) + + @pytest.fixture(scope="function") def config_only_cpp(): """ From 0a90a72745e6a41be102126bdbcff06cb6b71650 Mon Sep 17 00:00:00 2001 From: David Gardner <96306125+dagardner-nv@users.noreply.github.com> Date: Wed, 4 May 2022 16:57:09 -0700 Subject: [PATCH 15/73] Revert "Install new apt key" (#79) This reverts commit f1de88fa3f65b1d179c3402496952b48edf7b4de. --- docker/Dockerfile | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 21c11f6aff..5fd3f6055e 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -42,11 +42,8 @@ ARG TENSORRT_VERSION=8.2.1.3 # Capture argument used for FROM ARG CUDA_VER - - # Install dependencies to build vcpkg dependencies -RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/3bf863cc.pub && \ - apt-get update &&\ +RUN apt-get update &&\ apt-get upgrade -y &&\ curl -sL https://deb.nodesource.com/setup_12.x | bash - &&\ apt-get install --no-install-recommends -y \ From 6d497a40814b25e9907e4e0166eaa0b8d4ac25d3 Mon Sep 17 00:00:00 2001 From: Bartley Richardson <3215767+BartleyR@users.noreply.github.com> Date: Fri, 6 May 2022 12:44:50 -0400 Subject: [PATCH 16/73] Updates to README.md for clarity (#91) Updated the `README.md` file as below. - Removed reference to getting started on NGC (was causing confusion) - Reworked language on getting started on GitHub - Minor formatting issues in the Kafka quick start section Authors: - Bartley Richardson (https://github.com/BartleyR) Approvers: - Pete MacKinnon (https://github.com/pdmack) URL: https://github.com/NVIDIA/Morpheus/pull/91 --- README.md | 62 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index da123fffd7..9a4bdb00c4 100644 --- a/README.md +++ b/README.md @@ -4,23 +4,13 @@ NVIDIA Morpheus is an open AI application framework that provides cybersecurity developers with a highly optimized AI framework and pre-trained AI capabilities that allow them to instantaneously inspect all IP traffic across their data center fabric. The Morpheus developer framework allows teams to build their own optimized pipelines that address cybersecurity and information security use cases. Bringing a new level of security to data centers, Morpheus provides development capabilities around dynamic protection, real-time telemetry, adaptive policies, and cyber defenses for detecting and remediating cybersecurity threats. -There are two basic ways to get started with Morpheus - (1) using the production deployment containers on NGC or (2) building the container/source from GitHub. - ## Documentation Full documentation (including a quick start guide, a developer/user guide, and API documentation) is available online at [https://docs.nvidia.com/morpheus/](https://docs.nvidia.com/morpheus/). -## Getting Started with Containers on NGC - -Morpheus pre-built containers are hosted on NGC (NVIDIA GPU Cloud) and make it easy to get started with running Morpheus. Use the link below to access the Morpheus collection. - -[https://catalog.ngc.nvidia.com/orgs/nvidia/teams/morpheus/collections/morpheus_](https://catalog.ngc.nvidia.com/orgs/nvidia/teams/morpheus/collections/morpheus_) - -Complete instructions on how to get up-and-running with the NGC containers are available in the Morpheus Quick Start Guide. - -## Getting Started with Installation via GitHub -If you prefer to run Morpheus from GitHub, the instructions below provide guidelines on how to get started with the pre-built container or build from source. +## Getting Started with Morpheus +The instructions below provide guidelines on how to get started with the pre-built Docker container, build the Morpheus Docker container yourself, or build Morpheus from source. -#### Prerequisites +### Prerequisites - Pascal architecture or better - NVIDIA driver `450.80.02` or higher @@ -37,7 +27,7 @@ If `Git LFS` is not installed before cloning the repository, the large files wil git lfs install ``` -#### Clone the Repository +### Clone the Repository ```bash MORPHEUS_ROOT=$(pwd)/morpheus @@ -51,30 +41,41 @@ cd $MORPHEUS_ROOT git lfs pull ``` -#### Pre-built `runtime` Docker Image +#### Using the Pre-built `runtime` Docker Image -Pre-built Morpheus Docker images can be downloaded from NGC. See [here](docs/source/morpheus_quickstart_guide.md#set-up-ngc-api-key-and-install-ngc-registry-cli) for details on accessing NGC. The `runtime` image includes pre-installed Morpheus and dependencies: +Pre-built Morpheus Docker images can be downloaded from NGC. See [here](docs/source/morpheus_quickstart_guide.md#set-up-ngc-api-key-and-install-ngc-registry-cli) for details on accessing NGC. The `runtime` image includes Morpheus pre-built and its dependencies: ```bash -docker pull nvcr.io/nvidia/morpheus/morpheus:22.06-runtime +docker pull nvcr.io/nvidia/morpheus/morpheus:-runtime ``` +where `` refers to the build of Morpheus you want. For example, if you want release 22.04, use the command: -Run the pre-built `runtime` container: +```bash +docker pull nvcr.io/nvidia/morpheus/morpheus:22.04-runtime +``` + +You can then run the pre-built `runtime` container using the provided script: ```bash -DOCKER_IMAGE_TAG=22.06-runtime ./docker/run_container_release.sh +DOCKER_IMAGE_TAG=-runtime ./docker/run_container_release.sh ``` +Again replacing `` with the appropriate release number. For v22.04, it becomes: -#### Manually Build `runtime` Docker Image +```bash +DOCKER_IMAGE_TAG=22.04-runtime ./docker/run_container_release.sh +``` + +#### Manually Build the `runtime` Docker Image The Morpheus `runtime` image can also be built manually. This allows you to use a Morpheus build from the development branch or another branch/tag. To manually build the `runtime` image, run the following from the repo's root: -#### Building Locally (Outside a Container) +#### Build Locally (Outside a Container) To build Morpheus outside a container, all the necessary dependencies will need to be installed locally or in a virtual environment. Due to the increased complexity of installing outside of a container, this section has been moved to [`CONTRIBUTING.md`](CONTRIBUTING.md). Please see the "Build in a Conda Environment" section for more information. Note: Once `morpheus` CLI is installed, shell command completion can be installed with: + ```bash ./docker/build_container_release.sh ``` @@ -85,6 +86,11 @@ Run the manually built `runtime` container: ```bash ./docker/run_container_release.sh ``` +You can specify the specific image version by passing the script the `DOCKER_IMAGE_TAG` variable: + +```bash +DOCKER_IMAGE_TAG= ./docker/run_container_release.sh +``` #### Build from Source @@ -99,44 +105,52 @@ Depending on your configuration, it may be necessary to start additional service - See the Quick Launch Kafka section. - `inf-triton` - Requires a running Triton server - - See the launching Triton section. + - See the Launching Triton Server section. -### Quick-Launch Kafka Cluster +### Quick Launch Kafka Cluster Launching a full production Kafka cluster is outside the scope of this project. However, if a quick cluster is needed for testing or development, one can be quickly launched via Docker Compose. The following commands outline that process. See [this](https://medium.com/big-data-engineering/hello-kafka-world-the-complete-guide-to-kafka-with-docker-and-python-f788e2588cfc) guide for more in-depth information: 1. Install `docker-compose` if not already installed: + ```bash conda install -c conda-forge docker-compose ``` 2. Clone the `kafka-docker` repo from the Morpheus repo root: + ```bash git clone https://github.com/wurstmeister/kafka-docker.git ``` 3. Change directory to `kafka-docker`: + ```bash cd kafka-docker ``` 4. Export the IP address of your Docker `bridge` network: + ```bash export KAFKA_ADVERTISED_HOST_NAME=$(docker network inspect bridge | jq -r '.[0].IPAM.Config[0].Gateway') ``` 5. Update the `kafka-docker/docker-compose.yml` so the environment variable `KAFKA_ADVERTISED_HOST_NAME` matches the previous step. For example, the line should look like: + ```yml environment: KAFKA_ADVERTISED_HOST_NAME: 172.17.0.1 ``` Which should match the value of `$KAFKA_ADVERTISED_HOST_NAME` from the previous step: + ```bash $ echo $KAFKA_ADVERTISED_HOST_NAME "172.17.0.1" ``` 6. Launch kafka with 3 instances: + ```bash docker-compose up -d --scale kafka=3 ``` In practice, 3 instances has been shown to work well. Use as many instances as required. Keep in mind each instance takes about 1 Gb of memory. 7. Create the topic: + ```bash ./start-kafka-shell.sh $KAFKA_ADVERTISED_HOST_NAME $KAFKA_HOME/bin/kafka-topics.sh --create --topic=$MY_INPUT_TOPIC_NAME --bootstrap-server `broker-list.sh` @@ -156,6 +170,7 @@ Launching a full production Kafka cluster is outside the scope of this project. ``` In order for this to work, your input file must be accessible from `$PWD`. 2. You can view the messages with: + ```bash ./start-kafka-shell.sh $KAFKA_ADVERTISED_HOST_NAME $KAFKA_HOME/bin/kafka-console-consumer.sh --topic=$MY_TOPIC --bootstrap-server `broker-list.sh` @@ -164,6 +179,7 @@ Launching a full production Kafka cluster is outside the scope of this project. ### Launching Triton Server To launch Triton server, use the following command: + ```bash docker run --rm -ti --gpus=all -p8000:8000 -p8001:8001 -p8002:8002 -v $PWD/models:/models \ nvcr.io/nvidia/tritonserver:21.12-py3 \ From a575067700bcd5d63baadfc6b1e3764ed12485a4 Mon Sep 17 00:00:00 2001 From: Pete MacKinnon Date: Tue, 10 May 2022 19:37:24 -0400 Subject: [PATCH 17/73] Update hammah-inference.py (#90) Looks like a duplicated line. Authors: - Pete MacKinnon (https://github.com/pdmack) Approvers: - https://github.com/gbatmaz - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/NVIDIA/Morpheus/pull/90 --- .../hammah-models/hammah-inference.py | 1 - 1 file changed, 1 deletion(-) diff --git a/models/validation-inference-scripts/hammah-models/hammah-inference.py b/models/validation-inference-scripts/hammah-models/hammah-inference.py index b9f63ed898..4e887c6051 100644 --- a/models/validation-inference-scripts/hammah-models/hammah-inference.py +++ b/models/validation-inference-scripts/hammah-models/hammah-inference.py @@ -70,7 +70,6 @@ def back_to_string(obj): scores = model.get_anomaly_score(X_val) X_val['ae_anomaly_score'] = scores - X_val['ae_anomaly_score'] = scores X_val.sort_values('ae_anomaly_score', ascending=False).head(10) #since inference is done, add the original columns back so the output will be the same as the input format #X_val['ts_anomaly']=X_val_original['ts_anomaly'] From 13d05274763cd1934e4c97d8ea6e63613d848810 Mon Sep 17 00:00:00 2001 From: Eli Fajardo Date: Thu, 12 May 2022 19:59:44 -0400 Subject: [PATCH 18/73] Apply enterprise sphinx html theme to docs (#97) Apply HTML theme from `Enterprise Docs` so we don't have to switch theme for every release. Screen Shot 2022-05-09 at 5 17 25 PM Authors: - Eli Fajardo (https://github.com/efajardo-nv) Approvers: - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/NVIDIA/Morpheus/pull/97 --- docs/source/_static/main_nv_logo_square.png | Bin 0 -> 11074 bytes docs/source/_static/omni-style.css | 308 ++++++++++++++++++++ docs/source/conf.py | 9 +- 3 files changed, 316 insertions(+), 1 deletion(-) create mode 100644 docs/source/_static/main_nv_logo_square.png create mode 100644 docs/source/_static/omni-style.css diff --git a/docs/source/_static/main_nv_logo_square.png b/docs/source/_static/main_nv_logo_square.png new file mode 100644 index 0000000000000000000000000000000000000000..37443aff511ec3743a2b52e51547214ab5a5000a GIT binary patch literal 11074 zcmdUVcT`jBwl7u?5CQ2(F-SLb2qYAx7wJJdNC^-i2_@7}6hSEhD!p$?r~=YENN*y& zLjVy(dhg}MefHV!-gnO}6XA$-1$#;X{^SeBAOF704`BV11nnRNc=}r)tAV-}s~pM& z#tPyS1X>9Q2(W@A_$&o%#4TYGk6DETgar8oh4=-;fr1iXK|!#P5bIwr0A8GnwGCKD zUhyws_%kVh9UAQf=I8hD@Zj?h=0myI@(W5xNbm~?@e2t7@f1K;FC^N+6Nq$W`zHr^ zn5&fw+zAawAz6QOw6H|Ep``$LRsUfF!s&0eNY}sog!dS~r-c*0AfLc*oBkxUw)&gS z$<4*_PvO>9{4hrt0)|Ap;%No{rggGIp;4}OsQ-lZ-#`C50eIi4tN$(IU+RKD{4K&2 zt>BI~<1dH&OKMlBmlKR%2j+@$bFqRcxZ~Ai`)!RASk47zfkwGNQ7FfMMoR0SDzgd+ z^9iwX>BEuMC=XZee{%y&-U1Di0^p-21QZYk3W`GoKwwc3un-7{KM)Z32dO&B8gAqD zFG)qgqW_*0j~QzVw8ei*Y;6U$LAf9-@CL&X7Pc^cC!{Ta^=~(VALAs(XkXA4ic_{$iWe} z5m6CK0dbIkHRv~*{{#qF8SaV?o!4Lap$l{V>&Ow#`X?s97FNHpE(Ngq9b}j_;IGT@ zf8me+k>tPb_ppQEnf@2S|A%x}lnvU$!Ugu!7Vo?N7F_)Qnewg{?*Fyw|Fcm3L#KbK z`o9I^|Bvc_xy8!P0%;4wS5AJwZ)5m>mzaM9h5!GJ*Pp-rn{xC|a(s>ZefW2E#h?6L zpJ7NmYZrX=?e}{SNI<~Oq9Xqk>N&MBd&iRsRtehPT=iAA-B^cQlkHNRIMRDUaZTxo z_HBiIZ&Ta-{C@E;aN0Pc1LE2s4kmv0E|eq`Km-U_CjyWY87p_G%63hiU8byd4E)O9 z3?x6i>W}Ay<`)z|+)k5^3afCGM1MAm|CJx}41hLcCk3vG?|y6OfsPb+o#5s}f&g*?@<0M2S%PYz0f=|dod#Qbsm3d*>ydM^Psm%?f4F#Bs|vDh zi$8Fj(H^*?Ap5~Uc|!P@FS2*Z88W%WTm=%Lh$WJ(RwfQNVC23V8Q1xUH#3S#C+OH* zlf~Yl6taN~6;y2NiY6`040*q5X~M;`@*f^t`bE!xABWN%WlQLgTn=H66L^+zba;wvfUcxC!y)i$;Qgh|{eoLxdpez;>y$Uy8ON$pF5H4mPH+CM@cmL|N8 z5KXTihdN-37cq$-BAym27=6&fg`%R(UE&<*FBfk+5+ukdl1O%24hRm7%E&v#y>4au zP9>}O1e@L3;djExhsxXv5FMX9EGo<_-Zt>U1+H9+I>?hSvVWpOr&|pW1Q4OnP+J=H zL0XM5-AR>EjwP<7Nw3Bcs?;+LK{m=e3Y6(4K(dtEa*CO5drbwEzB+Q;&LivcJylfa z&+ku#jSKh$nnkZzFAdP|+(1QyKYOo>D>I&rj+;`G$K#$nBszTy8TrM=g@J*o&=&E= zrY^l1H)cnxHaVx0U|&^TsK^O~e<~4y8a_ru@O40oUo9+dseEImP?4E_R@8fS1kG)i zDJ(EQ-GBIiv@0;q_*tpTkL0#jx>lmvI(3sUNB3h(&6Ngut!E{iwsao`MpknrkdNo) zj9h25^ldT-tjc1i@5iN|&eF?XkzbSRqUpNgxeo6g*LAt zB{>O=E}aURhS7;bGVe-x3nSkE0=B`lG(aX%5Pag@@n^e)(H|mJ;`P|&nmJYLcThf| zDzIv$C^K%#6Rod14Clo#1OB*f5m+B5H0a)vVf|qzbbUdaO2cg_n{B#((-iZ@QoN0i z>AZ1av-_?=ZuftNe zC-vhFM@1Hnlws{LF8lZAY`dnenOpLc9zvR8AR*Fsl)=f;dl zzcIt}bw^eEVP)01Dux2m93E(N_hAPr4jO$iL%HsJu#{cJA|>E%HWW=byk!5OZ$-9% z<*BFdNLp$4y{x+_%u3Bq5cPXczi)VG+qaDjO&|L$73o!&Zf&FMB%{UJM>x9rZ;vfD5qUHfFe~ALGM^?(a^C!wo}ZL&90DM(}tMO;iyv&y_4ojiKZ<%!{}Ly z=xluu1ukGE9?=g~3Wct*NC%vM(U0Rzj=0PMLP!u2U7B(9 zK6uRA*s7vp>0RN*r*I)=gnB-Cx1ObHVYzQ;$IF=&Ylvx};f>a_$dC-yPb6kLl_S%K zg^>F+Y-;@^u3)}}6Ouc6^VsZ*xs>K~7iYJ7+uBOXIWn<=*4~o0ZeXj)Hh9yYU}K=M zbdAToAy#!swWXqZ@sHB0z}U3sX+`h)q0^5ym-=Jq7!V^anM4+J52?$01VZ=}V+V|f z3zXxgWF7;|HV?^4?>vJszk+gSDC5qbj;=PPS?d!acQeZK?q$~{^SzyQ_lA_Xq%9O}R3!F{KT264 zI>wGm}Y2oHSZMYRzlu#cHSLDb18RfB8W;DW?7{fh<*F<_zk zq+7*Tghkpv>oQtmg6tC}r#^2?=&VLM+G>M_w$@%N!t4eYx4OZ5m!D~;_JAxKbJ{TT zn>|$PkjmZB#e%CN>lIk4#4vNtU>RX2)F_p3~Jk#%yIgzzU7@uhu` zNG9=`V)hA|eRz-IRgBy8{e+N)Q7X^qK1sh6UaI$$5*VH|F_^s@@?0NA>+$aTG1Pf_ zq0n|w2bg$e#wYt_uc5 zSuQty%pC5WjJn2jPs{wK*q8y%Z=E&9{aoRbfw(tvsQzaezPE^lO(QKFH0EB2yWc51iKDQ3ar0C|p?qZe@}#YK z7<=C70sUxsxaEDsNC6kE%QK@s4Y$^8A4qx;8D^NalQ)qSbKv2jLK0zdx;&oY(}Kt(pM2ibjamkRk1fDsK_D zz%*&+uBs%7nR8mhWu$}_VwBn!3L{|}m`ANPZZ*{@$IPz`zL_P;Qy3Vwuso_+%-Fhe zK)O`M@_aq?gNj`X4O9)!+I5;%;%7EKdrprfxzatUrJMX>Yzb$=XK}+5&`PYhY717T z%1J4~h3Tp!A(hMZMRm?%i2Nye`WOdwGFGNSXNP`$!L|SxEpSE_nMLKh^Yh+^JN&qC z=_QM+5^Y`PXTlW{-#jEwDMEAqp!(#w!^KXHdmCBDdD1xU5)Hn?{^V)^E2qn0EB098 z;ONXhyYhj5PT1SKjP~=|DJs;z;vrF&uFlf8Z1vsGlB#-p{g7Bq@+;lo^&hm)<7C-V z_s(!5$D}*k4GwGl$wFaRar0NK^~BH^x*fZ}RF8IdDr{B6^?e@~GAgWxdpxA+4n zzrBf@_|-C#s_M>p^PbZ425oy$H|dBGkU%)k=sVfj^SHCYDEFbj_d>#H>oJL$u&uTs z=T7=J4d{4P^Pbg*l}?>yh9Q#-b=3GI+~#r0ZZWAp`Sgr?8Ti$N%)_zvqYKHA{(|%F zouljt;QCj=ONGa5HpSXThx_TK1sdi9sRN2!?1xMY5_?q%51;G4RolcgTm|0BTR(W4 z`f|$fk1>_1Pr112Po=Hzt0J)&jaQ_^zb{k~Q0b69EYKmf|Se^K9Cs zbBBw{ETWb*-Cvr0gkq`McJecTzQtYTrHnz>`!$jF5Qn+4WsxeDpzmH2Up*@^*_goV zVa*b|hk?SejPn(&RQQ=BVGjWUc?0 zAIace2reAhMn~z8sPfoyJXT(a*s}*CW)I;N$$MPH@gYa-y`!@a-apz`^fU6C$lRi) zQ6FVAUUx)sa$eUnQjx1zO6epUd$7o&%o;1?>NjV*n;}xx+|2lDedd7+#RkH(#*m(a zA|xojk?N@@JHo&vKW~g@3DT#2V1b*6Z*29dRq;RmTzeR(T|{}p(&!$>n;vKLy@8u{ z5DI(EC-juUv4_;HI;%8mqwq@d2@6X-FMj4ZGwY`p1r3g@GDUu)eMMXmzk5jNFS%QF zOQz7b?p~J%YmxatrQdfnH}|xM2(CotsO<=LL_-g3L9s zc7#FsV^Jl{eBEuO&Ni3krz;joWYGlN8qe#U_Ro%Zy;zhreenrA*|f$M6ZXj_wfpfz zsC%vO|`zf)*>B&RpYUyh-I_t8p-%C?jt2*y2zhT#; ziMt$WsnhWMbY4VT+WAeb)OdEL2x|UFcRD6uwM;*<_@qhb^4pNBuXaG9l_If1S#!dK zac21YAwpu59K~-P9_2^Uw;q(flTDfZP8M$+PPREgO3fa{2D#2@C@eOK-%uvz==cnJ zbdC+(Yqv0|t?hpwyqftYR=ARcSa$Af3$ZAM?{aTk)8|A6yDWA|v2ZKOlBPZ}%8YzD zB_Y)R4GI>YmEKbSBky|}2+eJ?(w;gq?lOONJ3%!$xsZZ5XeJup$jQxk(Ax*}4D=NI zKXK+kluV*m-=OghYBzqO;rSIh1V6*WV!6T3^5pYEhM>*zQtT|m3a1)DOP>>Va1L8u z*EQ!;lA`cL)w&qFp#k>oXP{)m!>Q1XMqZdEKlCF8)cyYO50E98f8vQ{kW_2rOfG_T6K~qeT&xU7J&PtB* zwYV4%f*Eo^&r0x6+PTRPNU)L z7Vhwy(N58GSuWc60u0d~)j@`6JkMv#qNE@7mdy!IVOn$y$Cg$f9BTqAI>R3(A`*gX z@$-^)IbO_DzkC$JcG-}9A`v*@57_?5 zD9!7)$#ORJtmq5xzU1{9#r3*tBrq9VQ8f3xtnkDnWq6;xQ|&a0f5D=dx~N#7NyIg- zcsDCM5&G?Op;AHT$nwfQ<=c_VsX^DM+?`)ZoS{HFud^2;mZAN9EKsCpae!%|aRw#z zFtZAOBEwo82?1yrK%^aE=Ax%W%9n$m(aKRnW>=B?`C_dHySUeE5u0{D4&$nmQ?2R} zxfbDUFy{pOgk)z7>f}3OOYn{2S)}>+$ubjm!?W{F^#t#d-0c_31he?I`3xf>%&xTd zxq74VF#mlHzfvA`9Bq~FcIQW?v~l;Ha!Ae?HCYOU|54Z^eGtxPbGg_}I|4w&ugiIN zG<1>;Fd1_DVwvsWz(=vI$5l~bkYdjJjqSFoYsy9rYE^^DK9f>JQX`uzO6R6djGbet zt|!{Lw6)9AYcP6(zNxz&Zeg!e+3{;z>;7P?N0i*$SM6+$&P4xc|MRN|QD}VK(Z{me zN?MmJ9v&YJS_TN^gS#mx0%`B*GP`$=UwI6{J=8HGuUB<)h8O+kgu#f$4q;*-YZ zG7F@R8x!Ey8@hT|jfcVE@hk@0J(;+(7q!Q^GU)}LN=}_W624V_r}(9y2Ya74Pwy`$ z!sM!Ly_c4Pdl$PsqG7!g`9fKr=?sgnEljqut!gCX@l_a_Km~QEN^)+BTJ~TDyYu6z z6g-n>Jdi1=-6C`&p(2N*fqfh9-W<53kBJ2ryZ)**i)t6z3r4;p0#{3Z zmU-`0O(M67{=m`G^s5`MW^=GZR+rA_HNOSs%D!QG$)OjF-|K0Z8$q4qo?351j^D(l zvWV?Q$h*Js32(DUCmKP%nv)W>6!fNwx`kJaL9PZkrPUC~ow~HJ_YFCmOpU)zYL#%@ z6DRGzwqo@Ht93sr1IiPV-|2O6Bu69^4yy)9Me@^Xlc(mDKbY~fIa;kHk-EaAw&kWn z(25WA>Z1emHf)iuL|Xm;qGCUoOx5|trEgj4HwJO`*r^xSGDY&WtNvLI0Ct*6Lh}J>yQGgvC6iCRmb1@>-}JrXpTt$8 zF6i^AFO&*A{c3b@_np)nx3~%ORk>H`dfWjIgUVl~pnBBlt9P}gccl6{JwTu__nbKe zrf;~Ca;MTp{SO-0D6k`+dz@sWZJRmuQ_s6or5V4+tl#@RwuC{YAXx_))Mmrwd&G!# z5@MjdIwP;-ZcJ>bTp{OSIg~|MWZY1J(%myro@4hoJY?tAqjmvNBBtm14zHueBz56M zQWp7KNG$NUr=0{lqN;Q1K*G^seU~`$nHEt!?PXe1r$Eb=YODDlgg-Qc6UqfdmuBcC zQ;W1iRp$Ec{8B2Igd^R?9tdmg>7-Newmxc9xj%WPV_*vH(+PsxmFl`<(e{p&9++aT zE$q*?+69rjX6R6zN0xST_=)06AuT_px6+3@#l&Y#5IIrXL8^;f36&7v5p?t!2km~- za6_vf@+FC0{D&Qv9)+{9@uTBUsz0j68cJ)Yl`|meAs?qRz*|a#t_Ec{!(A3u@f~%N4r4GPKuX zIjqN%B0ql@QxL*qt&a)9gOm|K#eUu};2x+sN?;$yTIAtk!n>`uvB*7|GO$$CuiO#W_5j`S*yGOal6 z+{~NU@Q8r*t&1nkQL!vzV=p`mOgF~o!`Nj*Odjcn zaMwb?C14Z$`YZ>(JzOJZlsy*0{pQyzBxu@q)y0!*(M!_Ljicq>Q=*6QMoh3X<5FAmE{8)`xB4(=E?*1)06?^Ds(*<01r?>HvI^RSobBGjG}RzHpY zrX&v1xh3b8w;f02Uevr|gW_H+trKLE3Lxium|m4nRb8*^Z8>zp$hfI+?Ir8YC*;=& zrUF4WW!p3FGRM6aX{5^W$+R~?O-%QOLU7y%*b+P;-o~<@L3X?TmVO|VZz!iA(6l=H zh=kv$SAMn{@b|4Y`w(eZKNy3EzXi>TD{#?*$sTzNo91b#BTXOND?Vhalk zec8(I>Ewy*uepFz_Cp_#y`3%K-6Ck<^LD@L^WF+?77-CKcx=kRmOsAsdV>y;UsM!v zNL(_$dD;{zTln1naMJeVrvLo8`}TZup>Y**vNQ-I2{bBSNw7^# z|GZ3>IXCh9Vb4=@ap$i3tjaM$;^4L73QRRhx&c%>N05ZYj|F8VE#(% za>}8&VY`K7BVCrUyRYx=MeT}HPKpRaI2A4?CWf7z9a4W?TKYVkL3DLkQ|2J@e&~Z! zljBVF!fAYCqXGlR`@x)LF5^Oa~~ zJ(z;cb3Df?Wk`9&)cf+}rxy#vZ5294jQ^v+{?jj}3o-g;@VQ{w^gn`EJ9tZt3hO+! zQf2(5+o`uU)sw`+k6wAqy6NlVw#Uu=rS{1N$_O#5jKg=GVZOnd7aH1^^wK`ZKhyjh zt-C3)I+Kk)bB(@)WDn+xG%1wV-cGPG`7d^aFY@sNf!OG^vxEpJE&wkR9+uE4+pr?fS;E(R8JmfPKm0!&WoJ%h-BqSt# zJUw)Ovu>+{B8YW80GrqQ1JRt`BV7(>JGyuunHp+}&Di+q+E}_4V~0 zbG~tjaZ;tCrv!-*52XHBRw#&%k4%Xw;4>uE_i!>ko^GyR=JI%PFjL7Za{be%PcMw) zMc|Yk7J7Q4V}-^T>wCt=#=ck~Za%(jo~j19nDM|n_i2DeBW#)}X=(k1<#}fFjUo+Z zGQOwi2O83#%?HBN)YPc@o!eCn@=JixDBrWgC10qlY|A@(VVvI?;&jqlNc-+&jwTDT zATq*{m|(MYad9zEs>AehqiRlPd%tUKsvLfQBfZ$shEB2Y`EV2&v!v%jOOV_f(goix zwn)j{%d@Sj@^X_Oy1E~_H=Mop`aqc(8M$C018F>N@z^R3GaYk64BJ;k->>#XL)_Pi z4#~kzX_!rkoZ;^2nxk&cv~o=WF<1{3ZnW`yxA%oQ2M(d*wcKRXbeQ$)i3(tYo9N1b^cR^aIK{NV9XdY+dY7_k(Y1lj^ez*tfQ|_%fzJKr_s}K zt;wavB%QIJOR3l&@PTWh_?;pfQ?dWWnz@&MQc_ZZPM(hpYOb-NwDe=0hPF0^p2^G- zRe62I%C{5 zB?1BTIQjDG1~(6%O)m+}<9R-lMxUCkx757Po&42)(as7JwP;W9l&l93QVVtOf-ME@*z<^K+VDJ5vmu8_K*pyt(fLuJ@`R3(ec5l6m zzon4v-?13`WO&I&?}N9CH>&%`SxsYO>i73&Um#ocWfvp70py+$g~XFOH;!US3e1|J1fmADq2?GvahJcFlNyRRrPn+l=+_TbY7}SpRTZNS`pr5 zXoH}yJtg{y_Ld6lr#1I!#@L-kn)h~f%}Y&<6`5iZ%&E2vuYFJ+*?1>{FEN{5+NVwu zp4)$1ePn{TM@L8B{G=#)i(T&K!$7c^lxej&UxkmS>+AdsiZ938H1N1+ zf8a*iwA5^^u+wL4p=Rii(wl4^cpdPv0BR zl$4a!BpdD++G1+bfdc*Fko%l2jJ5Ujm-yA-w#@8}?76ni$` zP;S{4Off?p5H8)2)%DHPW466-d*pl(v9dW^7gvRfb%6&DSB^`~FcjM2 zOM7}rNr}`}MV!4=XM|~kw;LXgperq)YQpwz&Qs)ffV#T+Y*#l!__BV}DYb`}s%lR! zf74ecu_y5NRcE$8x<0(VeRs8)f&{-x(Z&Nyfl3s0J@$-}b<3G$eWru`;H}L0t0SLz ze2UafkSy^}uudlk+nO0jbqE~Ixc1*=4CGS6diF)f%(bvvp;Q4w@wN%RnAz6xt;L2({ZM{q^3qfQgX&WT{hiwx0|!( z2F%FFsPXFZOs#~GG9)lxe(sSrlzfOxUO^$85wwZJZ1wf_F8T(yE*O;A^aV+4D=OaJ zO6W(9cjI-~8^Wql1P=J-XryEiM?omP@%3hAY_Q0*&h7%wFHL21bI&}$J+}ez8TY~CaK4dAHR60(AaMIYhUbefAEXx@tXOS_hcz-7NU!f)*dwn zh{!9l3t!#coQXR~6kcg-X$>446h2>5<8MHxyOQIZEN=KUs_|qQpZZ>!3YALS>7y&H zfO&nqmw9-2rpjzJ&pzTBFiCyO`T0CIAEHOI)sskX-_U!VuAg~hZTDXEf(bNA*GKz5VR8i?(D{k@& zkuDn$bZy`U0uQcO@7dtHE~jQ{{ddgt#DwS3tcOQ2eFsGM{^&%#9Ij@p*t{R}@M?Xs z%s0o2+5gzQzmI$DQ1Qpm4a)Sv(&Y0%xeD&(_QMHVO3N>xCJ$ z_D1!WIyyU1v$di!GIJnJ_~%JQ{3Aj}E`f*#60&Y_SI(MBC-_7G`#v6x-5=C=i@~6- zT|AqoX^(|S0~I!C zm-Plod&O1moUd$UWpy!UJa@L3RA$>73&fXKgHmf1Z|_rlX<+f$ZeEknoFPik!s^_T zzXi;aD;xHb{-wP?@sc$w?boY^WWM(IZ_n7aTzUO^m6A$xq&`69#7}&h({7o5yzdW~ zYSmy=p +{ + color: var(--sidebar-text-color); + font-size: var(--body-font-size); + line-height: var(--body-line-height); +} + +/* cell text */ +html.writer-html5 .rst-content table.docutils td>p, +html.writer-html5 .rst-content table.docutils th>p +{ + font-size: var(--body-font-size); + line-height: var(--body-line-height); +} + +/* remove weird top margin in first paragraph of a cell */ +.wy-table td p:first-child, +.rst-content table.docutils td p:first-child, +.rst-content table.field-list td p:first-child, +.wy-table th p:first-child, +.rst-content table.docutils th p:first-child, +.rst-content table.field-list th p:first-child +{ + margin-top: 0px; +} + +/* remove weird bottom margin in last paragraph of a cell */ +.wy-table td p:last-child, +.rst-content table.docutils td p:last-child, +.rst-content table.field-list td p:last-child, +.wy-table th p:last-child, +.rst-content table.docutils th p:last-child, +.rst-content table.field-list th p:last-child +{ + margin-bottom: 0px; +} + +/* Sidebar */ +.wy-nav-side +{ + color: var(--sidebar-headline-color); + background: var(--sidebar-color); +} + +.wy-menu-vertical p.caption +{ + /* line wrap */ + white-space: normal !important; + vertical-align: top; + min-height: 100%; + height: 100%; + padding-top: 5px; + padding-bottom: 5px; + line-height: var(--body-line-height); + color: var(--sidebar-headline-color); + background-color: var(--sidebar-alt-color); +} + +.wy-side-nav-search>a img.logo, .wy-side-nav-search .wy-dropdown>a img.logo +{ + margin: 0px 0px 0px 0px; + padding: 0px +} + +.wy-nav-content +{ + margin: 0; + min-height: 100%; + height: 100%; + background: #fdfdfd; +} + +.wy-menu-vertical a +{ + color: var(--sidebar-text-color); + padding-left: 35px; + padding-right: 10px; + padding-top: 5px; + padding-bottom: 5px; +} + +/* Remove padding around logo */ + +.wy-side-nav-search>a { + padding: 0px; +} + +/* Math should inherit its color */ + +span[id*=MathJax-Span] { + color: inherit; +} + +/* Section title on main page has math and needs a bit more padding */ +#mathrm-co-2-2-omniverse-carbonite-sdk h1:first-of-type { + padding: 5px; +} diff --git a/docs/source/conf.py b/docs/source/conf.py index bd3cd9ef8f..a4443d4b49 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -151,8 +151,14 @@ # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. -# + +html_logo = '_static/main_nv_logo_square.png' + html_theme_options = { + 'logo_only': True, + 'display_version': True, + 'style_nav_header_background': '#000000', + # Toc options 'collapse_navigation': False, 'navigation_depth': 6, } @@ -236,6 +242,7 @@ def setup(app): + app.add_css_file('omni-style.css') app.add_css_file('copybutton.css') app.add_css_file('infoboxes.css') app.add_css_file('params.css') From 34b28251f1667a1220c62ddadd8fa167bd1eadff Mon Sep 17 00:00:00 2001 From: Michael Demoret <42954918+mdemoret-nv@users.noreply.github.com> Date: Thu, 12 May 2022 18:18:23 -0600 Subject: [PATCH 19/73] Add pybind11/cython stubs to Morpheus package (#100) This MR allows python classes created in C++ to show up in IDEs and work with linters. It works by using pybind11-stubgen to create .pyi files that are then included in the package. The result is this: ![image](https://user-images.githubusercontent.com/42954918/167733517-86305e60-2ed4-4a4b-96e8-45e67617c569.png) Only downside is the pybind11-stubgen isnt too actively maintained (but its also not complex). And the option for generating the output location is limited. So in our output we get: ``` common/ __init__.pyi cudf_helpers/ __init__.pyi messages/ __init__.pyi stages/ __init__.pyi common.so cudf_helpers.so messages.so stages.so ``` It would be better to be organized like the following: ``` common.pyi common.so cudf_helpers.pyi cudf_helpers.so messages.pyi messages.so stages.pyi stages.so ``` The only alternative is to use mypy. However, they dont support docstrings according to this issue: https://github.com/python/mypy/issues/11965 Closes #99 Authors: - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - David Gardner (https://github.com/dagardner-nv) - Devin Robison (https://github.com/drobison00) - Bartley Richardson (https://github.com/BartleyR) URL: https://github.com/NVIDIA/Morpheus/pull/100 --- .gitignore | 3 + CMakeLists.txt | 2 + morpheus/_lib/CMakeLists.txt | 5 ++ morpheus/_lib/src/python_modules/stages.cpp | 3 +- .../cmake/utils/python_module_tools.cmake | 87 ++++++++++++++++--- morpheus/py.typed | 0 setup.py | 14 +-- 7 files changed, 91 insertions(+), 23 deletions(-) create mode 100644 morpheus/py.typed diff --git a/.gitignore b/.gitignore index 86d062a581..00d27b36c0 100755 --- a/.gitignore +++ b/.gitignore @@ -196,6 +196,9 @@ mlruns/* /conda-build/ .conda-bld +# Ignore generated pyi files for pybind and cython modules +morpheus/_lib/**/*.pyi + # Explicitly ignore .vscode/settings.json and .vscode/launch.json. Shared settings should go in morpheus.code-workspace # and user settings will go in .vscode/launch.json and .vscode/settings.json .vscode/settings.json diff --git a/CMakeLists.txt b/CMakeLists.txt index 86c8f2c681..de73768d02 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,6 +85,7 @@ file(GLOB_RECURSE MORPHEUS_PYTHON_FILES LIST_DIRECTORIES FALSE CONFIGURE_DEPENDS "morpheus/*.py" + "morpheus/py.typed" ) set(MORPHEUS_ROOT_PYTHON_FILES @@ -132,6 +133,7 @@ install( COMPONENT Wheel FILES_MATCHING PATTERN "*.py" + PATTERN "py.typed" ) diff --git a/morpheus/_lib/CMakeLists.txt b/morpheus/_lib/CMakeLists.txt index 276d8d1d7a..6694d152cc 100644 --- a/morpheus/_lib/CMakeLists.txt +++ b/morpheus/_lib/CMakeLists.txt @@ -27,6 +27,11 @@ file(RELATIVE_PATH install_relative ${MORPHEUS_PY_ROOT} ${CMAKE_CURRENT_SOURCE_D set(MORPHEUS_LIB_INSTALL_DIR "${MORPHEUS_PY_INSTALL_DIR}/${install_relative}") unset(install_relative) +# Must create a custom target to hold all python dependencies before first module call +add_custom_target(all_python_targets ALL + DEPENDS copy_python_source # depend on copying the source so the full python package is built with this target +) + #----------cuda_utils--------- include(cmake/libraries/cuda_utils.cmake) diff --git a/morpheus/_lib/src/python_modules/stages.cpp b/morpheus/_lib/src/python_modules/stages.cpp index f575a5ba76..25d44cf328 100644 --- a/morpheus/_lib/src/python_modules/stages.cpp +++ b/morpheus/_lib/src/python_modules/stages.cpp @@ -49,6 +49,7 @@ PYBIND11_MODULE(stages, m) neo::pyneo::import(m, "cupy"); neo::pyneo::import(m, "morpheus._lib.messages"); + neo::pyneo::import(m, "morpheus._lib.file_types"); py::class_>( m, "AddClassificationsStage", py::multiple_inheritance()) @@ -110,7 +111,7 @@ PYBIND11_MODULE(stages, m) py::arg("topic"), py::arg("batch_timeout_ms"), py::arg("config"), - py::arg("disable_commits") = false, + py::arg("disable_commits") = false, py::arg("disable_pre_filtering") = false); py::class_>( diff --git a/morpheus/cmake/utils/python_module_tools.cmake b/morpheus/cmake/utils/python_module_tools.cmake index 862efd3b87..86cbf5c623 100644 --- a/morpheus/cmake/utils/python_module_tools.cmake +++ b/morpheus/cmake/utils/python_module_tools.cmake @@ -16,13 +16,40 @@ function(inplace_build_copy TARGET_NAME INPLACE_DIR) message(STATUS " Inplace build: (${TARGET_NAME}) ${INPLACE_DIR}") + add_custom_command( - TARGET - ${TARGET_NAME} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy $ ${INPLACE_DIR} - COMMENT "Moving target ${TARGET_NAME} to ${INPLACE_DIR} for inplace build" + TARGET ${TARGET_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy $ ${INPLACE_DIR} + COMMENT "Moving target ${TARGET_NAME} to ${INPLACE_DIR} for inplace build" + ) + + # See if there are any resources associated with this target + get_target_property(target_resources ${TARGET_NAME} RESOURCE) + + if(target_resources) + + # Get the build and src locations + get_target_property(target_build_dir ${TARGET_NAME} BINARY_DIR) + + set(resource_outputs "") + + # Create the copy command for each resource + foreach(resource ${target_resources}) + add_custom_command( + OUTPUT ${INPLACE_DIR}/${resource} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${target_build_dir}/${resource} ${INPLACE_DIR}/${resource} + DEPENDS ${target_build_dir}/${resource} + COMMENT "Copying stub ${target_build_dir}/${resource} to ${INPLACE_DIR}/${resource}" + ) + list(APPEND resource_outputs ${INPLACE_DIR}/${resource}) + endforeach() + + # Final target to depend on the copied files + add_custom_target(${TARGET_NAME}-resource-inplace ALL + DEPENDS ${resource_outputs} ) + endif() + endfunction() #[=======================================================================[ @@ -111,6 +138,11 @@ macro(add_python_module MODULE_NAME) OUTPUT_RELATIVE_PATH SOURCE_RELATIVE_PATH ) + # Ensure the custom target all_python_targets has been created + if (NOT TARGET all_python_targets) + message(FATAL_ERROR "You must call `add_custom_target(all_python_targets)` before the first call to add_python_module") + endif() + # Create the module target if (PYMOD_IS_PYBIND11) message(STATUS "Adding Pybind11 Module: ${TARGET_NAME}") @@ -137,8 +169,8 @@ macro(add_python_module MODULE_NAME) endif() target_link_libraries(${TARGET_NAME} - PUBLIC - ${pymod_link_libs} + PUBLIC + ${pymod_link_libs} ) # Tell CMake to use relative paths in the build directory. This is necessary for relocatable packages @@ -159,16 +191,47 @@ macro(add_python_module MODULE_NAME) ) endif() + # Set all_python_targets to depend on this module. This ensures that all python targets have been built before any + # post build actions are taken. This is often necessary to allow post build actions that load the python modules to + # succeed + add_dependencies(all_python_targets ${TARGET_NAME}) + + # Before installing, create the custom command to generate the stubs + set(pybind11_stub_file "${MODULE_NAME}/__init__.pyi") + + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${pybind11_stub_file} + COMMAND ${Python3_EXECUTABLE} -m pybind11_stubgen ${TARGET_NAME} --no-setup-py --log-level WARN -o ./ --root-module-suffix \"\" + DEPENDS ${TARGET_NAME} all_python_targets + COMMENT "Building stub for python module ${TARGET_NAME}..." + WORKING_DIRECTORY ${PROJECT_BINARY_DIR} + ) + + # Add a custom target to ensure the stub generation runs + add_custom_target(${TARGET_NAME}-stubs ALL + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${pybind11_stub_file} + ) + + # Save the output as a target property + set_target_properties(${TARGET_NAME} PROPERTIES RESOURCE "${pybind11_stub_file}") + + unset(pybind11_stub_file) + if (PYMOD_INSTALL_DEST) message(STATUS " Install dest: (${TARGET_NAME}) ${PYMOD_INSTALL_DEST}") install( - TARGETS - ${TARGET_NAME} - EXPORT - ${PROJECT_NAME}-exports - LIBRARY DESTINATION + TARGETS + ${TARGET_NAME} + EXPORT + ${PROJECT_NAME}-exports + LIBRARY + DESTINATION "${PYMOD_INSTALL_DEST}" COMPONENT Wheel + RESOURCE + DESTINATION + "${PYMOD_INSTALL_DEST}/${MODULE_NAME}" + COMPONENT Wheel ) endif() diff --git a/morpheus/py.typed b/morpheus/py.typed new file mode 100644 index 0000000000..e69de29bb2 diff --git a/setup.py b/setup.py index 2eb511208e..61f9d9eb2d 100644 --- a/setup.py +++ b/setup.py @@ -25,29 +25,23 @@ description="Morpheus", classifiers=[ "Development Status :: 3 - Alpha", - - # Utilizes NVIDIA GPUs "Environment :: GPU :: NVIDIA CUDA", - - # Audience (TODO: (MDD) Audit these) "Intended Audience :: Developers", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Security", "Topic :: System :: Networking :: Monitoring", - - # License "License :: OSI Approved :: Apache Software License", - - # Only support Python 3.8+ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3 :: Only", ], author="NVIDIA Corporation", - packages=find_packages(include=["morpheus", "morpheus.*"], exclude=['tests']), - package_data={"": ["*.so"]}, include_package_data=True, + packages=find_packages(include=["morpheus", "morpheus.*"], exclude=['tests']), + package_data={ + "morpheus": ["*.so", "**/*.so", "py.typed", "*.pyi", "**/*.pyi", "**/**/*.pyi"], + }, install_requires=[ "click>=8", "datacompy", From 6b56c9ab090b972f577628c6264e32d020bee227 Mon Sep 17 00:00:00 2001 From: Michael Demoret <42954918+mdemoret-nv@users.noreply.github.com> Date: Thu, 12 May 2022 18:19:06 -0600 Subject: [PATCH 20/73] Reorganize the python package files (#98) This refactors all of the python package files to improve the directory structure, separate classes into their own files, improve readability and reduce merge conflicts. The main morpheus package will now be subdivided into the following submodules: ``` morpheus/ _lib/ io/ messages/ pipelines/ stages/ general/ inference/ input/ output/ postprocess/ preprocess utils/ ``` The largest differences are coming from separating the `morpheus/pipeline.py` into separate files and breaking all stages into their own package (resulting in quite a few new files). Remaining questions: - [x] How to handle package reloads for `morpheus.messages` - [ ] What to call utilities? `utils`? or `utilities`? Closes #98 Authors: - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - David Gardner (https://github.com/dagardner-nv) - Devin Robison (https://github.com/drobison00) - Bartley Richardson (https://github.com/BartleyR) URL: https://github.com/NVIDIA/Morpheus/pull/98 --- .../abp_pcap_preprocessing.py | 13 +- examples/abp_pcap_detection/run.py | 16 +- examples/gnn_fraud_detection_pipeline/run.py | 18 +- .../stages/classification_stage.py | 24 +- .../stages/graph_construction_stage.py | 22 +- .../stages/graph_sage_stage.py | 40 +- examples/log_parsing/inference.py | 22 +- examples/log_parsing/messages.py | 18 +- examples/log_parsing/postprocessing.py | 8 +- examples/log_parsing/preprocessing.py | 11 +- examples/log_parsing/run.py | 10 +- morpheus/cli.py | 54 +- morpheus/config.py | 8 +- morpheus/io/__init__.py | 16 + .../input/utils.py => io/deserializers.py} | 17 +- .../output/utils.py => io/serializers.py} | 0 .../{pipeline/file_types.py => io/utils.py} | 31 +- morpheus/messages/__init__.py | 56 ++ morpheus/messages/data_class_prop.py | 79 ++ morpheus/messages/message_base.py | 64 ++ morpheus/messages/message_meta.py | 64 ++ morpheus/messages/multi_ae_message.py | 48 + .../messages/multi_inference_ae_message.py | 96 ++ morpheus/messages/multi_inference_message.py | 351 +++++++ morpheus/messages/multi_message.py | 172 ++++ morpheus/messages/multi_response_message.py | 222 +++++ morpheus/pipeline/__init__.py | 21 +- morpheus/pipeline/general_stages.py | 757 --------------- morpheus/pipeline/linear_pipeline.py | 90 ++ morpheus/pipeline/messages.py | 855 ----------------- morpheus/pipeline/multi_message_stage.py | 71 ++ morpheus/pipeline/pipeline.py | 881 +----------------- morpheus/pipeline/preprocessing.py | 473 ---------- morpheus/pipeline/receiver.py | 148 +++ morpheus/pipeline/sender.py | 64 ++ morpheus/pipeline/single_output_source.py | 53 ++ morpheus/pipeline/single_port_stage.py | 98 ++ morpheus/pipeline/source_stage.py | 106 +++ morpheus/pipeline/stage.py | 57 ++ morpheus/pipeline/stream_pair.py | 20 + morpheus/pipeline/stream_wrapper.py | 400 ++++++++ morpheus/stages/__init__.py | 16 + morpheus/stages/general/__init__.py | 16 + morpheus/stages/general/buffer_stage.py | 66 ++ morpheus/stages/general/delay_stage.py | 66 ++ morpheus/stages/general/monitor_stage.py | 280 ++++++ morpheus/stages/general/trigger_stage.py | 69 ++ .../inference/__init__.py | 0 .../auto_encoder_inference_stage.py} | 94 +- .../inference/identity_inference_stage.py} | 14 +- .../inference/inference_stage.py | 12 +- .../inference/pytorch_inference_stage.py} | 14 +- .../inference/triton_inference_stage.py} | 18 +- .../{pipeline => stages}/input/__init__.py | 0 .../input/cloud_trail_source_stage.py} | 14 +- .../input/file_source_stage.py} | 12 +- .../input/kafka_source_stage.py} | 6 +- .../{pipeline => stages}/output/__init__.py | 0 .../output/write_to_file_stage.py} | 18 +- .../output/write_to_kafka_stage.py} | 10 +- .../postprocess/__init__.py | 0 .../postprocess/add_classifications_stage.py | 122 +++ .../stages/postprocess/add_scores_stage.py | 115 +++ .../postprocess/filter_detections_stage.py | 131 +++ .../postprocess/generate_viz_frames_stage.py} | 6 +- .../postprocess/ml_flow_drift_stage.py} | 8 +- .../postprocess/serialize_stage.py} | 8 +- .../postprocess/timeseries_stage.py} | 8 +- .../postprocess/validation_stage.py} | 10 +- .../preprocess/__init__.py | 0 .../stages/preprocess/deserialize_stage.py | 108 +++ morpheus/stages/preprocess/drop_null_stage.py | 81 ++ .../stages/preprocess/preprocess_ae_stage.py | 112 +++ .../preprocess/preprocess_base_stage.py | 81 ++ .../stages/preprocess/preprocess_fil_stage.py | 126 +++ .../stages/preprocess/preprocess_nlp_stage.py | 176 ++++ .../preprocess/train_ae_stage.py} | 155 +-- tests/benchmarks/static_message_source.py | 6 +- tests/benchmarks/test_bench_monitor_stage.py | 6 +- .../benchmarks/test_bench_serialize_stage.py | 6 +- tests/test_abp.py | 18 +- tests/test_add_classifications_stage.py | 2 +- tests/test_add_classifications_stage_pipe.py | 10 +- tests/test_add_scores_stage.py | 2 +- tests/test_add_scores_stage_pipe.py | 10 +- tests/test_cli.py | 46 +- tests/test_config.py | 2 - tests/test_file_in_out_stage_pipe.py | 8 +- tests/test_filter_detections_stage.py | 2 +- tests/test_filter_detections_stage_pipe.py | 10 +- tests/test_hammah.py | 37 +- tests/test_inference_stage.py | 6 +- tests/test_inference_worker.py | 2 +- tests/test_messages.py | 17 +- tests/test_monitor_stage.py | 34 +- tests/test_phishing.py | 18 +- tests/test_serialize_stage.py | 6 +- tests/test_serialize_stage_pipe.py | 14 +- tests/test_sid.py | 18 +- tests/test_trigger_stage.py | 2 +- tests/utils.py | 14 +- 101 files changed, 4289 insertions(+), 3553 deletions(-) create mode 100644 morpheus/io/__init__.py rename morpheus/{pipeline/input/utils.py => io/deserializers.py} (90%) rename morpheus/{pipeline/output/utils.py => io/serializers.py} (100%) rename morpheus/{pipeline/file_types.py => io/utils.py} (54%) create mode 100644 morpheus/messages/__init__.py create mode 100644 morpheus/messages/data_class_prop.py create mode 100644 morpheus/messages/message_base.py create mode 100644 morpheus/messages/message_meta.py create mode 100644 morpheus/messages/multi_ae_message.py create mode 100644 morpheus/messages/multi_inference_ae_message.py create mode 100644 morpheus/messages/multi_inference_message.py create mode 100644 morpheus/messages/multi_message.py create mode 100644 morpheus/messages/multi_response_message.py delete mode 100644 morpheus/pipeline/general_stages.py create mode 100644 morpheus/pipeline/linear_pipeline.py delete mode 100644 morpheus/pipeline/messages.py create mode 100644 morpheus/pipeline/multi_message_stage.py delete mode 100644 morpheus/pipeline/preprocessing.py create mode 100644 morpheus/pipeline/receiver.py create mode 100644 morpheus/pipeline/sender.py create mode 100644 morpheus/pipeline/single_output_source.py create mode 100644 morpheus/pipeline/single_port_stage.py create mode 100644 morpheus/pipeline/source_stage.py create mode 100644 morpheus/pipeline/stage.py create mode 100644 morpheus/pipeline/stream_pair.py create mode 100644 morpheus/pipeline/stream_wrapper.py create mode 100644 morpheus/stages/__init__.py create mode 100644 morpheus/stages/general/__init__.py create mode 100644 morpheus/stages/general/buffer_stage.py create mode 100644 morpheus/stages/general/delay_stage.py create mode 100644 morpheus/stages/general/monitor_stage.py create mode 100644 morpheus/stages/general/trigger_stage.py rename morpheus/{pipeline => stages}/inference/__init__.py (100%) rename morpheus/{pipeline/inference/inference_ae.py => stages/inference/auto_encoder_inference_stage.py} (58%) rename morpheus/{pipeline/inference/inference_identity.py => stages/inference/identity_inference_stage.py} (83%) rename morpheus/{pipeline => stages}/inference/inference_stage.py (97%) rename morpheus/{pipeline/inference/inference_pytorch.py => stages/inference/pytorch_inference_stage.py} (90%) rename morpheus/{pipeline/inference/inference_triton.py => stages/inference/triton_inference_stage.py} (98%) rename morpheus/{pipeline => stages}/input/__init__.py (100%) rename morpheus/{pipeline/input/from_cloudtrail.py => stages/input/cloud_trail_source_stage.py} (97%) rename morpheus/{pipeline/input/from_file.py => stages/input/file_source_stage.py} (93%) rename morpheus/{pipeline/input/from_kafka.py => stages/input/kafka_source_stage.py} (98%) rename morpheus/{pipeline => stages}/output/__init__.py (100%) rename morpheus/{pipeline/output/to_file.py => stages/output/write_to_file_stage.py} (87%) rename morpheus/{pipeline/output/to_kafka.py => stages/output/write_to_kafka_stage.py} (94%) rename morpheus/{pipeline => stages}/postprocess/__init__.py (100%) create mode 100644 morpheus/stages/postprocess/add_classifications_stage.py create mode 100644 morpheus/stages/postprocess/add_scores_stage.py create mode 100644 morpheus/stages/postprocess/filter_detections_stage.py rename morpheus/{pipeline/output/gen_viz_frames.py => stages/postprocess/generate_viz_frames_stage.py} (96%) rename morpheus/{pipeline/postprocess/mlflow_drift.py => stages/postprocess/ml_flow_drift_stage.py} (96%) rename morpheus/{pipeline/output/serialize.py => stages/postprocess/serialize_stage.py} (95%) rename morpheus/{pipeline/postprocess/timeseries.py => stages/postprocess/timeseries_stage.py} (98%) rename morpheus/{pipeline/output/validation.py => stages/postprocess/validation_stage.py} (96%) rename morpheus/{pipeline => stages}/preprocess/__init__.py (100%) create mode 100644 morpheus/stages/preprocess/deserialize_stage.py create mode 100644 morpheus/stages/preprocess/drop_null_stage.py create mode 100644 morpheus/stages/preprocess/preprocess_ae_stage.py create mode 100644 morpheus/stages/preprocess/preprocess_base_stage.py create mode 100644 morpheus/stages/preprocess/preprocess_fil_stage.py create mode 100644 morpheus/stages/preprocess/preprocess_nlp_stage.py rename morpheus/{pipeline/preprocess/autoencoder.py => stages/preprocess/train_ae_stage.py} (62%) diff --git a/examples/abp_pcap_detection/abp_pcap_preprocessing.py b/examples/abp_pcap_detection/abp_pcap_preprocessing.py index 049deba85c..a11da78ef7 100644 --- a/examples/abp_pcap_detection/abp_pcap_preprocessing.py +++ b/examples/abp_pcap_detection/abp_pcap_preprocessing.py @@ -1,4 +1,4 @@ -# Copyright (c) 2021, NVIDIA CORPORATION. +# Copyright (c) 2021-2022, NVIDIA CORPORATION. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -23,14 +23,15 @@ import morpheus._lib.stages as neos from morpheus.config import Config -from morpheus.pipeline.messages import InferenceMemoryFIL -from morpheus.pipeline.messages import MultiInferenceFILMessage -from morpheus.pipeline.messages import MultiInferenceMessage -from morpheus.pipeline.messages import MultiMessage -from morpheus.pipeline.preprocessing import PreprocessBaseStage +from morpheus.messages import InferenceMemoryFIL +from morpheus.messages import MultiInferenceFILMessage +from morpheus.messages import MultiInferenceMessage +from morpheus.messages import MultiMessage +from morpheus.stages.preprocess.preprocessing import PreprocessBaseStage class AbpPcapPreprocessingStage(PreprocessBaseStage): + def __init__(self, c: Config): super().__init__(c) diff --git a/examples/abp_pcap_detection/run.py b/examples/abp_pcap_detection/run.py index 92d2cb0e3b..9c6def11f8 100644 --- a/examples/abp_pcap_detection/run.py +++ b/examples/abp_pcap_detection/run.py @@ -23,14 +23,14 @@ from morpheus.config import Config from morpheus.config import CppConfig from morpheus.config import PipelineModes -from morpheus.pipeline.general_stages import AddClassificationsStage -from morpheus.pipeline.general_stages import MonitorStage -from morpheus.pipeline.inference.inference_triton import TritonInferenceStage -from morpheus.pipeline.input.from_file import FileSourceStage -from morpheus.pipeline.output.serialize import SerializeStage -from morpheus.pipeline.output.to_file import WriteToFileStage -from morpheus.pipeline.pipeline import LinearPipeline -from morpheus.pipeline.preprocessing import DeserializeStage +from morpheus.pipeline.linear_pipeline import LinearPipeline +from morpheus.stages.general.monitor_stage import MonitorStage +from morpheus.stages.inference.triton_inference_stage import TritonInferenceStage +from morpheus.stages.input.file_source_stage import FileSourceStage +from morpheus.stages.output.write_to_file_stage import WriteToFileStage +from morpheus.stages.postprocess.add_classifications_stage import AddClassificationsStage +from morpheus.stages.postprocess.serialize_stage import SerializeStage +from morpheus.stages.preprocess.deserialize_stage import DeserializeStage from morpheus.utils.logging import configure_logging diff --git a/examples/gnn_fraud_detection_pipeline/run.py b/examples/gnn_fraud_detection_pipeline/run.py index 186e591c79..1f17ed88e6 100644 --- a/examples/gnn_fraud_detection_pipeline/run.py +++ b/examples/gnn_fraud_detection_pipeline/run.py @@ -16,20 +16,20 @@ import click import psutil -from stages.classification_stage import ClassificationStage -from stages.graph_construction_stage import FraudGraphConstructionStage -from stages.graph_sage_stage import GraphSAGEStage from morpheus.config import Config from morpheus.config import CppConfig from morpheus.config import PipelineModes -from morpheus.pipeline.general_stages import MonitorStage -from morpheus.pipeline.input.from_file import FileSourceStage -from morpheus.pipeline.output.serialize import SerializeStage -from morpheus.pipeline.output.to_file import WriteToFileStage -from morpheus.pipeline.pipeline import LinearPipeline -from morpheus.pipeline.preprocessing import DeserializeStage +from morpheus.pipeline.linear_pipeline import LinearPipeline +from morpheus.stages.general.monitor_stage import MonitorStage +from morpheus.stages.input.file_source_stage import FileSourceStage +from morpheus.stages.output.write_to_file_stage import WriteToFileStage +from morpheus.stages.postprocess.serialize_stage import SerializeStage +from morpheus.stages.preprocess.deserialize_stage import DeserializeStage from morpheus.utils.logging import configure_logging +from stages.classification_stage import ClassificationStage +from stages.graph_construction_stage import FraudGraphConstructionStage +from stages.graph_sage_stage import GraphSAGEStage @click.command() diff --git a/examples/gnn_fraud_detection_pipeline/stages/classification_stage.py b/examples/gnn_fraud_detection_pipeline/stages/classification_stage.py index 5edfa03994..6d736c2fcc 100644 --- a/examples/gnn_fraud_detection_pipeline/stages/classification_stage.py +++ b/examples/gnn_fraud_detection_pipeline/stages/classification_stage.py @@ -1,20 +1,34 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + import typing import neo -import cudf import cuml from morpheus.config import Config -from morpheus.pipeline.messages import MessageMeta -from morpheus.pipeline.messages import MultiMessage -from morpheus.pipeline.pipeline import SinglePortStage -from morpheus.pipeline.pipeline import StreamPair +from morpheus.messages import MultiMessage +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair from .graph_sage_stage import GraphSAGEMultiMessage class ClassificationStage(SinglePortStage): + def __init__(self, c: Config, model_xgb_file: str): super().__init__(c) diff --git a/examples/gnn_fraud_detection_pipeline/stages/graph_construction_stage.py b/examples/gnn_fraud_detection_pipeline/stages/graph_construction_stage.py index 2b1a1a07f9..d56156cd64 100644 --- a/examples/gnn_fraud_detection_pipeline/stages/graph_construction_stage.py +++ b/examples/gnn_fraud_detection_pipeline/stages/graph_construction_stage.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + import dataclasses import typing @@ -9,9 +24,9 @@ import cudf from morpheus.config import Config -from morpheus.pipeline.messages import MultiMessage -from morpheus.pipeline.pipeline import SinglePortStage -from morpheus.pipeline.pipeline import StreamPair +from morpheus.messages import MultiMessage +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair @dataclasses.dataclass @@ -20,6 +35,7 @@ class FraudGraphMultiMessage(MultiMessage): class FraudGraphConstructionStage(SinglePortStage): + def __init__(self, c: Config, training_file: str): super().__init__(c) self._training_data = cudf.read_csv(training_file) diff --git a/examples/gnn_fraud_detection_pipeline/stages/graph_sage_stage.py b/examples/gnn_fraud_detection_pipeline/stages/graph_sage_stage.py index 8897b06c77..28263734bf 100644 --- a/examples/gnn_fraud_detection_pipeline/stages/graph_sage_stage.py +++ b/examples/gnn_fraud_detection_pipeline/stages/graph_sage_stage.py @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + import dataclasses import typing @@ -8,10 +23,9 @@ import cudf from morpheus.config import Config -from morpheus.pipeline.messages import MessageMeta -from morpheus.pipeline.messages import MultiMessage -from morpheus.pipeline.pipeline import SinglePortStage -from morpheus.pipeline.pipeline import StreamPair +from morpheus.messages import MultiMessage +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair from .graph_construction_stage import FraudGraphMultiMessage @@ -23,15 +37,14 @@ class GraphSAGEMultiMessage(MultiMessage): class GraphSAGEStage(SinglePortStage): - def __init__( - self, - c: Config, - model_hinsage_file: str, - batch_size: int = 5, - sample_size = [2, 32], - record_id:str = "index", - target_node:str ="transaction" - ): + + def __init__(self, + c: Config, + model_hinsage_file: str, + batch_size: int = 5, + sample_size=[2, 32], + record_id: str = "index", + target_node: str = "transaction"): super().__init__(c) self._keras_model = tf.keras.models.load_model(model_hinsage_file) self._batch_size = batch_size @@ -57,7 +70,6 @@ def _inductive_step_hinsage( generator = HinSAGENodeGenerator(graph, self._batch_size, self._sample_size, head_node_type=self._target_node) test_gen_not_shuffled = generator.flow(node_identifiers, shuffle=False) - inductive_emb = trained_model.predict(test_gen_not_shuffled) inductive_emb = cudf.DataFrame(inductive_emb, index=node_identifiers) diff --git a/examples/log_parsing/inference.py b/examples/log_parsing/inference.py index 1d7f5e8862..99034605bc 100644 --- a/examples/log_parsing/inference.py +++ b/examples/log_parsing/inference.py @@ -20,27 +20,27 @@ import neo import numpy as np import tritonclient.grpc as tritonclient +from neo.core import operators as ops +from scipy.special import softmax + from messages import MultiPostprocLogParsingMessage from messages import MultiResponseLogParsingMessage from messages import PostprocMemoryLogParsing from messages import ResponseMemoryLogParsing -from neo.core import operators as ops -from scipy.special import softmax - from morpheus.config import Config -from morpheus.pipeline.inference.inference_stage import InferenceStage -from morpheus.pipeline.inference.inference_stage import InferenceWorker -from morpheus.pipeline.inference.inference_triton import InputWrapper -from morpheus.pipeline.inference.inference_triton import TritonInferenceWorker -from morpheus.pipeline.messages import InferenceMemory -from morpheus.pipeline.messages import MultiInferenceMessage -from morpheus.pipeline.pipeline import StreamPair +from morpheus.messages import InferenceMemory +from morpheus.messages import MultiInferenceMessage +from morpheus.pipeline.stream_pair import StreamPair +from morpheus.stages.inference.inference_stage import InferenceStage +from morpheus.stages.inference.inference_stage import InferenceWorker +from morpheus.stages.inference.triton_inference_stage import InputWrapper +from morpheus.stages.inference.triton_inference_stage import _TritonInferenceWorker from morpheus.utils.producer_consumer_queue import ProducerConsumerQueue logger = logging.getLogger(__name__) -class TritonInferenceLogParsing(TritonInferenceWorker): +class TritonInferenceLogParsing(_TritonInferenceWorker): """ This class extends TritonInference to deal with scenario-specific NLP models inference requests like building response. diff --git a/examples/log_parsing/messages.py b/examples/log_parsing/messages.py index 1e4949bc4a..796e1f84d4 100644 --- a/examples/log_parsing/messages.py +++ b/examples/log_parsing/messages.py @@ -16,15 +16,15 @@ import cupy as cp -from morpheus.pipeline.messages import DataClassProp -from morpheus.pipeline.messages import InferenceMemory -from morpheus.pipeline.messages import MultiInferenceMessage -from morpheus.pipeline.messages import MultiResponseMessage -from morpheus.pipeline.messages import ResponseMemory -from morpheus.pipeline.messages import get_input -from morpheus.pipeline.messages import get_output -from morpheus.pipeline.messages import set_input -from morpheus.pipeline.messages import set_output +from morpheus.messages import DataClassProp +from morpheus.messages import InferenceMemory +from morpheus.messages import MultiInferenceMessage +from morpheus.messages import MultiResponseMessage +from morpheus.messages import ResponseMemory +from morpheus.messages import get_input +from morpheus.messages import get_output +from morpheus.messages import set_input +from morpheus.messages import set_output @dataclasses.dataclass diff --git a/examples/log_parsing/postprocessing.py b/examples/log_parsing/postprocessing.py index 644b6aaa18..4ddfa2dee9 100644 --- a/examples/log_parsing/postprocessing.py +++ b/examples/log_parsing/postprocessing.py @@ -19,13 +19,13 @@ import neo import numpy as np import pandas as pd + from messages import MultiPostprocLogParsingMessage from messages import MultiResponseLogParsingMessage - from morpheus.config import Config -from morpheus.pipeline.messages import MessageMeta -from morpheus.pipeline.pipeline import SinglePortStage -from morpheus.pipeline.pipeline import StreamPair +from morpheus.messages import MessageMeta +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair class LogParsingPostProcessingStage(SinglePortStage): diff --git a/examples/log_parsing/preprocessing.py b/examples/log_parsing/preprocessing.py index 6a26cdbe46..b8fe674872 100644 --- a/examples/log_parsing/preprocessing.py +++ b/examples/log_parsing/preprocessing.py @@ -22,11 +22,11 @@ import morpheus._lib.stages as neos from morpheus.config import Config -from morpheus.pipeline.messages import InferenceMemoryNLP -from morpheus.pipeline.messages import MultiInferenceMessage -from morpheus.pipeline.messages import MultiInferenceNLPMessage -from morpheus.pipeline.messages import MultiMessage -from morpheus.pipeline.preprocessing import PreprocessBaseStage +from morpheus.messages import InferenceMemoryNLP +from morpheus.messages import MultiInferenceMessage +from morpheus.messages import MultiInferenceNLPMessage +from morpheus.messages import MultiMessage +from morpheus.stages.preprocess.preprocessing import PreprocessBaseStage from morpheus.utils.cudf_subword_helper import tokenize_text_series @@ -79,7 +79,6 @@ def __init__(self, self._do_lower_case = do_lower_case self._add_special_tokens = add_special_tokens - @property def name(self) -> str: return "preprocess-logparsing" diff --git a/examples/log_parsing/run.py b/examples/log_parsing/run.py index 6f9322c961..d145ece2bd 100644 --- a/examples/log_parsing/run.py +++ b/examples/log_parsing/run.py @@ -23,11 +23,11 @@ from morpheus.config import CppConfig from morpheus.config import PipelineModes from morpheus.pipeline import LinearPipeline -from morpheus.pipeline.general_stages import BufferStage -from morpheus.pipeline.general_stages import MonitorStage -from morpheus.pipeline.input.from_file import FileSourceStage -from morpheus.pipeline.output.to_file import WriteToFileStage -from morpheus.pipeline.preprocessing import DeserializeStage +from morpheus.stages.general.general_stages import BufferStage +from morpheus.stages.general.monitor_stage import MonitorStage +from morpheus.stages.input.file_source_stage import FileSourceStage +from morpheus.stages.output.write_to_file_stage import WriteToFileStage +from morpheus.stages.preprocess.deserialize_stage import DeserializeStage @click.command() diff --git a/morpheus/cli.py b/morpheus/cli.py index 8836a9a5f7..6cdf4c0902 100644 --- a/morpheus/cli.py +++ b/morpheus/cli.py @@ -584,7 +584,7 @@ def from_file(ctx: click.Context, **kwargs): config = get_config_from_ctx(ctx) p = get_pipeline_from_ctx(ctx) - from morpheus.pipeline.input.from_file import FileSourceStage + from morpheus.stages.input.file_source_stage import FileSourceStage file_type = str_to_file_type(kwargs.pop("file_type").lower()) @@ -626,7 +626,7 @@ def from_kafka(ctx: click.Context, **kwargs): if ("bootstrap_servers" in kwargs and kwargs["bootstrap_servers"] == "auto"): kwargs["bootstrap_servers"] = auto_determine_bootstrap() - from morpheus.pipeline.input.from_kafka import KafkaSourceStage + from morpheus.stages.input.kafka_source_stage import KafkaSourceStage stage = KafkaSourceStage(config, **kwargs) @@ -667,7 +667,7 @@ def from_cloudtrail(ctx: click.Context, **kwargs): config = get_config_from_ctx(ctx) p = get_pipeline_from_ctx(ctx) - from morpheus.pipeline.input.from_cloudtrail import CloudTrailSourceStage + from morpheus.stages.input.cloud_trail_source_stage import CloudTrailSourceStage file_type = str_to_file_type(kwargs.pop("file_type").lower()) @@ -697,7 +697,7 @@ def monitor(ctx: click.Context, **kwargs): config = get_config_from_ctx(ctx) p = get_pipeline_from_ctx(ctx) - from morpheus.pipeline.general_stages import MonitorStage + from morpheus.stages.general.monitor_stage import MonitorStage stage = MonitorStage(config, **kwargs) @@ -714,7 +714,7 @@ def buffer(ctx: click.Context, **kwargs): config = get_config_from_ctx(ctx) p = get_pipeline_from_ctx(ctx) - from morpheus.pipeline.general_stages import BufferStage + from morpheus.stages.general.buffer_stage import BufferStage stage = BufferStage(config, **kwargs) @@ -731,7 +731,7 @@ def dropna(ctx: click.Context, **kwargs): config = get_config_from_ctx(ctx) p = get_pipeline_from_ctx(ctx) - from morpheus.pipeline.preprocessing import DropNullStage + from morpheus.stages.preprocess.drop_null_stage import DropNullStage stage = DropNullStage(config, **kwargs) @@ -750,7 +750,7 @@ def trigger(ctx: click.Context, **kwargs): config = get_config_from_ctx(ctx) p = get_pipeline_from_ctx(ctx) - from morpheus.pipeline.general_stages import TriggerStage + from morpheus.stages.general.trigger_stage import TriggerStage stage = TriggerStage(config, **kwargs) @@ -767,7 +767,7 @@ def delay(ctx: click.Context, **kwargs): config = get_config_from_ctx(ctx) p = get_pipeline_from_ctx(ctx) - from morpheus.pipeline.general_stages import DelayStage + from morpheus.stages.general.delay_stage import DelayStage stage = DelayStage(config, **kwargs) @@ -783,7 +783,7 @@ def deserialize(ctx: click.Context, **kwargs): config = get_config_from_ctx(ctx) p = get_pipeline_from_ctx(ctx) - from morpheus.pipeline.preprocessing import DeserializeStage + from morpheus.stages.preprocess.deserialize_stage import DeserializeStage stage = DeserializeStage(config, **kwargs) @@ -816,7 +816,7 @@ def train_ae(ctx: click.Context, **kwargs): config = get_config_from_ctx(ctx) p = get_pipeline_from_ctx(ctx) - from morpheus.pipeline.preprocess.autoencoder import TrainAEStage + from morpheus.stages.preprocess.train_ae_stage import TrainAEStage stage = TrainAEStage(config, **kwargs) @@ -855,7 +855,7 @@ def preprocess_nlp(ctx: click.Context, **kwargs): config = get_config_from_ctx(ctx) p = get_pipeline_from_ctx(ctx) - from morpheus.pipeline.preprocessing import PreprocessNLPStage + from morpheus.stages.preprocess.preprocess_nlp_stage import PreprocessNLPStage stage = PreprocessNLPStage(config, **kwargs) @@ -871,7 +871,7 @@ def preprocess_fil(ctx: click.Context, **kwargs): config = get_config_from_ctx(ctx) p = get_pipeline_from_ctx(ctx) - from morpheus.pipeline.preprocessing import PreprocessFILStage + from morpheus.stages.preprocess.preprocess_fil_stage import PreprocessFILStage stage = PreprocessFILStage(config, **kwargs) @@ -887,7 +887,7 @@ def preprocess_ae(ctx: click.Context, **kwargs): config = get_config_from_ctx(ctx) p = get_pipeline_from_ctx(ctx) - from morpheus.pipeline.preprocess.autoencoder import PreprocessAEStage + from morpheus.stages.preprocess.preprocess_ae_stage import PreprocessAEStage stage = PreprocessAEStage(config, **kwargs) @@ -917,7 +917,7 @@ def inf_triton(ctx: click.Context, **kwargs): config = get_config_from_ctx(ctx) p = get_pipeline_from_ctx(ctx) - from morpheus.pipeline.inference.inference_triton import TritonInferenceStage + from morpheus.stages.inference.triton_inference_stage import TritonInferenceStage stage = TritonInferenceStage(config, **kwargs) @@ -933,7 +933,7 @@ def inf_identity(ctx: click.Context, **kwargs): config = get_config_from_ctx(ctx) p = get_pipeline_from_ctx(ctx) - from morpheus.pipeline.inference.inference_identity import IdentityInferenceStage + from morpheus.stages.inference.identity_inference_stage import IdentityInferenceStage stage = IdentityInferenceStage(config, **kwargs) @@ -953,7 +953,7 @@ def inf_pytorch(ctx: click.Context, **kwargs): config = get_config_from_ctx(ctx) p = get_pipeline_from_ctx(ctx) - from morpheus.pipeline.inference.inference_pytorch import PyTorchInferenceStage + from morpheus.stages.inference.pytorch_inference_stage import PyTorchInferenceStage stage = PyTorchInferenceStage(config, **kwargs) @@ -969,7 +969,7 @@ def inf_pytorch_ae(ctx: click.Context, **kwargs): config = get_config_from_ctx(ctx) p = get_pipeline_from_ctx(ctx) - from morpheus.pipeline.inference.inference_ae import AutoEncoderInferenceStage + from morpheus.stages.inference.auto_encoder_inference_stage import AutoEncoderInferenceStage stage = AutoEncoderInferenceStage(config, **kwargs) @@ -1005,7 +1005,7 @@ def add_class(ctx: click.Context, **kwargs): del kwargs["label"] - from morpheus.pipeline.general_stages import AddClassificationsStage + from morpheus.stages.postprocess.add_classifications_stage import AddClassificationsStage stage = AddClassificationsStage(config, **kwargs) @@ -1040,7 +1040,7 @@ def add_scores(ctx: click.Context, **kwargs): del kwargs["label"] - from morpheus.pipeline.general_stages import AddScoresStage + from morpheus.stages.postprocess.add_scores_stage import AddScoresStage stage = AddScoresStage(config, **kwargs) @@ -1061,7 +1061,7 @@ def filter_command(ctx: click.Context, **kwargs): config = get_config_from_ctx(ctx) p = get_pipeline_from_ctx(ctx) - from morpheus.pipeline.general_stages import FilterDetectionsStage + from morpheus.stages.postprocess.filter_detections_stage import FilterDetectionsStage stage = FilterDetectionsStage(config, **kwargs) @@ -1094,7 +1094,7 @@ def serialize(ctx: click.Context, **kwargs): kwargs["include"] = list(kwargs["include"]) kwargs["exclude"] = list(kwargs["exclude"]) - from morpheus.pipeline.output.serialize import SerializeStage + from morpheus.stages.postprocess.serialize_stage import SerializeStage stage = SerializeStage(config, **kwargs) @@ -1141,7 +1141,7 @@ def mlflow_drift(ctx: click.Context, **kwargs): # Ensure labels is not a tuple kwargs["labels"] = list(kwargs["labels"]) - from morpheus.pipeline.postprocess.mlflow_drift import MLFlowDriftStage + from morpheus.stages.postprocess.ml_flow_drift_stage import MLFlowDriftStage stage = MLFlowDriftStage(config, **kwargs) @@ -1196,7 +1196,7 @@ def timeseries(ctx: click.Context, **kwargs): config = get_config_from_ctx(ctx) p = get_pipeline_from_ctx(ctx) - from morpheus.pipeline.postprocess.timeseries import TimeSeriesStage + from morpheus.stages.postprocess.timeseries_stage import TimeSeriesStage stage = TimeSeriesStage(config, **kwargs) @@ -1248,7 +1248,7 @@ def validate(ctx: click.Context, **kwargs): config = get_config_from_ctx(ctx) p = get_pipeline_from_ctx(ctx) - from morpheus.pipeline.output.validation import ValidationStage + from morpheus.stages.postprocess.validation_stage import ValidationStage stage = ValidationStage(config, **kwargs) @@ -1266,7 +1266,7 @@ def to_file(ctx: click.Context, **kwargs): config = get_config_from_ctx(ctx) p = get_pipeline_from_ctx(ctx) - from morpheus.pipeline.output.to_file import WriteToFileStage + from morpheus.stages.output.write_to_file_stage import WriteToFileStage stage = WriteToFileStage(config, **kwargs) @@ -1292,7 +1292,7 @@ def to_kafka(ctx: click.Context, **kwargs): if ("bootstrap_servers" in kwargs and kwargs["bootstrap_servers"] == "auto"): kwargs["bootstrap_servers"] = auto_determine_bootstrap() - from morpheus.pipeline.output.to_kafka import WriteToKafkaStage + from morpheus.stages.output.write_to_kafka_stage import WriteToKafkaStage stage = WriteToKafkaStage(config, **kwargs) @@ -1314,7 +1314,7 @@ def gen_viz(ctx: click.Context, **kwargs): config = get_config_from_ctx(ctx) p = get_pipeline_from_ctx(ctx) - from morpheus.pipeline.output.gen_viz_frames import GenerateVizFramesStage + from morpheus.stages.postprocess.generate_viz_frames_stage import GenerateVizFramesStage stage = GenerateVizFramesStage(config, **kwargs) diff --git a/morpheus/config.py b/morpheus/config.py index 8c545f5435..83d5c16039 100644 --- a/morpheus/config.py +++ b/morpheus/config.py @@ -18,6 +18,7 @@ import dataclasses import json import logging +import os import typing from enum import Enum @@ -135,6 +136,11 @@ class CppConfig: meaning C++ should be used where an implementation is available. Can be set to False to use Python implementations. This can be useful for debugging but C++ should be preferred for performance. """ + # allow_cpp lets us disable C++ regardless of the runtime value. This way, you can use an environment variable to + # override the runtime options + __allow_cpp: bool = not os.getenv("MORPHEUS_NO_CPP", 'False').lower() in ('true', '1', 't') + + # Runtime option for whether or not C++ should be used __use_cpp: bool = True @staticmethod @@ -142,7 +148,7 @@ def get_should_use_cpp() -> bool: """ Gets the global option for whether to use C++ node and message types or otherwise prefer Python. """ - return CppConfig.__use_cpp + return CppConfig.__use_cpp and CppConfig.__allow_cpp @staticmethod def set_should_use_cpp(value: bool): diff --git a/morpheus/io/__init__.py b/morpheus/io/__init__.py new file mode 100644 index 0000000000..5cd51cf3c8 --- /dev/null +++ b/morpheus/io/__init__.py @@ -0,0 +1,16 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +Input/Output tools and utilities. +""" diff --git a/morpheus/pipeline/input/utils.py b/morpheus/io/deserializers.py similarity index 90% rename from morpheus/pipeline/input/utils.py rename to morpheus/io/deserializers.py index 3104645cb2..bb8979194b 100644 --- a/morpheus/pipeline/input/utils.py +++ b/morpheus/io/deserializers.py @@ -21,22 +21,7 @@ from morpheus._lib.file_types import FileTypes from morpheus._lib.file_types import determine_file_type - - -def filter_null_data(x: typing.Union[cudf.DataFrame, pd.DataFrame]): - """ - Filters out null row in a dataframe's 'data' column if it exists. - - Parameters - ---------- - x : typing.Union[cudf.DataFrame, pandas.DataFrame] - The dataframe to fix. - """ - - if ("data" not in x): - return x - - return x[~x['data'].isna()] +from morpheus.io.utils import filter_null_data def cudf_json_onread_cleanup(x: typing.Union[cudf.DataFrame, pd.DataFrame]): diff --git a/morpheus/pipeline/output/utils.py b/morpheus/io/serializers.py similarity index 100% rename from morpheus/pipeline/output/utils.py rename to morpheus/io/serializers.py diff --git a/morpheus/pipeline/file_types.py b/morpheus/io/utils.py similarity index 54% rename from morpheus/pipeline/file_types.py rename to morpheus/io/utils.py index 14cb5bcc21..b90fb38ef9 100644 --- a/morpheus/pipeline/file_types.py +++ b/morpheus/io/utils.py @@ -13,21 +13,24 @@ # See the License for the specific language governing permissions and # limitations under the License. -import os +import typing -from morpheus._lib.file_types import FileTypes +import pandas as pd -# def determine_file_type(filename: str) -> FileTypes: -# # Determine from the file extension -# ext = os.path.splitext(filename) +import cudf -# # Get the extension without the dot -# ext = ext[1].lower()[1:] -# # Check against supported options -# if (ext == "json" or ext == "jsonlines"): -# return FileTypes.Json -# elif (ext == "csv"): -# return FileTypes.Csv -# else: -# raise RuntimeError("Unsupported extension '{}' with 'auto' type. 'auto' only works with: csv, json".format(ext)) +def filter_null_data(x: typing.Union[cudf.DataFrame, pd.DataFrame]): + """ + Filters out null row in a dataframe's 'data' column if it exists. + + Parameters + ---------- + x : typing.Union[cudf.DataFrame, pandas.DataFrame] + The dataframe to fix. + """ + + if ("data" not in x): + return x + + return x[~x['data'].isna()] diff --git a/morpheus/messages/__init__.py b/morpheus/messages/__init__.py new file mode 100644 index 0000000000..371dddd3f5 --- /dev/null +++ b/morpheus/messages/__init__.py @@ -0,0 +1,56 @@ +# Copyright (c) 2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Import order is very important here. Import base classes before child ones +# isort: off + +from morpheus.messages.message_base import MessageBase +from morpheus.messages.message_meta import MessageMeta +from morpheus.messages.message_meta import UserMessageMeta +from morpheus.messages.multi_message import MultiMessage +from morpheus.messages.multi_ae_message import MultiAEMessage +from morpheus.messages.multi_inference_message import InferenceMemory +from morpheus.messages.multi_inference_message import InferenceMemoryAE +from morpheus.messages.multi_inference_message import InferenceMemoryFIL +from morpheus.messages.multi_inference_message import InferenceMemoryNLP +from morpheus.messages.multi_inference_message import MultiInferenceFILMessage +from morpheus.messages.multi_inference_message import MultiInferenceMessage +from morpheus.messages.multi_inference_message import MultiInferenceNLPMessage +from morpheus.messages.multi_response_message import MultiResponseAEMessage +from morpheus.messages.multi_response_message import MultiResponseMessage +from morpheus.messages.multi_response_message import MultiResponseProbsMessage +from morpheus.messages.multi_response_message import ResponseMemory +from morpheus.messages.multi_response_message import ResponseMemoryAE +from morpheus.messages.multi_response_message import ResponseMemoryProbs + +__all__ = [ + "InferenceMemory", + "InferenceMemoryAE", + "InferenceMemoryFIL", + "InferenceMemoryNLP", + "MessageBase", + "MessageMeta", + "MultiAEMessage", + "MultiInferenceFILMessage", + "MultiInferenceMessage", + "MultiInferenceNLPMessage", + "MultiMessage", + "MultiResponseAEMessage", + "MultiResponseMessage", + "MultiResponseProbsMessage", + "ResponseMemory", + "ResponseMemoryAE", + "ResponseMemoryProbs", + "UserMessageMeta", +] diff --git a/morpheus/messages/data_class_prop.py b/morpheus/messages/data_class_prop.py new file mode 100644 index 0000000000..e327827dbd --- /dev/null +++ b/morpheus/messages/data_class_prop.py @@ -0,0 +1,79 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import typing + + +class DataClassProp: + """ + This class is used to configure dataclass fields within message container classes. + + Parameters + ---------- + fget : typing.Callable[[typing.Any, str], typing.Any], optional + Callable for field getter, by default None. + fset : typing.Callable[[typing.Any, str, typing.Any], None], optional + Callable for field setter, by default None. + fdel : typing.Callable[[typing.Any, str], typing.Any], optional + This is not used, by default None. + doc : _type_, optional + Documentation for field, by default None. + field : _type_, optional + Field value, by default None. + """ + + def __init__(self, + fget: typing.Callable[[typing.Any, str], typing.Any] = None, + fset: typing.Callable[[typing.Any, str, typing.Any], None] = None, + fdel=None, + doc=None, + field=None): + + self.fget = fget + self.fset = fset + self.fdel = fdel + if doc is None and fget is not None: + doc = fget.__doc__ + self.__doc__ = doc + self._field = field + + def __set_name__(self, owner, name): + self.name = name + + def __get__(self, instance, owner): + if (instance is None): + # Most likely, this is getting the default field value for the dataclass. + return self._field + + if self.fget is None: + raise AttributeError("unreadable attribute") + + return self.fget(instance, self.name) + + def __set__(self, instance, value): + + if (instance is None): + return + + if self.fset is None: + raise AttributeError("can't set attribute") + + self.fset(instance, self.name, value) + + def __delete__(self, instance): + if (instance is None): + return + + del instance.inputs[self.name] diff --git a/morpheus/messages/message_base.py b/morpheus/messages/message_base.py new file mode 100644 index 0000000000..cf2db9c1a5 --- /dev/null +++ b/morpheus/messages/message_base.py @@ -0,0 +1,64 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import abc +import dataclasses +import typing + +from morpheus.config import CppConfig + + +class MessageImpl(abc.ABCMeta): + + _cpp_class: typing.Union[type, typing.Callable] = None + """ + Metaclass to switch between Python & C++ message implementations at construction time. + Note: some classes don't have a C++ implementation, but do inherit from a class that + does (ex UserMessageMeta & InferenceMemoryAE) these classes also need this metaclass + to prevent creating instances of their parent's C++ impl. + """ + + def __new__(cls, classname, bases, classdict, cpp_class=None): + result = super().__new__(cls, classname, bases, classdict) + + # Set the C++ class type into the object to use for creation later if desired + result._cpp_class = cpp_class + + # Register the C++ class as an instances of this metaclass to support isinstance(cpp_instance, PythonClass) + if (cpp_class is not None): + result.register(cpp_class) + + return result + + +class MessageBase(metaclass=MessageImpl): + + def __new__(cls, *args, **kwargs): + + # If _cpp_class is set, and use_cpp is enabled, create the C++ instance + if (getattr(cls, "_cpp_class", None) is not None and CppConfig.get_should_use_cpp()): + return cls._cpp_class(*args, **kwargs) + + # Otherwise, do the default init + return super().__new__(cls) + + +@dataclasses.dataclass +class MessageData(MessageBase): + + def __getstate__(self): + return self.__dict__ + + def __setstate__(self, d): + self.__dict__ = d diff --git a/morpheus/messages/message_meta.py b/morpheus/messages/message_meta.py new file mode 100644 index 0000000000..553325f9fb --- /dev/null +++ b/morpheus/messages/message_meta.py @@ -0,0 +1,64 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import dataclasses + +import pandas as pd + +import morpheus._lib.messages as neom +from morpheus.messages.message_base import MessageBase + + +@dataclasses.dataclass +class MessageMeta(MessageBase, cpp_class=neom.MessageMeta): + """ + This is a container class to hold batch deserialized messages metadata. + + Parameters + ---------- + df : pandas.DataFrame + Input rows in dataframe. + + """ + df: pd.DataFrame + + @property + def count(self) -> int: + """ + Returns the number of messages in the batch. + + Returns + ------- + int + number of messages in the MessageMeta.df. + + """ + + return len(self.df) + + +@dataclasses.dataclass +class UserMessageMeta(MessageMeta, cpp_class=None): + """ + This class extends MessageMeta to also hold userid corresponding to batched metadata. + + Parameters + ---------- + df : pandas.DataFrame + Input rows in dataframe. + user_id : str + User id. + + """ + user_id: str diff --git a/morpheus/messages/multi_ae_message.py b/morpheus/messages/multi_ae_message.py new file mode 100644 index 0000000000..e8b69ba05b --- /dev/null +++ b/morpheus/messages/multi_ae_message.py @@ -0,0 +1,48 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import dataclasses +import logging + +from dfencoder import AutoEncoder + +from morpheus.messages.multi_message import MultiMessage + +logger = logging.getLogger(__name__) + + +@dataclasses.dataclass +class MultiAEMessage(MultiMessage): + + model: AutoEncoder + + def get_slice(self, start, stop): + """ + Returns sliced batches based on offsets supplied. Automatically calculates the correct `mess_offset` + and `mess_count`. + + Parameters + ---------- + start : int + Start offset address. + stop : int + Stop offset address. + + Returns + ------- + morpheus.pipeline.preprocess.autoencoder.MultiAEMessage + A new `MultiAEMessage` with sliced offset and count. + + """ + return MultiAEMessage(meta=self.meta, mess_offset=start, mess_count=stop - start, model=self.model) diff --git a/morpheus/messages/multi_inference_ae_message.py b/morpheus/messages/multi_inference_ae_message.py new file mode 100644 index 0000000000..3c69110be3 --- /dev/null +++ b/morpheus/messages/multi_inference_ae_message.py @@ -0,0 +1,96 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import dataclasses +import typing + +from dfencoder.autoencoder import AutoEncoder + +from morpheus.messages.message_meta import UserMessageMeta +from morpheus.messages.multi_inference_message import MultiInferenceMessage + + +@dataclasses.dataclass +class MultiInferenceAEMessage(MultiInferenceMessage): + """ + A stronger typed version of `MultiInferenceMessage` that is used for AE workloads. Helps ensure the + proper inputs are set and eases debugging. Associates a user ID with a message. + """ + + model: AutoEncoder + + @property + def user_id(self): + """ + Returns the user ID associated with this message. + + """ + + return typing.cast(UserMessageMeta, self.meta).user_id + + @property + def input(self): + """ + Returns autoecoder input tensor. + + Returns + ------- + cupy.ndarray + The autoencoder input tensor. + + """ + + return self.get_input("input") + + @property + def seq_ids(self): + """ + Returns sequence ids, which are used to keep track of messages in a multi-threaded environment. + + Returns + ------- + cupy.ndarray + seq_ids + + """ + + return self.get_input("seq_ids") + + def get_slice(self, start, stop): + """ + Returns sliced batches based on offsets supplied. Automatically calculates the correct `mess_offset` + and `mess_count`. + + Parameters + ---------- + start : int + Start offset address. + stop : int + Stop offset address. + + Returns + ------- + `MultiInferenceAEMessage` + A new `MultiInferenceAEMessage` with sliced offset and count. + + """ + mess_start = self.mess_offset + self.seq_ids[start, 0].item() + mess_stop = self.mess_offset + self.seq_ids[stop - 1, 0].item() + 1 + return MultiInferenceAEMessage(meta=self.meta, + mess_offset=mess_start, + mess_count=mess_stop - mess_start, + memory=self.memory, + offset=start, + count=stop - start, + model=self.model) diff --git a/morpheus/messages/multi_inference_message.py b/morpheus/messages/multi_inference_message.py new file mode 100644 index 0000000000..b1559952d3 --- /dev/null +++ b/morpheus/messages/multi_inference_message.py @@ -0,0 +1,351 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import dataclasses +import typing + +import cupy as cp + +import morpheus._lib.messages as neom +from morpheus.messages.data_class_prop import DataClassProp +from morpheus.messages.message_base import MessageData +from morpheus.messages.multi_message import MultiMessage + + +@dataclasses.dataclass +class InferenceMemory(MessageData, cpp_class=neom.InferenceMemory): + """ + This is a base container class for data that will be used for inference stages. This class is designed to + hold generic tensor data in cupy arrays. + + Parameters + ---------- + count : int + Number of inference inputs. + inputs : typing.Dict[str, cupy.ndarray] + Inference inputs to model. + + """ + count: int + + inputs: typing.Dict[str, cp.ndarray] = dataclasses.field(default_factory=dict, init=False) + + +def get_input(instance, name: str): + """ + Getter function used with DataClassProp for getting inference input from message containers derived + from InferenceMemory. + + Parameters + ---------- + instance : `InferenceMemory` + Message container holding inputs. + name : str + Key used to do lookup in inputs dict of message container. + + Returns + ------- + cupy.ndarray + Inputs corresponding to name. + + Raises + ------ + AttributeError + If input name does not exist in message container. + """ + if (name not in instance.inputs): + raise AttributeError + + return instance.inputs[name] + + +def set_input(instance, name: str, value): + """ + Setter function used with DataClassProp for setting inference input in message containers derived + from InferenceMemory. + + Parameters + ---------- + instance : `InferenceMemory` + Message container holding inputs. + name : str + Key used to do lookup in inputs dict of message container. + value : cupy.ndarray + Value to set for input. + """ + # Ensure that we have 2D array here (`ensure_2d` inserts the wrong axis) + instance.inputs[name] = value if value.ndim == 2 else cp.reshape(value, (value.shape[0], -1)) + + +@dataclasses.dataclass +class InferenceMemoryNLP(InferenceMemory, cpp_class=neom.InferenceMemoryNLP): + """ + This is a container class for data that needs to be submitted to the inference server for NLP category + usecases. + + Parameters + ---------- + input_ids : cupy.ndarray + The token-ids for each string padded with 0s to max_length. + input_mask : cupy.ndarray + The mask for token-ids result where corresponding positions identify valid token-id values. + seq_ids : cupy.ndarray + Ids used to index from an inference input to a message. Necessary since there can be more inference + inputs than messages (i.e., if some messages get broken into multiple inference requests). + + """ + input_ids: dataclasses.InitVar[cp.ndarray] = DataClassProp(get_input, set_input) + input_mask: dataclasses.InitVar[cp.ndarray] = DataClassProp(get_input, set_input) + seq_ids: dataclasses.InitVar[cp.ndarray] = DataClassProp(get_input, set_input) + + def __post_init__(self, input_ids, input_mask, seq_ids): + self.input_ids = input_ids + self.input_mask = input_mask + self.seq_ids = seq_ids + + +@dataclasses.dataclass +class InferenceMemoryFIL(InferenceMemory, cpp_class=neom.InferenceMemoryFIL): + """ + This is a container class for data that needs to be submitted to the inference server for FIL category + usecases. + + Parameters + ---------- + input__0 : cupy.ndarray + Inference input. + seq_ids : cupy.ndarray + Ids used to index from an inference input to a message. Necessary since there can be more inference + inputs than messages (i.e., if some messages get broken into multiple inference requests). + + """ + input__0: dataclasses.InitVar[cp.ndarray] = DataClassProp(get_input, set_input) + seq_ids: dataclasses.InitVar[cp.ndarray] = DataClassProp(get_input, set_input) + + def __post_init__(self, input__0, seq_ids): + self.input__0 = input__0 + self.seq_ids = seq_ids + + +@dataclasses.dataclass +class InferenceMemoryAE(InferenceMemory, cpp_class=None): + """ + This is a container class for data that needs to be submitted to the inference server for FIL category + usecases. + + Parameters + ---------- + input__0 : cupy.ndarray + Inference input. + seq_ids : cupy.ndarray + Ids used to index from an inference input to a message. Necessary since there can be more inference + inputs than messages (i.e., if some messages get broken into multiple inference requests). + + """ + input: dataclasses.InitVar[cp.ndarray] = DataClassProp(get_input, set_input) + seq_ids: dataclasses.InitVar[cp.ndarray] = DataClassProp(get_input, set_input) + + def __post_init__(self, input, seq_ids): + self.input = input + self.seq_ids = seq_ids + + +@dataclasses.dataclass +class MultiInferenceMessage(MultiMessage, cpp_class=neom.MultiInferenceMessage): + """ + This is a container class that holds the InferenceMemory container and the metadata of the data contained + within it. Builds on top of the `MultiMessage` class to add additional data for inferencing. + + This class requires two separate memory blocks for a batch. One for the message metadata (i.e., start time, + IP address, etc.) and another for the raw inference inputs (i.e., input_ids, seq_ids). Since there can be + more inference input requests than messages (This happens when some messages get broken into multiple + inference requests) this class stores two different offset and count values. `mess_offset` and + `mess_count` refer to the offset and count in the message metadata batch and `offset` and `count` index + into the inference batch data. + + Parameters + ---------- + memory : `InferenceMemory` + Inference memory. + offset : int + Message offset in inference memory instance. + count : int + Message count in inference memory instance. + + """ + memory: InferenceMemory = dataclasses.field(repr=False) + offset: int + count: int + + @property + def inputs(self): + """ + Get inputs stored in the InferenceMemory container. + + Returns + ------- + cupy.ndarray + Inference inputs. + + """ + + return {key: self.get_input(key) for key in self.memory.inputs.keys()} + + def __getstate__(self): + return self.__dict__ + + def __setstate__(self, d): + self.__dict__ = d + + def __getattr__(self, name: str) -> typing.Any: + + input_val = self.memory.inputs.get(name, None) + + if (input_val is not None): + return input_val[self.offset:self.offset + self.count, :] + + raise AttributeError + + def get_input(self, name: str): + """ + Get input stored in the InferenceMemory container. + + Parameters + ---------- + name : str + Input key name. + + Returns + ------- + cupy.ndarray + Inference input. + + """ + + return self.memory.inputs[name][self.offset:self.offset + self.count, :] + + def get_slice(self, start, stop): + """ + Returns sliced batches based on offsets supplied. Automatically calculates the correct `mess_offset` + and `mess_count`. + + Parameters + ---------- + start : int + Start offset address. + stop : int + Stop offset address. + + Returns + ------- + `MultiInferenceMessage` + A new `MultiInferenceMessage` with sliced offset and count. + + """ + mess_start = self.mess_offset + self.seq_ids[start, 0].item() + mess_stop = self.mess_offset + self.seq_ids[stop - 1, 0].item() + 1 + return MultiInferenceMessage(meta=self.meta, + mess_offset=mess_start, + mess_count=mess_stop - mess_start, + memory=self.memory, + offset=start, + count=stop - start) + + +@dataclasses.dataclass +class MultiInferenceNLPMessage(MultiInferenceMessage, cpp_class=neom.MultiInferenceNLPMessage): + """ + A stronger typed version of `MultiInferenceMessage` that is used for NLP workloads. Helps ensure the + proper inputs are set and eases debugging. + """ + + @property + def input_ids(self): + """ + Returns token-ids for each string padded with 0s to max_length. + + Returns + ------- + cupy.ndarray + The token-ids for each string padded with 0s to max_length. + + """ + + return self.get_input("input_ids") + + @property + def input_mask(self): + """ + Returns mask for token-ids result where corresponding positions identify valid token-id values. + + Returns + ------- + cupy.ndarray + The mask for token-ids result where corresponding positions identify valid token-id values. + + """ + + return self.get_input("input_mask") + + @property + def seq_ids(self): + """ + Returns sequence ids, which are used to keep track of which inference requests belong to each message. + + Returns + ------- + cupy.ndarray + Ids used to index from an inference input to a message. Necessary since there can be more + inference inputs than messages (i.e., if some messages get broken into multiple inference requests). + + """ + + return self.get_input("seq_ids") + + +@dataclasses.dataclass +class MultiInferenceFILMessage(MultiInferenceMessage, cpp_class=neom.MultiInferenceFILMessage): + """ + A stronger typed version of `MultiInferenceMessage` that is used for FIL workloads. Helps ensure the + proper inputs are set and eases debugging. + """ + + @property + def input__0(self): + """ + Input to FIL model inference. + + Returns + ------- + cupy.ndarray + Input data. + + """ + + return self.get_input("input__0") + + @property + def seq_ids(self): + """ + Returns sequence ids, which are used to keep track of messages in a multi-threaded environment. + + Returns + ------- + cupy.ndarray + Sequence ids. + + """ + + return self.get_input("seq_ids") diff --git a/morpheus/messages/multi_message.py b/morpheus/messages/multi_message.py new file mode 100644 index 0000000000..c69aeebd5a --- /dev/null +++ b/morpheus/messages/multi_message.py @@ -0,0 +1,172 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import dataclasses +import typing + +import cudf + +import morpheus._lib.messages as neom +from morpheus.messages.message_base import MessageData +from morpheus.messages.message_meta import MessageMeta + + +@dataclasses.dataclass +class MultiMessage(MessageData, cpp_class=neom.MultiMessage): + """ + This class holds data for multiple messages at a time. To avoid copying data for slicing operations, it + holds a reference to a batched metadata object and stores the offset and count into that batch. + + Parameters + ---------- + meta : `MessageMeta` + Deserialized messages metadata for large batch. + mess_offset : int + Offset into the metadata batch. + mess_count : int + Messages count. + + """ + meta: MessageMeta = dataclasses.field(repr=False) + mess_offset: int + mess_count: int + + @property + def id_col(self): + """ + Returns ID column values from `morpheus.pipeline.messages.MessageMeta.df`. + + Returns + ------- + pandas.Series + ID column values from the dataframe. + + """ + return self.get_meta("ID") + + @property + def id(self) -> typing.List[int]: + """ + Returns ID column values from `morpheus.pipeline.messages.MessageMeta.df` as list. + + Returns + ------- + List[int] + ID column values from the dataframe as list. + + """ + + return self.get_meta_list("ID") + + @property + def timestamp(self) -> typing.List[int]: + """ + Returns timestamp column values from morpheus.messages.MessageMeta.df as list. + + Returns + ------- + List[int] + Timestamp column values from the dataframe as list. + + """ + + return self.get_meta_list("timestamp") + + def get_meta(self, columns: typing.Union[None, str, typing.List[str]] = None): + """ + Return column values from `morpheus.pipeline.messages.MessageMeta.df`. + + Parameters + ---------- + columns : typing.Union[None, str, typing.List[str]] + Input column names. Returns all columns if `None` is specified. When a string is passed, a `Series` is + returned. Otherwise a `Dataframe` is returned. + + Returns + ------- + Series or Dataframe + Column values from the dataframe. + + """ + + idx = self.meta.df.index[self.mess_offset:self.mess_offset + self.mess_count] + + if (isinstance(idx, cudf.RangeIndex)): + idx = slice(idx.start, idx.stop - 1, idx.step) + + if (columns is None): + return self.meta.df.loc[idx, :] + else: + # If its a str or list, this is the same + return self.meta.df.loc[idx, columns] + + def get_meta_list(self, col_name: str = None): + """ + Return a column values from morpheus.messages.MessageMeta.df as a list. + + Parameters + ---------- + col_name : str + Column name in the dataframe. + + Returns + ------- + List[str] + Column values from the dataframe. + + """ + + return self.get_meta(col_name).to_list() + + def set_meta(self, columns: typing.Union[None, str, typing.List[str]], value): + """ + Set column values to `morpheus.pipelines.messages.MessageMeta.df`. + + Parameters + ---------- + columns : typing.Union[None, str, typing.List[str]] + Input column names. Sets the value for the corresponding column names. If `None` is specified, all columns + will be used. If the column does not exist, a new one will be created. + value : Any + Value to apply to the specified columns. If a single value is passed, it will be broadcast to all rows. If a + `Series` or `Dataframe` is passed, rows will be matched by index. + + """ + if (columns is None): + # Set all columns + self.meta.df.loc[self.meta.df.index[self.mess_offset:self.mess_offset + self.mess_count], :] = value + else: + # If its a single column or list of columns, this is the same + self.meta.df.loc[self.meta.df.index[self.mess_offset:self.mess_offset + self.mess_count], columns] = value + + def get_slice(self, start, stop): + """ + Returns sliced batches based on offsets supplied. Automatically calculates the correct `mess_offset` + and `mess_count`. + + Parameters + ---------- + start : int + Start offset address. + stop : int + Stop offset address. + + Returns + ------- + `MultiInferenceMessage` + A new `MultiInferenceMessage` with sliced offset and count. + + """ + return MultiMessage(meta=self.meta, mess_offset=start, mess_count=stop - start) diff --git a/morpheus/messages/multi_response_message.py b/morpheus/messages/multi_response_message.py new file mode 100644 index 0000000000..363da9e9c7 --- /dev/null +++ b/morpheus/messages/multi_response_message.py @@ -0,0 +1,222 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import dataclasses +import typing + +import cupy as cp + +import morpheus._lib.messages as neom +from morpheus.messages.data_class_prop import DataClassProp +from morpheus.messages.message_base import MessageData +from morpheus.messages.multi_message import MultiMessage + + +def get_output(instance: "ResponseMemory", name: str): + """ + Getter function used with DataClassProp for getting inference output from message containers derived + from ResponseMemory. + + Parameters + ---------- + instance : `ResponseMemory` + Message container holding outputs. + name : str + Key used to do lookup in outputs dict of message container. + + Returns + ------- + cupy.ndarray + Outputs corresponding to name. + + Raises + ------ + AttributeError + If output name does not exist in message container. + + """ + + if (name not in instance.outputs): + raise AttributeError + + return instance.outputs[name] + + +def set_output(instance: "ResponseMemory", name: str, value): + """ + Setter function used with DataClassProp for setting output in message containers derived + from ResponseMemory. + + Parameters + ---------- + instance : `ResponseMemory` + Message container holding outputs. + name : str + Key used to do lookup in outputs dict of message container. + value : cupy.ndarray + Value to set for input. + """ + + # Ensure that we have 2D array here (`ensure_2d` inserts the wrong axis) + instance.outputs[name] = value if value.ndim == 2 else cp.reshape(value, (value.shape[0], -1)) + + +@dataclasses.dataclass +class ResponseMemory(MessageData, cpp_class=neom.ResponseMemory): + """ + Output memory block holding the results of inference. + """ + count: int + + outputs: typing.Dict[str, cp.ndarray] = dataclasses.field(default_factory=dict, init=False) + + def get_output(self, name: str): + if (name not in self.outputs): + raise KeyError + + return self.outputs[name] + + +@dataclasses.dataclass +class ResponseMemoryProbs(ResponseMemory, cpp_class=neom.ResponseMemoryProbs): + probs: dataclasses.InitVar[cp.ndarray] = DataClassProp(get_output, set_output) + + def __post_init__(self, probs): + self.probs = probs + + +@dataclasses.dataclass +class ResponseMemoryAE(ResponseMemoryProbs, cpp_class=None): + user_id: str = "" + + +@dataclasses.dataclass +class MultiResponseMessage(MultiMessage, cpp_class=neom.MultiResponseMessage): + """ + This class contains several inference responses as well as the cooresponding message metadata. + + Parameters + ---------- + memory : `ResponseMemory` + This is a response container instance for triton inference requests. + offset : int + Offset of each response message into the `ResponseMemory` block. + count : int + Inference results size of all responses. + + """ + memory: ResponseMemory = dataclasses.field(repr=False) + offset: int + count: int + + @property + def outputs(self): + """ + Get outputs stored in the ResponseMemory container. + + Returns + ------- + cupy.ndarray + Inference outputs. + + """ + + return {key: self.get_output(key) for key in self.memory.outputs.keys()} + + def __getattr__(self, name: str) -> typing.Any: + + output_val = self.memory.outputs.get(name, None) + + if (output_val is not None): + return output_val[self.offset:self.offset + self.count, :] + + raise AttributeError + + def get_output(self, name: str): + """ + Get output stored in the ResponseMemory container. + + Parameters + ---------- + name : str + Output key name. + + Returns + ------- + cupy.ndarray + Inference output. + + """ + + return self.memory.outputs[name][self.offset:self.offset + self.count, :] + + # def get_slice(self, start, stop): + # """ + # Returns sliced batches based on offsets supplied. Automatically calculates the correct `mess_offset` + # and `mess_count`. + + # Parameters + # ---------- + # start : int + # Start offset address. + # stop : int + # Stop offset address. + + # Returns + # ------- + # morpheus.messages.MultiResponseMessage + # A new `MultiResponseMessage` with sliced offset and count. + + # """ + # mess_start = self.seq_ids[start, 0].item() + # mess_stop = self.seq_ids[stop - 1, 0].item() + 1 + # return MultiResponseMessage(meta=self.meta, + # mess_offset=mess_start, + # mess_count=mess_stop - mess_start, + # memory=self.memory, + # offset=start, + # count=stop - start) + + +@dataclasses.dataclass +class MultiResponseProbsMessage(MultiResponseMessage, cpp_class=neom.MultiResponseProbsMessage): + """ + A stronger typed version of `MultiResponseMessage` that is used for inference workloads that return a probability + array. Helps ensure the proper outputs are set and eases debugging. + """ + + @property + def probs(self): + """ + Probabilities of prediction. + + Returns + ------- + cupy.ndarray + probabilities + + """ + + return self.get_output("probs") + + +@dataclasses.dataclass +class MultiResponseAEMessage(MultiResponseProbsMessage, cpp_class=None): + """ + A stronger typed version of `MultiResponseProbsMessage` that is used for inference workloads that return a + probability array. Helps ensure the proper outputs are set and eases debugging. + """ + + user_id: str diff --git a/morpheus/pipeline/__init__.py b/morpheus/pipeline/__init__.py index 254182500e..27afad0fba 100644 --- a/morpheus/pipeline/__init__.py +++ b/morpheus/pipeline/__init__.py @@ -15,10 +15,17 @@ All objects related to building and running a pipeline. """ -from .messages import MultiInferenceMessage -from .messages import MultiMessage -from .messages import MultiResponseMessage -from .pipeline import LinearPipeline -from .pipeline import Pipeline -from .pipeline import SourceStage -from .pipeline import Stage +# These must be imported in a specific order +# isort: off + +from morpheus.pipeline.stream_pair import StreamPair +from morpheus.pipeline.sender import Sender +from morpheus.pipeline.receiver import Receiver +from morpheus.pipeline.stream_wrapper import StreamWrapper +from morpheus.pipeline.stage import Stage +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.multi_message_stage import MultiMessageStage +from morpheus.pipeline.source_stage import SourceStage +from morpheus.pipeline.single_output_source import SingleOutputSource +from morpheus.pipeline.pipeline import Pipeline +from morpheus.pipeline.linear_pipeline import LinearPipeline diff --git a/morpheus/pipeline/general_stages.py b/morpheus/pipeline/general_stages.py deleted file mode 100644 index e733e62601..0000000000 --- a/morpheus/pipeline/general_stages.py +++ /dev/null @@ -1,757 +0,0 @@ -# Copyright (c) 2021-2022, NVIDIA CORPORATION. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import logging -import typing -from functools import reduce - -import cupy as cp -import neo -from neo.core import operators as ops -from tqdm import TMonitor -from tqdm import TqdmSynchronisationWarning -from tqdm import tqdm - -import cudf - -import morpheus._lib.stages as neos -from morpheus.config import Config -from morpheus.config import CppConfig -from morpheus.pipeline import Stage -from morpheus.pipeline.messages import MessageMeta -from morpheus.pipeline.messages import MultiMessage -from morpheus.pipeline.messages import MultiResponseProbsMessage -from morpheus.pipeline.pipeline import SinglePortStage -from morpheus.pipeline.pipeline import StreamPair -from morpheus.utils.logging import deprecated_stage_warning - -logger = logging.getLogger(__name__) - - -class BufferStage(SinglePortStage): - """ - The input messages are buffered by this stage class for faster access to downstream stages. Allows - upstream stages to run faster than downstream stages. - - Parameters - ---------- - c : `morpheus.config.Config` - Pipeline configuration instance. - - """ - - def __init__(self, c: Config, count: int = 1000): - super().__init__(c) - - self._buffer_count = count - - @property - def name(self) -> str: - return "buffer" - - def accepted_types(self) -> typing.Tuple: - """ - Accepted input types for this stage are returned. - - Returns - ------- - typing.Tuple - Accepted input types. - - """ - return (typing.Any, ) - - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - - # This stage is no longer needed and is just a pass thru stage - deprecated_stage_warning(logger, type(self), self.unique_name) - - return input_stream - - -class DelayStage(SinglePortStage): - """ - Delay stage class. Used to buffer all inputs until the timeout duration is hit. At that point all messages - will be dumped into downstream stages. Useful for testing performance of one stage at a time. - - Parameters - ---------- - c : `morpheus.config.Config` - Pipeline configuration instance. - - """ - - def __init__(self, c: Config, duration: str): - super().__init__(c) - - self._duration = duration - - @property - def name(self) -> str: - return "delay" - - def accepted_types(self) -> typing.Tuple: - """ - Accepted input types for this stage are returned. - - Returns - ------- - typing.Tuple - Accepted input types. - - """ - return (typing.Any, ) - - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - - # This stage is no longer needed and is just a pass thru stage - deprecated_stage_warning(logger, type(self), self.unique_name) - - return input_stream - - -class TriggerStage(SinglePortStage): - """ - This stage will buffer all inputs until the source stage is complete. At that point all messages - will be dumped into downstream stages. Useful for testing performance of one stage at a time. - - Parameters - ---------- - c : `morpheus.config.Config` - Pipeline configuration instance. - - """ - - def __init__(self, c: Config): - super().__init__(c) - - @property - def name(self) -> str: - return "trigger" - - def accepted_types(self) -> typing.Tuple: - """ - Accepted input types for this stage are returned. - - Returns - ------- - typing.Tuple - Accepted input types. - - """ - return (typing.Any, ) - - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - - # Store all messages until on_complete is called and then push them - def node_fn(input: neo.Observable, output: neo.Subscriber): - - input.pipe(ops.to_list(), ops.flatten()).subscribe(output) - - node = seg.make_node_full(self.unique_name, node_fn) - seg.make_edge(input_stream[0], node) - - return node, input_stream[1] - - -# Functions exactly the same as TMonitor, except we do not check for `instance.miniters == 1` before updating. This -# allows the timer to update every 1 second on the screen making the pipeline feel running -class MorpheusTqdmMonitor(TMonitor): - - def run(self): - cur_t = self._time() - while True: - # After processing and before sleeping, notify that we woke - # Need to be done just before sleeping - self.woken = cur_t - # Sleep some time... - self.was_killed.wait(self.sleep_interval) - # Quit if killed - if self.was_killed.is_set(): - return - # Then monitor! - # Acquire lock (to access _instances) - with self.tqdm_cls.get_lock(): - cur_t = self._time() - # Check tqdm instances are waiting too long to print - instances = self.get_instances() - for instance in instances: - # Check event in loop to reduce blocking time on exit - if self.was_killed.is_set(): - return - # Only if mininterval > 1 (else iterations are just slow) - # and last refresh exceeded maxinterval - if ((cur_t - instance.last_print_t) >= instance.maxinterval): - # Refresh now! (works only for manual tqdm) - instance.refresh(nolock=True) - # Remove accidental long-lived strong reference - del instance - if instances != self.get_instances(): # pragma: nocover - logging.warn("Set changed size during iteration" + " (see https://github.com/tqdm/tqdm/issues/481)", - TqdmSynchronisationWarning, - stacklevel=2) - # Remove accidental long-lived strong references - del instances - - -class MorpheusTqdm(tqdm): - """ - Subclass of tqdm to provide slightly different functionality with their TMonitor. - - """ - monitor_interval = 1 # set to 0 to disable the thread - monitor: MorpheusTqdmMonitor = None - - def __new__(cls, *args, **kwargs): - with cls.get_lock(): # also constructs lock if non-existent - - if (cls.monitor is None or not cls.monitor.report()): - # Set the new type of monitor - cls.monitor = MorpheusTqdmMonitor(cls, cls.monitor_interval) - - return tqdm.__new__(cls, args, kwargs) - - def __init__(self, *args, **kwargs): - - # Must set this first - self.is_running = True - - super().__init__(*args, **kwargs) - - self.last_update_t = self.start_t - - @property - def format_dict(self): - - base_val = super().format_dict - - # If we arent running, dont increment the time - if (not self.is_running): - base_val["elapsed"] = self.last_update_t - self.start_t - - return base_val - - def update(self, n=1): - - self.last_update_t = self._time() - - return super().update(n) - - def stop(self): - - # Set is running to false to stop elapsed from incrementing - self.is_running = False - - -class MonitorStage(SinglePortStage): - """ - Monitor stage used to monitor stage performance metrics using Tqdm. Each Monitor Stage will represent one - line in the console window showing throughput statistics. Can be set up to show an instantaneous - throughput or average input. - - Parameters - ---------- - c : `morpheus.config.Config` - Pipeline configuration instance. - description : str - Name to show for this Monitor Stage in the console window. - smoothing : float - Smoothing parameter to determine how much the throughput should be averaged. 0 = Instantaneous, 1 = - Average. - unit : str - Units to show in the rate value. - delayed_start : bool - Delay start of progress bar. - determine_count_fn : typing.Callable[[typing.Any], int] - Custom function for determining the count in a message. Gets called for each message. Allows for - correct counting of batched and sliced messages. - - """ - stage_count: int = 0 - - def __init__(self, - c: Config, - description: str = "Progress", - smoothing: float = 0.05, - unit="messages", - delayed_start: bool = False, - determine_count_fn: typing.Callable[[typing.Any], int] = None): - super().__init__(c) - - self._progress: MorpheusTqdm = None - self._position = MonitorStage.stage_count - - MonitorStage.stage_count += 1 - - self._description = description - self._smoothing = smoothing - self._unit = unit - self._delayed_start = delayed_start - - self._determine_count_fn = determine_count_fn - - @property - def name(self) -> str: - return "monitor" - - def accepted_types(self) -> typing.Tuple: - """ - Accepted input types for this stage are returned. - - Returns - ------- - typing.Tuple - Accepted input types. - - """ - return (typing.Any, ) - - def on_start(self): - - # Set the monitor interval to 0 to use prevent using tqdms monitor - tqdm.monitor_interval = 0 - - # Start the progress bar if we dont have a delayed start - if (not self._delayed_start): - self._ensure_progress_bar() - - def stop(self): - if (self._progress is not None): - self._progress.close() - - def _ensure_progress_bar(self): - if (self._progress is None): - self._progress = MorpheusTqdm(desc=self._description, - smoothing=self._smoothing, - dynamic_ncols=True, - unit=self._unit, - mininterval=0.25, - maxinterval=1.0, - miniters=1, - position=self._position) - - self._progress.reset() - - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - - def sink_on_error(x): - logger.error("Node: '%s' received error: %s", self.unique_name, x) - - def sink_on_completed(): - # Set the name to complete. This refreshes the display - self._progress.set_description_str(self._progress.desc + "[Complete]") - - self._progress.stop() - - # To prevent the monitors from writing over eachother, stop the monitor when the last stage completes - MonitorStage.stage_count -= 1 - - if (MonitorStage.stage_count <= 0 and MorpheusTqdm.monitor is not None): - MorpheusTqdm.monitor.exit() - MorpheusTqdm.monitor = None - - stream = seg.make_sink(self.unique_name, self._progress_sink, sink_on_error, sink_on_completed) - - seg.make_edge(input_stream[0], stream) - - return input_stream - - def _refresh_progress(self, _): - self._progress.refresh() - - def _progress_sink(self, x): - - # Make sure the progress bar is shown - self._ensure_progress_bar() - - if (self._determine_count_fn is None): - self._determine_count_fn = self._auto_count_fn(x) - - # Skip incase we have empty objects - if (self._determine_count_fn is None): - return - - # Do our best to determine the count - n = self._determine_count_fn(x) - - self._progress.update(n=n) - - def _auto_count_fn(self, x): - - if (x is None): - return None - - # Wait for a list thats not empty - if (isinstance(x, list) and len(x) == 0): - return None - - if (isinstance(x, cudf.DataFrame)): - return lambda y: len(y.index) - elif (isinstance(x, MultiMessage)): - return lambda y: y.mess_count - elif (isinstance(x, MessageMeta)): - return lambda y: y.count - elif (isinstance(x, list)): - item_count_fn = self._auto_count_fn(x[0]) - return lambda y: reduce(lambda sum, z, item_count_fn=item_count_fn: sum + item_count_fn(z), y, 0) - elif (isinstance(x, str)): - return lambda y: 1 - elif (hasattr(x, "__len__")): - return len # Return len directly (same as `lambda y: len(y)`) - else: - raise NotImplementedError("Unsupported type: {}".format(type(x))) - - -class AddClassificationsStage(SinglePortStage): - """ - Add classification labels based on probabilities calculated in inference stage. Label indexes will be looked up in - the Config.class_labels property. Uses default threshold of 0.5 for predictions. - - Parameters - ---------- - c : `morpheus.config.Config` - Pipeline configuration instance. - threshold : float - Threshold to classify, default is 0.5. - labels: list, default = None - The list of labels to add classifications for. Each item in the list will determine its index from the - Config.class_labels property and must be one of the available class labels. Leave as None to add all labels in - the Config.class_labels property. - prefix: str, default = "" - A prefix to append to each label. - - """ - - def __init__(self, c: Config, threshold: float = 0.5, labels: typing.List[str] = None, prefix: str = ""): - super().__init__(c) - - self._feature_length = c.feature_length - self._threshold = threshold - self._prefix = prefix - self._class_labels = c.class_labels - self._labels = labels if labels is not None and len(labels) > 0 else c.class_labels - - # Build the Index to Label map. - self._idx2label = {} - - for label in self._labels: - # All labels must be in class_labels in order to get their position - if (label not in self._class_labels): - logger.warning("The label '%s' is not in Config.class_labels and will be ignored", label) - continue - - self._idx2label[self._class_labels.index(label)] = self._prefix + label - - assert len(self._idx2label) > 0, "No labels were added to the stage" - - @property - def name(self) -> str: - return "add-class" - - def accepted_types(self) -> typing.Tuple: - """ - Accepted input types for this stage are returned. - - Returns - ------- - typing.Tuple[`morpheus.pipeline.messages.MultiResponseProbsMessage`, ] - Accepted input types. - - """ - return (MultiResponseProbsMessage, ) - - @classmethod - def supports_cpp_node(cls): - # Enable support by default - return True - - def _add_labels(self, x: MultiResponseProbsMessage): - - if (x.probs.shape[1] != len(self._class_labels)): - raise RuntimeError("Label count does not match output of model. Label count: {}, Model output: {}".format( - len(self._class_labels), x.probs.shape[1])) - - probs_np = (x.probs > self._threshold).astype(bool).get() - - for i, label in self._idx2label.items(): - x.set_meta(label, probs_np[:, i].tolist()) - - # Return passthrough - return x - - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - - # Convert the messages to rows of strings - if CppConfig.get_should_use_cpp(): - stream = neos.AddClassificationsStage(seg, - self.unique_name, - self._threshold, - len(self._class_labels), - self._idx2label) - else: - stream = seg.make_node(self.unique_name, self._add_labels) - - seg.make_edge(input_stream[0], stream) - - # Return input unchanged - return stream, MultiResponseProbsMessage - - -class FilterDetectionsStage(SinglePortStage): - """ - This Stage class is used to filter results based on a given criteria. - - Parameters - ---------- - c : `morpheus.config.Config` - Pipeline configuration instance. - threshold : float - Threshold to classify, default is 0.5. - - """ - - def __init__(self, c: Config, threshold: float = 0.5): - super().__init__(c) - - # Probability to consider a detection - self._threshold = threshold - - @property - def name(self) -> str: - return "filter" - - def accepted_types(self) -> typing.Tuple: - """ - Accepted input types for this stage are returned. - - Returns - ------- - typing.Tuple[`morpheus.pipeline.messages.MultiResponseProbsMessage`, ] - Accepted input types. - - """ - return (MultiResponseProbsMessage, ) - - @classmethod - def supports_cpp_node(cls): - # Enable support by default - return True - - def filter(self, x: MultiResponseProbsMessage) -> typing.List[MultiResponseProbsMessage]: - """ - This function uses a threshold value to filter the messages. - - Parameters - ---------- - x : `morpheus.pipeline.messages.MultiResponseProbsMessage` - Response message with probabilities calculated from inference results. - - Returns - ------- - typing.List[`morpheus.pipeline.messages.MultiResponseProbsMessage`] - List of filtered messages. - - """ - # Unfortunately we have to convert this to a list in case there are non-contiguous groups - output_list = [] - - # Get per row detections - detections = (x.probs > self._threshold).any(axis=1) - - # Surround in False to ensure we get an even number of pairs - detections = cp.concatenate([cp.array([False]), detections, cp.array([False])]) - - true_pairs = cp.where(detections[1:] != detections[:-1])[0].reshape((-1, 2)) - - for pair in true_pairs: - pair = tuple(pair.tolist()) - mess_offset = x.mess_offset + pair[0] - mess_count = pair[1] - pair[0] - - # Filter empty message groups - if (mess_count == 0): - continue - - output_list.append( - MultiResponseProbsMessage(x.meta, - mess_offset=mess_offset, - mess_count=mess_count, - memory=x.memory, - offset=pair[0], - count=mess_count)) - - return output_list - - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - - # Convert list back to single MultiResponseProbsMessage - def flatten_fn(input: neo.Observable, output: neo.Subscriber): - - input.pipe(ops.map(self.filter), ops.flatten()).subscribe(output) - - if CppConfig.get_should_use_cpp(): - stream = neos.FilterDetectionsStage(seg, self.unique_name, self._threshold) - else: - stream = seg.make_node_full(self.unique_name, flatten_fn) - - seg.make_edge(input_stream[0], stream) - - return stream, MultiResponseProbsMessage - - -class ZipStage(Stage): - - def __init__(self, c: Config): - super().__init__(c) - - @property - def name(self) -> str: - return "zip" - - def accepted_types(self) -> typing.Tuple: - return (typing.Any, ) - - def _build(self, seg: neo.Segment, in_ports_streams: typing.List[StreamPair]) -> typing.List[StreamPair]: - - raise NotImplementedError(("The ZipStage has been deprecated and is not longer supported. " - "Non-linear pipelines will be added in a future release")) - - -class MergeStage(Stage): - - def __init__(self, c: Config): - super().__init__(c) - - @property - def name(self) -> str: - return "merge" - - def accepted_types(self) -> typing.Tuple: - return (typing.Any, ) - - def _build(self, seg: neo.Segment, in_ports_streams: typing.List[StreamPair]) -> typing.List[StreamPair]: - - raise NotImplementedError(("The MergeStage has been deprecated and is not longer supported. " - "Non-linear pipelines will be added in a future release")) - - -class SwitchStage(Stage): - - def __init__(self, c: Config, num_outputs: int, predicate: typing.Callable[[typing.Any], int]): - super().__init__(c) - - self._num_outputs = num_outputs - self._predicate = predicate - - self._create_ports(1, num_outputs) - - @property - def name(self) -> str: - return "sample" - - def accepted_types(self) -> typing.Tuple: - return (typing.Any, ) - - def _build(self, seg: neo.Segment, in_ports_streams: typing.List[StreamPair]) -> typing.List[StreamPair]: - - raise NotImplementedError(("The SwitchStage has been deprecated and is not longer supported. " - "Non-linear pipelines will be added in a future release")) - - -class AddScoresStage(SinglePortStage): - """ - Add score labels based on probabilities calculated in inference stage. Label indexes will be looked up in - the Config.class_labels property. - - Parameters - ---------- - c : morpheus.config.Config - Pipeline configuration instance. - labels: list, default = None - The list of labels to add classifications for. Each item in the list will determine its index from the - Config.class_labels property and must be one of the available class labels. Leave as None to add all labels in - the Config.class_labels property. - prefix: str, default = "" - A prefix to append to each label. - - """ - - def __init__(self, c: Config, labels: typing.List[str] = None, prefix: str = ""): - super().__init__(c) - - self._feature_length = c.feature_length - self._prefix = prefix - self._class_labels = c.class_labels - self._labels = labels if labels is not None and len(labels) > 0 else c.class_labels - - # Build the Index to Label map. - self._idx2label = {} - - for label in self._labels: - # All labels must be in class_labels in order to get their position - if (label not in self._class_labels): - logger.warning("The label '%s' is not in Config.class_labels and will be ignored", label) - continue - - self._idx2label[self._class_labels.index(label)] = self._prefix + label - - assert len(self._idx2label) > 0, "No labels were added to the stage" - - @property - def name(self) -> str: - return "add-scores" - - def accepted_types(self) -> typing.Tuple: - """ - Accepted input types for this stage are returned. - - Returns - ------- - typing.Tuple[`morpheus.pipeline.messages.MultiResponseProbsMessage`, ] - Accepted input types. - - """ - return (MultiResponseProbsMessage, ) - - @classmethod - def supports_cpp_node(cls): - # Enable support by default - return True - - def _add_labels(self, x: MultiResponseProbsMessage): - - if (x.probs.shape[1] != len(self._class_labels)): - raise RuntimeError("Label count does not match output of model. Label count: {}, Model output: {}".format( - len(self._class_labels), x.probs.shape[1])) - - probs_np = x.probs.get() - - for i, label in self._idx2label.items(): - x.set_meta(label, probs_np[:, i].tolist()) - - # Return passthrough - return x - - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - - # Convert the messages to rows of strings - if CppConfig.get_should_use_cpp(): - stream = neos.AddScoresStage(seg, self.unique_name, len(self._class_labels), self._idx2label) - else: - stream = seg.make_node(self.unique_name, self._add_labels) - - seg.make_edge(input_stream[0], stream) - - # Return input unchanged - return stream, input_stream[1] diff --git a/morpheus/pipeline/linear_pipeline.py b/morpheus/pipeline/linear_pipeline.py new file mode 100644 index 0000000000..56a8eb00d4 --- /dev/null +++ b/morpheus/pipeline/linear_pipeline.py @@ -0,0 +1,90 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import typing + +import morpheus.pipeline as _pipeline +from morpheus.config import Config + +logger = logging.getLogger(__name__) + + +class LinearPipeline(_pipeline.Pipeline): + """ + This class is used to build linear pipelines where we have a single output source stage followed by stages that are + executed sequentially in the order they were added. + + Parameters + ---------- + c : `morpheus.config.Config` + Pipeline configuration instance. + """ + + def __init__(self, c: Config): + super().__init__(c) + + self._linear_stages: typing.List[_pipeline.StreamWrapper] = [] + + def set_source(self, source: _pipeline.SourceStage): + """ + Set a pipeline's source stage to consume messages before it begins executing stages. This must be + called once before `build_and_start`. + + Parameters + ---------- + source : `SourceStage` + The source stage wraps the implementation in a stream that allows it to read from Kafka or a file. + + """ + + if (len(self._sources) > 0 and source not in self._sources): + logger.warning( + "LinearPipeline already has a source. Setting a new source will clear out all existing stages") + + self._sources.clear() + + # Store the source in sources + self._sources.add(source) + + if (len(self._linear_stages) > 0): + logger.warning("Clearing %d stages from pipeline", len(self._linear_stages)) + self._linear_stages.clear() + + # Need to store the source in the pipeline + super().add_node(source) + + # Store this as the first one in the linear stages. Must be index 0 + self._linear_stages.append(source) + + def add_stage(self, stage: _pipeline.SinglePortStage): + """ + Add stages to the pipeline. All `Stage` classes added with this method will be executed sequentially + inthe order they were added. + + Parameters + ---------- + stage : `Stage` + The stage object to add. It cannot be already added to another `Pipeline` object. + + """ + + assert len(self._linear_stages) > 0, "A source must be set on a LinearPipeline before adding any stages" + assert isinstance(stage, _pipeline.SinglePortStage), ("Only `SinglePortStage` stages are accepted in " + "`add_stage()`") + + # Make an edge between the last node and this one + self.add_edge(self._linear_stages[-1], stage) + + self._linear_stages.append(stage) diff --git a/morpheus/pipeline/messages.py b/morpheus/pipeline/messages.py deleted file mode 100644 index f8bbcdb527..0000000000 --- a/morpheus/pipeline/messages.py +++ /dev/null @@ -1,855 +0,0 @@ -# Copyright (c) 2021-2022, NVIDIA CORPORATION. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import abc -import dataclasses -import os -import typing - -import cupy as cp -import pandas as pd - -import cudf - -import morpheus._lib.messages as neom -from morpheus.config import CppConfig - -# If set, this disables all CPP class creation -NO_CPP = os.getenv("MORPHEUS_NO_CPP", 'False').lower() in ('true', '1', 't') - - -class MessageImpl(abc.ABCMeta): - - _cpp_class: typing.Union[type, typing.Callable] = None - """ - Metaclass to switch between Python & C++ message implementations at construction time. - Note: some classes don't have a C++ implementation, but do inherit from a class that - does (ex UserMessageMeta & InferenceMemoryAE) these classes also need this metaclass - to prevent creating instances of their parent's C++ impl. - """ - - def __new__(cls, classname, bases, classdict, cpp_class=None): - result = super().__new__(cls, classname, bases, classdict) - - # Set the C++ class type into the object to use for creation later if desired - result._cpp_class = None if NO_CPP else cpp_class - - # Register the C++ class as an instances of this metaclass to support isinstance(cpp_instance, PythonClass) - if (cpp_class is not None): - result.register(cpp_class) - - return result - - -class MessageBase(metaclass=MessageImpl): - - def __new__(cls, *args, **kwargs): - - # If _cpp_class is set, and use_cpp is enabled, create the C++ instance - if (getattr(cls, "_cpp_class", None) is not None and CppConfig.get_should_use_cpp()): - return cls._cpp_class(*args, **kwargs) - - # Otherwise, do the default init - return super().__new__(cls) - - -@dataclasses.dataclass -class MessageData(MessageBase): - - def __getstate__(self): - return self.__dict__ - - def __setstate__(self, d): - self.__dict__ = d - - -@dataclasses.dataclass -class MessageMeta(MessageBase, cpp_class=neom.MessageMeta): - """ - This is a container class to hold batch deserialized messages metadata. - - Parameters - ---------- - df : pandas.DataFrame - Input rows in dataframe. - - """ - df: pd.DataFrame - - @property - def count(self) -> int: - """ - Returns the number of messages in the batch. - - Returns - ------- - int - number of messages in the MessageMeta.df. - - """ - - return len(self.df) - - -@dataclasses.dataclass -class UserMessageMeta(MessageMeta, cpp_class=None): - """ - This class extends MessageMeta to also hold userid corresponding to batched metadata. - - Parameters - ---------- - df : pandas.DataFrame - Input rows in dataframe. - user_id : str - User id. - - """ - user_id: str - - -@dataclasses.dataclass -class MultiMessage(MessageData, cpp_class=neom.MultiMessage): - """ - This class holds data for multiple messages at a time. To avoid copying data for slicing operations, it - holds a reference to a batched metadata object and stores the offset and count into that batch. - - Parameters - ---------- - meta : `MessageMeta` - Deserialized messages metadata for large batch. - mess_offset : int - Offset into the metadata batch. - mess_count : int - Messages count. - - """ - meta: MessageMeta = dataclasses.field(repr=False) - mess_offset: int - mess_count: int - - @property - def id_col(self): - """ - Returns ID column values from `morpheus.pipeline.messages.MessageMeta.df`. - - Returns - ------- - pandas.Series - ID column values from the dataframe. - - """ - return self.get_meta("ID") - - @property - def id(self) -> typing.List[int]: - """ - Returns ID column values from `morpheus.pipeline.messages.MessageMeta.df` as list. - - Returns - ------- - List[int] - ID column values from the dataframe as list. - - """ - - return self.get_meta_list("ID") - - @property - def timestamp(self) -> typing.List[int]: - """ - Returns timestamp column values from morpheus.messages.MessageMeta.df as list. - - Returns - ------- - List[int] - Timestamp column values from the dataframe as list. - - """ - - return self.get_meta_list("timestamp") - - def get_meta(self, columns: typing.Union[None, str, typing.List[str]] = None): - """ - Return column values from `morpheus.pipeline.messages.MessageMeta.df`. - - Parameters - ---------- - columns : typing.Union[None, str, typing.List[str]] - Input column names. Returns all columns if `None` is specified. When a string is passed, a `Series` is - returned. Otherwise a `Dataframe` is returned. - - Returns - ------- - Series or Dataframe - Column values from the dataframe. - - """ - - idx = self.meta.df.index[self.mess_offset:self.mess_offset + self.mess_count] - - if (isinstance(idx, cudf.RangeIndex)): - idx = slice(idx.start, idx.stop - 1, idx.step) - - if (columns is None): - return self.meta.df.loc[idx, :] - else: - # If its a str or list, this is the same - return self.meta.df.loc[idx, columns] - - def get_meta_list(self, col_name: str = None): - """ - Return a column values from morpheus.messages.MessageMeta.df as a list. - - Parameters - ---------- - col_name : str - Column name in the dataframe. - - Returns - ------- - List[str] - Column values from the dataframe. - - """ - - return self.get_meta(col_name).to_list() - - def set_meta(self, columns: typing.Union[None, str, typing.List[str]], value): - """ - Set column values to `morpheus.pipelines.messages.MessageMeta.df`. - - Parameters - ---------- - columns : typing.Union[None, str, typing.List[str]] - Input column names. Sets the value for the corresponding column names. If `None` is specified, all columns - will be used. If the column does not exist, a new one will be created. - value : Any - Value to apply to the specified columns. If a single value is passed, it will be broadcast to all rows. If a - `Series` or `Dataframe` is passed, rows will be matched by index. - - """ - if (columns is None): - # Set all columns - self.meta.df.loc[self.meta.df.index[self.mess_offset:self.mess_offset + self.mess_count], :] = value - else: - # If its a single column or list of columns, this is the same - self.meta.df.loc[self.meta.df.index[self.mess_offset:self.mess_offset + self.mess_count], columns] = value - - def get_slice(self, start, stop): - """ - Returns sliced batches based on offsets supplied. Automatically calculates the correct `mess_offset` - and `mess_count`. - - Parameters - ---------- - start : int - Start offset address. - stop : int - Stop offset address. - - Returns - ------- - `MultiInferenceMessage` - A new `MultiInferenceMessage` with sliced offset and count. - - """ - return MultiMessage(meta=self.meta, mess_offset=start, mess_count=stop - start) - - -@dataclasses.dataclass -class InferenceMemory(MessageData, cpp_class=neom.InferenceMemory): - """ - This is a base container class for data that will be used for inference stages. This class is designed to - hold generic tensor data in cupy arrays. - - Parameters - ---------- - count : int - Number of inference inputs. - inputs : typing.Dict[str, cupy.ndarray] - Inference inputs to model. - - """ - count: int - - inputs: typing.Dict[str, cp.ndarray] = dataclasses.field(default_factory=dict, init=False) - - -class DataClassProp: - """ - This class is used to configure dataclass fields within message container classes. - - Parameters - ---------- - fget : typing.Callable[[typing.Any, str], typing.Any], optional - Callable for field getter, by default None. - fset : typing.Callable[[typing.Any, str, typing.Any], None], optional - Callable for field setter, by default None. - fdel : typing.Callable[[typing.Any, str], typing.Any], optional - This is not used, by default None. - doc : _type_, optional - Documentation for field, by default None. - field : _type_, optional - Field value, by default None. - """ - - def __init__(self, - fget: typing.Callable[[typing.Any, str], typing.Any] = None, - fset: typing.Callable[[typing.Any, str, typing.Any], None] = None, - fdel=None, - doc=None, - field=None): - - self.fget = fget - self.fset = fset - self.fdel = fdel - if doc is None and fget is not None: - doc = fget.__doc__ - self.__doc__ = doc - self._field = field - - def __set_name__(self, owner, name): - self.name = name - - def __get__(self, instance, owner): - if (instance is None): - # Most likely, this is getting the default field value for the dataclass. - return self._field - - if self.fget is None: - raise AttributeError("unreadable attribute") - - return self.fget(instance, self.name) - - def __set__(self, instance, value): - - if (instance is None): - return - - if self.fset is None: - raise AttributeError("can't set attribute") - - self.fset(instance, self.name, value) - - def __delete__(self, instance): - if (instance is None): - return - - del instance.inputs[self.name] - - -def get_input(instance, name: str): - """ - Getter function used with DataClassProp for getting inference input from message containers derived - from InferenceMemory. - - Parameters - ---------- - instance : `InferenceMemory` - Message container holding inputs. - name : str - Key used to do lookup in inputs dict of message container. - - Returns - ------- - cupy.ndarray - Inputs corresponding to name. - - Raises - ------ - AttributeError - If input name does not exist in message container. - """ - if (name not in instance.inputs): - raise AttributeError - - return instance.inputs[name] - - -def set_input(instance, name: str, value): - """ - Setter function used with DataClassProp for setting inference input in message containers derived - from InferenceMemory. - - Parameters - ---------- - instance : `InferenceMemory` - Message container holding inputs. - name : str - Key used to do lookup in inputs dict of message container. - value : cupy.ndarray - Value to set for input. - """ - # Ensure that we have 2D array here (`ensure_2d` inserts the wrong axis) - instance.inputs[name] = value if value.ndim == 2 else cp.reshape(value, (value.shape[0], -1)) - - -@dataclasses.dataclass -class InferenceMemoryNLP(InferenceMemory, cpp_class=neom.InferenceMemoryNLP): - """ - This is a container class for data that needs to be submitted to the inference server for NLP category - usecases. - - Parameters - ---------- - input_ids : cupy.ndarray - The token-ids for each string padded with 0s to max_length. - input_mask : cupy.ndarray - The mask for token-ids result where corresponding positions identify valid token-id values. - seq_ids : cupy.ndarray - Ids used to index from an inference input to a message. Necessary since there can be more inference - inputs than messages (i.e., if some messages get broken into multiple inference requests). - - """ - input_ids: dataclasses.InitVar[cp.ndarray] = DataClassProp(get_input, set_input) - input_mask: dataclasses.InitVar[cp.ndarray] = DataClassProp(get_input, set_input) - seq_ids: dataclasses.InitVar[cp.ndarray] = DataClassProp(get_input, set_input) - - def __post_init__(self, input_ids, input_mask, seq_ids): - self.input_ids = input_ids - self.input_mask = input_mask - self.seq_ids = seq_ids - - -@dataclasses.dataclass -class InferenceMemoryFIL(InferenceMemory, cpp_class=neom.InferenceMemoryFIL): - """ - This is a container class for data that needs to be submitted to the inference server for FIL category - usecases. - - Parameters - ---------- - input__0 : cupy.ndarray - Inference input. - seq_ids : cupy.ndarray - Ids used to index from an inference input to a message. Necessary since there can be more inference - inputs than messages (i.e., if some messages get broken into multiple inference requests). - - """ - input__0: dataclasses.InitVar[cp.ndarray] = DataClassProp(get_input, set_input) - seq_ids: dataclasses.InitVar[cp.ndarray] = DataClassProp(get_input, set_input) - - def __post_init__(self, input__0, seq_ids): - self.input__0 = input__0 - self.seq_ids = seq_ids - - -@dataclasses.dataclass -class InferenceMemoryAE(InferenceMemory, cpp_class=None): - """ - This is a container class for data that needs to be submitted to the inference server for FIL category - usecases. - - Parameters - ---------- - input__0 : cupy.ndarray - Inference input. - seq_ids : cupy.ndarray - Ids used to index from an inference input to a message. Necessary since there can be more inference - inputs than messages (i.e., if some messages get broken into multiple inference requests). - - """ - input: dataclasses.InitVar[cp.ndarray] = DataClassProp(get_input, set_input) - seq_ids: dataclasses.InitVar[cp.ndarray] = DataClassProp(get_input, set_input) - - def __post_init__(self, input, seq_ids): - self.input = input - self.seq_ids = seq_ids - - -@dataclasses.dataclass -class MultiInferenceMessage(MultiMessage, cpp_class=neom.MultiInferenceMessage): - """ - This is a container class that holds the InferenceMemory container and the metadata of the data contained - within it. Builds on top of the `MultiMessage` class to add additional data for inferencing. - - This class requires two separate memory blocks for a batch. One for the message metadata (i.e., start time, - IP address, etc.) and another for the raw inference inputs (i.e., input_ids, seq_ids). Since there can be - more inference input requests than messages (This happens when some messages get broken into multiple - inference requests) this class stores two different offset and count values. `mess_offset` and - `mess_count` refer to the offset and count in the message metadata batch and `offset` and `count` index - into the inference batch data. - - Parameters - ---------- - memory : `InferenceMemory` - Inference memory. - offset : int - Message offset in inference memory instance. - count : int - Message count in inference memory instance. - - """ - memory: InferenceMemory = dataclasses.field(repr=False) - offset: int - count: int - - @property - def inputs(self): - """ - Get inputs stored in the InferenceMemory container. - - Returns - ------- - cupy.ndarray - Inference inputs. - - """ - - return {key: self.get_input(key) for key in self.memory.inputs.keys()} - - def __getstate__(self): - return self.__dict__ - - def __setstate__(self, d): - self.__dict__ = d - - def __getattr__(self, name: str) -> typing.Any: - - input_val = self.memory.inputs.get(name, None) - - if (input_val is not None): - return input_val[self.offset:self.offset + self.count, :] - - raise AttributeError - - def get_input(self, name: str): - """ - Get input stored in the InferenceMemory container. - - Parameters - ---------- - name : str - Input key name. - - Returns - ------- - cupy.ndarray - Inference input. - - """ - - return self.memory.inputs[name][self.offset:self.offset + self.count, :] - - def get_slice(self, start, stop): - """ - Returns sliced batches based on offsets supplied. Automatically calculates the correct `mess_offset` - and `mess_count`. - - Parameters - ---------- - start : int - Start offset address. - stop : int - Stop offset address. - - Returns - ------- - `MultiInferenceMessage` - A new `MultiInferenceMessage` with sliced offset and count. - - """ - mess_start = self.mess_offset + self.seq_ids[start, 0].item() - mess_stop = self.mess_offset + self.seq_ids[stop - 1, 0].item() + 1 - return MultiInferenceMessage(meta=self.meta, - mess_offset=mess_start, - mess_count=mess_stop - mess_start, - memory=self.memory, - offset=start, - count=stop - start) - - -@dataclasses.dataclass -class MultiInferenceNLPMessage(MultiInferenceMessage, cpp_class=neom.MultiInferenceNLPMessage): - """ - A stronger typed version of `MultiInferenceMessage` that is used for NLP workloads. Helps ensure the - proper inputs are set and eases debugging. - """ - - @property - def input_ids(self): - """ - Returns token-ids for each string padded with 0s to max_length. - - Returns - ------- - cupy.ndarray - The token-ids for each string padded with 0s to max_length. - - """ - - return self.get_input("input_ids") - - @property - def input_mask(self): - """ - Returns mask for token-ids result where corresponding positions identify valid token-id values. - - Returns - ------- - cupy.ndarray - The mask for token-ids result where corresponding positions identify valid token-id values. - - """ - - return self.get_input("input_mask") - - @property - def seq_ids(self): - """ - Returns sequence ids, which are used to keep track of which inference requests belong to each message. - - Returns - ------- - cupy.ndarray - Ids used to index from an inference input to a message. Necessary since there can be more - inference inputs than messages (i.e., if some messages get broken into multiple inference requests). - - """ - - return self.get_input("seq_ids") - - -@dataclasses.dataclass -class MultiInferenceFILMessage(MultiInferenceMessage, cpp_class=neom.MultiInferenceFILMessage): - """ - A stronger typed version of `MultiInferenceMessage` that is used for FIL workloads. Helps ensure the - proper inputs are set and eases debugging. - """ - - @property - def input__0(self): - """ - Input to FIL model inference. - - Returns - ------- - cupy.ndarray - Input data. - - """ - - return self.get_input("input__0") - - @property - def seq_ids(self): - """ - Returns sequence ids, which are used to keep track of messages in a multi-threaded environment. - - Returns - ------- - cupy.ndarray - Sequence ids. - - """ - - return self.get_input("seq_ids") - - -def get_output(instance: "ResponseMemory", name: str): - """ - Getter function used with DataClassProp for getting inference output from message containers derived - from ResponseMemory. - - Parameters - ---------- - instance : `ResponseMemory` - Message container holding outputs. - name : str - Key used to do lookup in outputs dict of message container. - - Returns - ------- - cupy.ndarray - Outputs corresponding to name. - - Raises - ------ - AttributeError - If output name does not exist in message container. - - """ - - if (name not in instance.outputs): - raise AttributeError - - return instance.outputs[name] - - -def set_output(instance: "ResponseMemory", name: str, value): - """ - Setter function used with DataClassProp for setting output in message containers derived - from ResponseMemory. - - Parameters - ---------- - instance : `ResponseMemory` - Message container holding outputs. - name : str - Key used to do lookup in outputs dict of message container. - value : cupy.ndarray - Value to set for input. - """ - - # Ensure that we have 2D array here (`ensure_2d` inserts the wrong axis) - instance.outputs[name] = value if value.ndim == 2 else cp.reshape(value, (value.shape[0], -1)) - - -@dataclasses.dataclass -class ResponseMemory(MessageData, cpp_class=neom.ResponseMemory): - """ - Output memory block holding the results of inference. - """ - count: int - - outputs: typing.Dict[str, cp.ndarray] = dataclasses.field(default_factory=dict, init=False) - - def get_output(self, name: str): - if (name not in self.outputs): - raise KeyError - - return self.outputs[name] - - -@dataclasses.dataclass -class ResponseMemoryProbs(ResponseMemory, cpp_class=neom.ResponseMemoryProbs): - probs: dataclasses.InitVar[cp.ndarray] = DataClassProp(get_output, set_output) - - def __post_init__(self, probs): - self.probs = probs - - -@dataclasses.dataclass -class ResponseMemoryAE(ResponseMemoryProbs, cpp_class=None): - user_id: str = "" - - -@dataclasses.dataclass -class MultiResponseMessage(MultiMessage, cpp_class=neom.MultiResponseMessage): - """ - This class contains several inference responses as well as the cooresponding message metadata. - - Parameters - ---------- - memory : `ResponseMemory` - This is a response container instance for triton inference requests. - offset : int - Offset of each response message into the `ResponseMemory` block. - count : int - Inference results size of all responses. - - """ - memory: ResponseMemory = dataclasses.field(repr=False) - offset: int - count: int - - @property - def outputs(self): - """ - Get outputs stored in the ResponseMemory container. - - Returns - ------- - cupy.ndarray - Inference outputs. - - """ - - return {key: self.get_output(key) for key in self.memory.outputs.keys()} - - def __getattr__(self, name: str) -> typing.Any: - - output_val = self.memory.outputs.get(name, None) - - if (output_val is not None): - return output_val[self.offset:self.offset + self.count, :] - - raise AttributeError - - def get_output(self, name: str): - """ - Get output stored in the ResponseMemory container. - - Parameters - ---------- - name : str - Output key name. - - Returns - ------- - cupy.ndarray - Inference output. - - """ - - return self.memory.outputs[name][self.offset:self.offset + self.count, :] - - # def get_slice(self, start, stop): - # """ - # Returns sliced batches based on offsets supplied. Automatically calculates the correct `mess_offset` - # and `mess_count`. - - # Parameters - # ---------- - # start : int - # Start offset address. - # stop : int - # Stop offset address. - - # Returns - # ------- - # morpheus.messages.MultiResponseMessage - # A new `MultiResponseMessage` with sliced offset and count. - - # """ - # mess_start = self.seq_ids[start, 0].item() - # mess_stop = self.seq_ids[stop - 1, 0].item() + 1 - # return MultiResponseMessage(meta=self.meta, - # mess_offset=mess_start, - # mess_count=mess_stop - mess_start, - # memory=self.memory, - # offset=start, - # count=stop - start) - - -@dataclasses.dataclass -class MultiResponseProbsMessage(MultiResponseMessage, cpp_class=neom.MultiResponseProbsMessage): - """ - A stronger typed version of `MultiResponseMessage` that is used for inference workloads that return a probability - array. Helps ensure the proper outputs are set and eases debugging. - """ - - @property - def probs(self): - """ - Probabilities of prediction. - - Returns - ------- - cupy.ndarray - probabilities - - """ - - return self.get_output("probs") - - -@dataclasses.dataclass -class MultiResponseAEMessage(MultiResponseProbsMessage, cpp_class=None): - """ - A stronger typed version of `MultiResponseProbsMessage` that is used for inference workloads that return a - probability array. Helps ensure the proper outputs are set and eases debugging. - """ - - user_id: str diff --git a/morpheus/pipeline/multi_message_stage.py b/morpheus/pipeline/multi_message_stage.py new file mode 100644 index 0000000000..f465c2a669 --- /dev/null +++ b/morpheus/pipeline/multi_message_stage.py @@ -0,0 +1,71 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import time + +import neo + +import morpheus.pipeline as _pipeline +from morpheus.config import Config +from morpheus.messages import MultiMessage +from morpheus.pipeline.stream_pair import StreamPair + +logger = logging.getLogger(__name__) + + +def _get_time_ms(): + return round(time.time() * 1000) + + +class MultiMessageStage(_pipeline.SinglePortStage): + """ + Subclass of SinglePortStage with option to log timestamps in MessageMeta dataframe. + + Parameters + ---------- + c : `morpheus.config.Config` + Pipeline configuration instance. + """ + + def __init__(self, c: Config): + + # Derived classes should set this to true to log timestamps in debug builds + self._should_log_timestamps = False + + super().__init__(c) + + def _post_build_single(self, seg: neo.Segment, out_pair: StreamPair) -> StreamPair: + + # Check if we are debug and should log timestamps + if (self._config.debug and self._should_log_timestamps): + # Cache the name property. Removes dependency on self in callback + cached_name = self.name + + logger.info("Adding timestamp info for stage: '%s'", cached_name) + + def post_timestamps(x: MultiMessage): + + curr_time = _get_time_ms() + + x.set_meta("_ts_" + cached_name, curr_time) + + # Only have one port + post_ts = seg.make_node(self.unique_name + "-ts", post_timestamps) + seg.make_edge(out_pair[0], post_ts) + + # Keep the type unchanged + out_pair = (post_ts, out_pair[1]) + + return super()._post_build_single(seg, out_pair) diff --git a/morpheus/pipeline/pipeline.py b/morpheus/pipeline/pipeline.py index 994dc4d0b1..625dd50fa2 100644 --- a/morpheus/pipeline/pipeline.py +++ b/morpheus/pipeline/pipeline.py @@ -13,832 +13,29 @@ # limitations under the License. import asyncio -import collections -import inspect import logging import os import signal import time import typing -from abc import ABC -from abc import abstractmethod import neo import networkx -import typing_utils from tqdm import tqdm import cudf from morpheus.config import Config -from morpheus.config import CppConfig -from morpheus.pipeline.messages import MultiMessage -from morpheus.utils.atomic_integer import AtomicInteger -from morpheus.utils.type_utils import _DecoratorType -from morpheus.utils.type_utils import greatest_ancestor +from morpheus.pipeline.receiver import Receiver +from morpheus.pipeline.sender import Sender +from morpheus.pipeline.source_stage import SourceStage +from morpheus.pipeline.stage import Stage +from morpheus.pipeline.stream_wrapper import StreamWrapper from morpheus.utils.type_utils import pretty_print_type_name -config = Config() - logger = logging.getLogger(__name__) -def get_time_ms(): - return round(time.time() * 1000) - - -T = typing.TypeVar('T') - -StreamPair = typing.Tuple[neo.Node, typing.Type] - - -class Sender(): - """ - The `Sender` object represents a port on a `StreamWrapper` object that sends messages to a `Receiver`. - - Parameters - ---------- - parent : `morpheus.pipeline.pipeline.StreamWrapper` - Parent `StreamWrapper` object. - port_number : int - Sender port number. - """ - - def __init__(self, parent: "StreamWrapper", port_number: int): - - self._parent = parent - self.port_number = port_number - - self._output_receivers: typing.List[Receiver] = [] - - self._out_stream_pair: StreamPair = (None, None) - - @property - def parent(self): - return self._parent - - @property - def is_complete(self): - # Sender is complete when the type or stream has been set - return self._out_stream_pair != (None, None) - - @property - def out_pair(self): - return self._out_stream_pair - - @property - def out_stream(self): - return self._out_stream_pair[0] - - @property - def out_type(self): - return self._out_stream_pair[1] - - -class Receiver(): - """ - The `Receiver` object represents a downstream port on a `StreamWrapper` object that gets messages from a `Sender`. - - Parameters - ---------- - parent : `morpheus.pipeline.pipeline.StreamWrapper` - Parent `StreamWrapper` object. - port_number : int - Receiver port number. - """ - - def __init__(self, parent: "StreamWrapper", port_number: int): - - self._parent = parent - self.port_number = port_number - - self._is_linked = False - - self._input_type = None - self._input_stream = None - - self._input_senders: typing.List[Sender] = [] - - @property - def parent(self): - return self._parent - - @property - def is_complete(self): - """ - A receiver is complete if all input senders are also complete. - """ - return all([x.is_complete for x in self._input_senders]) - - @property - def is_partial(self): - """ - A receiver is partially complete if any input sender is complete. Receivers are usually partially complete if - there is a circular pipeline. - """ - # Its partially complete if any input sender is complete - return any([x.is_complete for x in self._input_senders]) - - @property - def in_pair(self): - return (self.in_stream, self.in_pair) - - @property - def in_stream(self): - return self._input_stream - - @property - def in_type(self): - return self._input_type - - def get_input_pair(self) -> StreamPair: - - assert self.is_partial, "Must be partially complete to get the input pair!" - - # Build the input from the senders - if (self._input_stream is None and self._input_type is None): - # First check if we only have 1 input sender - if (len(self._input_senders) == 1): - # In this case, our input stream/type is determined from the sole Sender - sender = self._input_senders[0] - - self._input_stream = sender.out_stream - self._input_type = sender.out_type - self._is_linked = True - else: - # We have multiple senders. Create a dummy stream to connect all senders - if (self.is_complete): - # Connect all streams now - # self._input_stream = streamz.Stream(upstreams=[x.out_stream for x in self._input_senders], - # asynchronous=True, - # loop=IOLoop.current()) - raise NotImplementedError("Still using streamz") - self._is_linked = True - else: - # Create a dummy stream that needs to be linked later - # self._input_stream = streamz.Stream(asynchronous=True, loop=IOLoop.current()) - raise NotImplementedError("Still using streamz") - - # Now determine the output type from what we have - great_ancestor = greatest_ancestor(*[x.out_type for x in self._input_senders if x.is_complete]) - - if (great_ancestor is None): - # TODO: Add stage, port, and type info to message - raise RuntimeError(("Cannot determine single type for senders of input port. " - "Use a merge stage to handle different types of inputs.")) - - self._input_type = great_ancestor - - return (self._input_stream, self._input_type) - - def link(self): - """ - The linking phase determines the final type of the `Receiver` and connects all underlying stages. - - Raises: - RuntimeError: Throws a `RuntimeError` if the predicted input port type determined during the build phase is - different than the current port type. - """ - - assert self.is_complete, "Must be complete before linking!" - - if (self._is_linked): - return - - # Check that the types still work - great_ancestor = greatest_ancestor(*[x.out_type for x in self._input_senders if x.is_complete]) - - if (not typing_utils.issubtype(great_ancestor, self._input_type)): - # TODO: Add stage, port, and type info to message - raise RuntimeError( - "Invalid linking phase. Input port type does not match predicted type determined during build phase") - - for out_stream in [x.out_stream for x in self._input_senders]: - out_stream.connect(self._input_stream) - - self._is_linked = True - - -def _save_init_vals(func: _DecoratorType) -> _DecoratorType: - - # Save the signature only once - sig = inspect.signature(func, follow_wrapped=True) - - def inner(self: "StreamWrapper", c: Config, *args, **kwargs): - - # Actually call init first. This way any super classes strings will be overridden - func(self, c, *args, **kwargs) - - # Determine all set values - bound = sig.bind(self, c, *args, **kwargs) - bound.apply_defaults() - - init_pairs = [] - - for key, val in bound.arguments.items(): - - # We really dont care about these - if (key == "self" or key == "c"): - continue - - init_pairs.append(f"{key}={val}") - - # Save values on self - self._init_str = ", ".join(init_pairs) - - return - - return typing.cast(_DecoratorType, inner) - - -class StreamWrapper(ABC, collections.abc.Hashable): - """ - This abstract class serves as the morpheus.pipeline's base class. This class wraps a `neo.Node` - object and aids in hooking stages up together. - - Parameters - ---------- - c : `morpheus.config.Config` - Pipeline configuration instance. - - """ - - __ID_COUNTER = AtomicInteger(0) - - def __init__(self, c: Config): - self._id = StreamWrapper.__ID_COUNTER.get_and_inc() - self._pipeline: Pipeline = None - self._init_str: str = "" # Stores the initialization parameters used for creation. Needed for __repr__ - - # Indicates whether or not this wrapper has been built. Can only be built once - self._is_built = False - - # Input/Output ports used for connecting stages - self._input_ports: typing.List[Receiver] = [] - self._output_ports: typing.List[Sender] = [] - - def __init_subclass__(cls) -> None: - - # Wrap __init__ to save the arg values - cls.__init__ = _save_init_vals(cls.__init__) - - return super().__init_subclass__() - - def __hash__(self) -> int: - return self._id - - def __str__(self): - text = f"<{self.unique_name}; {self.__class__.__name__}({self._init_str})>" - - return text - - __repr__ = __str__ - - @property - @abstractmethod - def name(self) -> str: - """ - The name of the stage. Used in logging. Each derived class should override this property with a unique - name. - - Returns - ------- - str - Name of a stage. - - """ - pass - - @property - def unique_name(self) -> str: - """ - Unique name of stag. Generated by appending stage id to stage name. - - Returns - ------- - str - Unique name of stage. - """ - return f"{self.name}-{self._id}" - - @property - def is_built(self) -> bool: - """ - Indicates if this stage has been built. - - Returns - ------- - bool - True if stage is built, False otherwise. - """ - return self._is_built - - @property - def input_ports(self) -> typing.List[Receiver]: - """Input ports to this stage. - - Returns - ------- - typing.List[`morpheus.pipeline.pipeline.Receiver`] - Input ports to this stage. - """ - return self._input_ports - - @property - def output_ports(self) -> typing.List[Sender]: - """ - Output ports from this stage. - - Returns - ------- - typing.List[`morpheus.pipeline.pipeline.Sender`] - Output ports from this stage. - """ - return self._output_ports - - @property - def has_multi_input_ports(self) -> bool: - """ - Indicates if this stage has multiple input ports. - - Returns - ------- - bool - True if stage has multiple input ports, False otherwise. - """ - return len(self._input_ports) > 1 - - @property - def has_multi_output_ports(self) -> bool: - """ - Indicates if this stage has multiple output ports. - - Returns - ------- - bool - True if stage has multiple output ports, False otherwise. - """ - return len(self._output_ports) > 1 - - def get_all_inputs(self) -> typing.List[Sender]: - """ - Get all input senders to this stage. - - Returns - ------- - typing.List[`morpheus.pipeline.pipeline.Sender`] - All input senders. - """ - - senders = [] - - for in_port in self._input_ports: - senders.extend(in_port._input_senders) - - return senders - - def get_all_input_stages(self) -> typing.List["StreamWrapper"]: - """ - Get all input stages to this stage. - - Returns - ------- - typing.List[`morpheus.pipeline.pipeline.StreamWrapper`] - All input stages. - """ - return [x.parent for x in self.get_all_inputs()] - - def get_all_outputs(self) -> typing.List[Receiver]: - """ - Get all output receivers from this stage. - - Returns - ------- - typing.List[`morpheus.pipeline.pipeline.Receiver`] - All output receivers. - """ - receivers = [] - - for out_port in self._output_ports: - receivers.extend(out_port._output_receivers) - - return receivers - - def get_all_output_stages(self) -> typing.List["StreamWrapper"]: - """ - Get all output stages from this stage. - - Returns - ------- - typing.List[`morpheus.pipeline.pipeline.StreamWrapper`] - All output stages. - """ - return [x.parent for x in self.get_all_outputs()] - - def supports_cpp_node(self): - """ - Specifies whether this Stage is even capable of creating C++ nodes. During the build phase, this value will be - combined with Config.get().use_cpp to determine whether or not a C++ node is created. This is an instance method - to allow runtime decisions and derived classes to override base implementations. - """ - # By default, return False unless otherwise specified - return False - - def _build_cpp_node(self): - """ - Specifies whether or not to build a C++ node. Only should be called during the build phase. - """ - return CppConfig.get_should_use_cpp() and self.supports_cpp_node() - - def can_build(self, check_ports=False) -> bool: - """ - Determines if all inputs have been built allowing this node to be built. - - Parameters - ---------- - check_ports : bool, optional - Check if we can build based on the input ports, by default False. - - Returns - ------- - bool - True if we can build, False otherwise. - """ - - # Can only build once - if (self.is_built): - return False - - if (not check_ports): - # We can build if all input stages have been built. Easy and quick check. Works for non-circular pipelines - for in_stage in self.get_all_input_stages(): - if (not in_stage.is_built): - return False - - return True - else: - # Check if we can build based on the input ports. We can build - for r in self.input_ports: - if (not r.is_partial): - return False - - return True - - def build(self, seg: neo.Segment, do_propagate=True): - """Build this stage. - - Parameters - ---------- - seg : `neo.Segment` - Neo segment for this stage. - do_propagate : bool, optional - Whether to propagate to build output stages, by default True. - - """ - assert not self.is_built, "Can only build stages once!" - assert self._pipeline is not None, "Must be attached to a pipeline before building!" - - # Pre-Build returns the input pairs for each port - in_ports_pairs = self._pre_build() - - out_ports_pair = self._build(seg, in_ports_pairs) - - # Allow stages to do any post build steps (i.e., for sinks, or timing functions) - out_ports_pair = self._post_build(seg, out_ports_pair) - - assert len(out_ports_pair) == len(self.output_ports), \ - "Build must return same number of output pairs as output ports" - - # Assign the output ports - for port_idx, out_pair in enumerate(out_ports_pair): - self.output_ports[port_idx]._out_stream_pair = out_pair - - self._is_built = True - - if (not do_propagate): - return - - # Now build for any dependents - for dep in self.get_all_output_stages(): - if (not dep.can_build()): - continue - - dep.build(seg, do_propagate=do_propagate) - - def _pre_build(self) -> typing.List[StreamPair]: - in_pairs: typing.List[StreamPair] = [x.get_input_pair() for x in self.input_ports] - - return in_pairs - - @abstractmethod - def _build(self, seg: neo.Segment, in_ports_streams: typing.List[StreamPair]) -> typing.List[StreamPair]: - """ - This function is responsible for constructing this stage's internal `neo.Node` object. The input - of this function contains the returned value from the upstream stage. - - The input values are the `neo.Segment` for this stage and a `StreamPair` tuple which contain the input - `neo.Node` object and the message data type. - - :meta public: - - Parameters - ---------- - seg : `neo.Segment` - `neo.Segment` object for the pipeline. This should be used to construct/attach the internal `neo.Node`. - in_ports_streams : `morpheus.pipeline.pipeline.StreamPair` - List of tuples containing the input `neo.Node` object and the message data type. - - Returns - ------- - `typing.List[morpheus.pipeline.pipeline.StreamPair]` - List of tuples containing the output `neo.Node` object from this stage and the message data type. - - """ - pass - - def _post_build(self, seg: neo.Segment, out_ports_pair: typing.List[StreamPair]) -> typing.List[StreamPair]: - return out_ports_pair - - def start(self): - - assert self.is_built, "Must build before starting!" - - self._start() - - def _start(self): - pass - - def stop(self): - """ - Stages can implement this to perform cleanup steps when pipeline is stopped. - """ - pass - - async def join(self): - pass - - def _create_ports(self, input_count: int, output_count: int): - assert len(self._input_ports) == 0 and len(self._output_ports) == 0, "Can only create ports once!" - - self._input_ports = [Receiver(parent=self, port_number=i) for i in range(input_count)] - self._output_ports = [Sender(parent=self, port_number=i) for i in range(output_count)] - - -class SourceStage(StreamWrapper): - """ - The SourceStage is mandatory for the Morpheus pipeline to run. This stage represents the start of the pipeline. All - `SourceStage` object take no input but generate output. - - Parameters - ---------- - c : `morpheus.config.Config` - Pipeline configuration instance. - - """ - - def __init__(self, c: Config): - super().__init__(c) - - self._start_callbacks: typing.List[typing.Callable] = [] - self._stop_callbacks: typing.List[typing.Callable] = [] - - self._source_stream: neo.Node = None - - @property - def input_count(self) -> int: - """ - Return None for no max intput count. - - Returns - ------- - int - Input count. - - """ - return None - - @abstractmethod - def _build_source(self, seg: neo.Segment) -> StreamPair: - """ - Abstract method all derived Source classes should implement. Returns the same value as `build`. - - :meta public: - - Returns - ------- - - `morpheus.pipeline.pipeline.StreamPair`: - A tuple containing the output `neo.Node` object from this stage and the message data type. - """ - - pass - - @typing.final - def _build(self, seg: neo.Segment, in_ports_streams: typing.List[StreamPair]) -> typing.List[StreamPair]: - # Derived source stages should override `_build_source` instead of this method. This allows for tracking the - # True source object separate from the output stream. If any other operators need to be added after the source, - # use `_post_build` - assert len(self.input_ports) == 0, "Sources shouldnt have input ports" - - source_pair = self._build_source(seg) - - curr_source = source_pair[0] - - self._source_stream = curr_source - - # Now setup the output ports - self._output_ports[0]._out_stream_pair = source_pair - - return [source_pair] - - def _post_build(self, seg: neo.Segment, out_ports_pair: typing.List[StreamPair]) -> typing.List[StreamPair]: - - return out_ports_pair - - def _start(self): - self._source_stream.start() - - def stop(self): - self._source_stream.stop() - - async def join(self): - self._source_stream.join() - - -class SingleOutputSource(SourceStage): - """ - Subclass of SourceStage for building source stages that generate output for single port. - - Parameters - ---------- - c : `morpheus.config.Config` - Pipeline configuration instance. - """ - - def __init__(self, c: Config): - super().__init__(c) - - self._create_ports(0, 1) - - def _post_build_single(self, seg: neo.Segment, out_pair: StreamPair) -> StreamPair: - return out_pair - - @typing.final - def _post_build(self, seg: neo.Segment, out_ports_pair: typing.List[StreamPair]) -> typing.List[StreamPair]: - - ret_val = self._post_build_single(seg, out_ports_pair[0]) - - logger.info("Added source: {}\n └─> {}".format(str(self), pretty_print_type_name(ret_val[1]))) - - return [ret_val] - - -class Stage(StreamWrapper): - """ - This class serves as the base for all pipeline stage implementations that are not source objects. - - Parameters - ---------- - c : `morpheus.config.Config` - Pipeline configuration instance. - - """ - - def __init__(self, c: Config): - super().__init__(c) - - def _post_build(self, seg: neo.Segment, out_ports_pair: typing.List[StreamPair]) -> typing.List[StreamPair]: - - return out_ports_pair - - def _start(self): - pass - - def on_start(self): - """ - This function can be overridden to add usecase-specific implementation at the start of any stage in - the pipeline. - """ - pass - - def _on_complete(self, stream): - - logger.info("Stage Complete: {}".format(self.name)) - - -class SinglePortStage(Stage): - """ - Class used for building stages with single input port and single output port. - - Parameters - ---------- - c : `morpheus.config.Config` - Pipeline configuration instance. - """ - - def __init__(self, c: Config): - super().__init__(c) - - self._create_ports(1, 1) - - @abstractmethod - def accepted_types(self) -> typing.Tuple: - """ - Accepted input types for this stage are returned. Derived classes should override this method. An - error will be generated if the input types to the stage do not match one of the available types - returned from this method. - - Returns - ------- - typing.Tuple - Accepted input types. - - """ - pass - - def _pre_build(self) -> typing.List[StreamPair]: - in_ports_pairs = super()._pre_build() - - # Check the types of all inputs - for x in in_ports_pairs: - if (not typing_utils.issubtype(x[1], typing.Union[self.accepted_types()])): - raise RuntimeError("The {} stage cannot handle input of {}. Accepted input types: {}".format( - self.name, x[1], self.accepted_types())) - - return in_ports_pairs - - @abstractmethod - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - pass - - def _build(self, seg: neo.Segment, in_ports_streams: typing.List[StreamPair]) -> typing.List[StreamPair]: - # Derived source stages should override `_build_source` instead of this method. This allows for tracking the - # True source object separate from the output stream. If any other operators need to be added after the source, - # use `_post_build` - assert len(self.input_ports) == 1 and len(self.output_ports) == 1, \ - "SinglePortStage must have 1 input port and 1 output port" - - assert len(in_ports_streams) == 1, "Should only have 1 port on input" - - return [self._build_single(seg, in_ports_streams[0])] - - def _post_build_single(self, seg: neo.Segment, out_pair: StreamPair) -> StreamPair: - return out_pair - - @typing.final - def _post_build(self, seg: neo.Segment, out_ports_pair: typing.List[StreamPair]) -> typing.List[StreamPair]: - - ret_val = self._post_build_single(seg, out_ports_pair[0]) - - logger.info("Added stage: {}\n └─ {} -> {}".format(str(self), - pretty_print_type_name(self.input_ports[0].in_type), - pretty_print_type_name(ret_val[1]))) - - return [ret_val] - - -class MultiMessageStage(SinglePortStage): - """ - Subclass of SinglePortStage with option to log timestamps in MessageMeta dataframe. - - Parameters - ---------- - c : `morpheus.config.Config` - Pipeline configuration instance. - """ - - def __init__(self, c: Config): - - # Derived classes should set this to true to log timestamps in debug builds - self._should_log_timestamps = False - - super().__init__(c) - - def _post_build_single(self, seg: neo.Segment, out_pair: StreamPair) -> StreamPair: - - # Check if we are debug and should log timestamps - if (config.debug and self._should_log_timestamps): - # Cache the name property. Removes dependency on self in callback - cached_name = self.name - - logger.info("Adding timestamp info for stage: '%s'", cached_name) - - def post_timestamps(x: MultiMessage): - - curr_time = get_time_ms() - - x.set_meta("_ts_" + cached_name, curr_time) - - # Only have one port - post_ts = seg.make_node(self.unique_name + "-ts", post_timestamps) - seg.make_edge(out_pair[0], post_ts) - - # Keep the type unchanged - out_pair = (post_ts, out_pair[1]) - - return super()._post_build_single(seg, out_pair) - - class Pipeline(): """ Class for building your pipeline. A pipeline for your use case can be constructed by first adding a @@ -1237,71 +434,3 @@ def run(self): # Use asyncio.run() to launch the pipeline. This creates and destroys an event loop so re-running a pipeline in # the same process wont fail asyncio.run(self._do_run()) - - -class LinearPipeline(Pipeline): - """ - This class is used to build linear pipelines where we have a single output source stage followed by stages that are - executed sequentially in the order they were added. - - Parameters - ---------- - c : `morpheus.config.Config` - Pipeline configuration instance. - """ - - def __init__(self, c: Config): - super().__init__(c) - - self._linear_stages: typing.List[StreamWrapper] = [] - - def set_source(self, source: SourceStage): - """ - Set a pipeline's source stage to consume messages before it begins executing stages. This must be - called once before `build_and_start`. - - Parameters - ---------- - source : `SourceStage` - The source stage wraps the implementation in a stream that allows it to read from Kafka or a file. - - """ - - if (len(self._sources) > 0 and source not in self._sources): - logger.warning( - "LinearPipeline already has a source. Setting a new source will clear out all existing stages") - - self._sources.clear() - - # Store the source in sources - self._sources.add(source) - - if (len(self._linear_stages) > 0): - logger.warning("Clearing %d stages from pipeline", len(self._linear_stages)) - self._linear_stages.clear() - - # Need to store the source in the pipeline - super().add_node(source) - - # Store this as the first one in the linear stages. Must be index 0 - self._linear_stages.append(source) - - def add_stage(self, stage: SinglePortStage): - """ - Add stages to the pipeline. All `Stage` classes added with this method will be executed sequentially - inthe order they were added. - - Parameters - ---------- - stage : `Stage` - The stage object to add. It cannot be already added to another `Pipeline` object. - - """ - - assert len(self._linear_stages) > 0, "A source must be set on a LinearPipeline before adding any stages" - assert isinstance(stage, SinglePortStage), "Only `SinglePortStage` stages are accepted in `add_stage()`" - - # Make an edge between the last node and this one - self.add_edge(self._linear_stages[-1], stage) - - self._linear_stages.append(stage) diff --git a/morpheus/pipeline/preprocessing.py b/morpheus/pipeline/preprocessing.py deleted file mode 100644 index 7bd698858a..0000000000 --- a/morpheus/pipeline/preprocessing.py +++ /dev/null @@ -1,473 +0,0 @@ -# Copyright (c) 2021-2022, NVIDIA CORPORATION. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import inspect -import logging -import typing -from abc import abstractmethod -from functools import partial - -import cupy as cp -import neo -import numpy as np -import pandas as pd -import typing_utils -from neo.core import operators as ops - -import cudf -from cudf.core.subword_tokenizer import SubwordTokenizer - -import morpheus._lib.stages as neos -from morpheus.config import Config -from morpheus.config import CppConfig -from morpheus.pipeline.messages import InferenceMemoryFIL -from morpheus.pipeline.messages import InferenceMemoryNLP -from morpheus.pipeline.messages import MessageMeta -from morpheus.pipeline.messages import MultiInferenceFILMessage -from morpheus.pipeline.messages import MultiInferenceMessage -from morpheus.pipeline.messages import MultiInferenceNLPMessage -from morpheus.pipeline.messages import MultiMessage -from morpheus.pipeline.pipeline import MultiMessageStage -from morpheus.pipeline.pipeline import SinglePortStage -from morpheus.pipeline.pipeline import StreamPair -from morpheus.utils.cudf_subword_helper import tokenize_text_series - -logger = logging.getLogger(__name__) - - -class DeserializeStage(MultiMessageStage): - """ - This stage deserialize the output of `FileSourceStage`/`KafkaSourceStage` into a `MultiMessage`. This - should be one of the first stages after the `Source` object. - - Parameters - ---------- - c : `morpheus.config.Config` - Pipeline configuration instance. - - """ - - def __init__(self, c: Config): - super().__init__(c) - - self._batch_size = c.pipeline_batch_size - - self._max_concurrent = c.num_threads - - # Mark these stages to log timestamps if requested - self._should_log_timestamps = True - - @property - def name(self) -> str: - return "deserialize" - - def accepted_types(self) -> typing.Tuple: - """ - Returns accepted input types for this stage. - - """ - return (MessageMeta) - - @staticmethod - def process_dataframe(x: MessageMeta, batch_size: int) -> typing.List[MultiMessage]: - """ - The deserialization of the cudf is implemented in this function. - - Parameters - ---------- - x : cudf.DataFrame - Input rows that needs to be deserilaized. - batch_size : int - Batch size. - - """ - - full_message = MultiMessage(meta=x, mess_offset=0, mess_count=x.count) - - # Now break it up by batches - output = [] - - for i in range(0, full_message.mess_count, batch_size): - output.append(full_message.get_slice(i, min(i + batch_size, full_message.mess_count))) - - return output - - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - - stream = input_stream[0] - out_type = MultiMessage - - def node_fn(input: neo.Observable, output: neo.Subscriber): - - input.pipe(ops.map(partial(DeserializeStage.process_dataframe, batch_size=self._batch_size)), - ops.flatten()).subscribe(output) - - if CppConfig.get_should_use_cpp(): - stream = neos.DeserializeStage(seg, self.unique_name, self._batch_size) - else: - stream = seg.make_node_full(self.unique_name, node_fn) - - seg.make_edge(input_stream[0], stream) - - return stream, out_type - - -class DropNullStage(SinglePortStage): - """ - Drop null/empty data input entries. - - Parameters - ---------- - c : `morpheus.config.Config` - Pipeline configuration instance. - column : str - Column name to perform null check. - - """ - - def __init__(self, c: Config, column: str): - super().__init__(c) - - self._column = column - - # Mark these stages to log timestamps if requested - self._should_log_timestamps = True - - @property - def name(self) -> str: - return "dropna" - - def accepted_types(self) -> typing.Tuple: - """ - Accepted input types for this stage are returned. - - Returns - ------- - typing.Tuple - Accepted input types. - - """ - return (MessageMeta, ) - - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - stream = input_stream[0] - - # Finally, flatten to a single stream - def node_fn(input: neo.Observable, output: neo.Subscriber): - - def on_next(x: MessageMeta): - - y = MessageMeta(x.df[~x.df[self._column].isna()]) - - return y - - input.pipe(ops.map(on_next), ops.filter(lambda x: not x.df.empty)).subscribe(output) - - node = seg.make_node_full(self.unique_name, node_fn) - seg.make_edge(stream, node) - stream = node - - return stream, input_stream[1] - - -class PreprocessBaseStage(MultiMessageStage): - """ - This is a base pre-processing class holding general functionality for all preprocessing stages. - - Parameters - ---------- - c : `morpheus.config.Config` - Pipeline configuration instance. - - """ - - def __init__(self, c: Config): - super().__init__(c) - - self._should_log_timestamps = True - - def accepted_types(self) -> typing.Tuple: - """ - Returns accepted input types for this stage. - - """ - return (MultiMessage, ) - - @abstractmethod - def _get_preprocess_fn(self) -> typing.Callable[[MultiMessage], MultiInferenceMessage]: - pass - - @abstractmethod - def _get_preprocess_node(self, seg: neo.Segment): - pass - - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - - stream = input_stream[0] - out_type = MultiInferenceMessage - - preprocess_fn = self._get_preprocess_fn() - - preproc_sig = inspect.signature(preprocess_fn) - - # If the innerfunction returns a type annotation, update the output type - if (preproc_sig.return_annotation and typing_utils.issubtype(preproc_sig.return_annotation, out_type)): - out_type = preproc_sig.return_annotation - - if CppConfig.get_should_use_cpp(): - stream = self._get_preprocess_node(seg) - else: - stream = seg.make_node(self.unique_name, preprocess_fn) - - seg.make_edge(input_stream[0], stream) - - return stream, out_type - - -class PreprocessNLPStage(PreprocessBaseStage): - """ - NLP usecases are preprocessed with this stage class. - - Parameters - ---------- - c : `morpheus.config.Config` - Pipeline configuration instance. - vocab_hashfile : str - Path to hash file containing vocabulary of words with token-ids. This can be created from the raw vocabulary - using the `cudf.utils.hash_vocab_utils.hash_vocab` function. - truncation : bool - If set to true, strings will be truncated and padded to max_length. Each input string will result in exactly one - output sequence. If set to false, there may be multiple output sequences when the max_length is smaller - than generated tokens. - do_lower_case : bool - If set to true, original text will be lowercased before encoding. - add_special_tokens : bool - Whether or not to encode the sequences with the special tokens of the BERT classification model. - stride : int - If `truncation` == False and the tokenized string is larger than max_length, the sequences containing the - overflowing token-ids can contain duplicated token-ids from the main sequence. If max_length is equal to stride - there are no duplicated-id tokens. If stride is 80% of max_length, 20% of the first sequence will be repeated on - the second sequence and so on until the entire sentence is encoded. - - """ - - def __init__(self, - c: Config, - vocab_hash_file: str, - truncation: bool, - do_lower_case: bool, - add_special_tokens: bool, - stride: int = -1): - super().__init__(c) - - self._seq_length = c.feature_length - self._vocab_hash_file = vocab_hash_file - - if (stride <= 0): - # Set the stride to 75%. Works well with powers of 2 - self._stride = self._seq_length // 2 - self._stride = self._stride + self._stride // 2 - else: - # Use the given value - self._stride = stride - - self._truncation = truncation - self._do_lower_case = do_lower_case - self._add_special_tokens = add_special_tokens - - self._tokenizer: SubwordTokenizer = None - - @property - def name(self) -> str: - return "preprocess-nlp" - - @staticmethod - def pre_process_batch(x: MultiMessage, - vocab_hash_file: str, - do_lower_case: bool, - seq_len: int, - stride: int, - truncation: bool, - add_special_tokens: bool) -> MultiInferenceNLPMessage: - """ - For NLP category usecases, this function performs pre-processing. - - Parameters - ---------- - x : `morpheus.pipeline.messages.MultiMessage` - Input rows received from Deserialized stage. - vocab_hashfile : str - Path to hash file containing vocabulary of words with token-ids. This can be created from the raw vocabulary - using the `cudf.utils.hash_vocab_utils.hash_vocab` function. - do_lower_case : bool - If set to true, original text will be lowercased before encoding. - seq_len : int - Limits the length of the sequence returned. If tokenized string is shorter than max_length, output will be - padded with 0s. If the tokenized string is longer than max_length and do_truncate == False, there will be - multiple returned sequences containing the overflowing token-ids. - stride : int - If do_truncate == False and the tokenized string is larger than max_length, the sequences containing the - overflowing token-ids can contain duplicated token-ids from the main sequence. If max_length is equal to - stride there are no duplicated-id tokens. If stride is 80% of max_length, 20% of the first sequence will be - repeated on the second sequence and so on until the entire sentence is encoded. - truncation : bool - If set to true, strings will be truncated and padded to max_length. Each input string will result in exactly - one output sequence. If set to false, there may be multiple output sequences when the max_length is smaller - than generated tokens. - add_special_tokens : bool - Whether or not to encode the sequences with the special tokens of the BERT classification model. - - Returns - ------- - `morpheus.pipeline.messages.MultiInferenceNLPMessage` - NLP inference message. - - """ - text_ser = cudf.Series(x.get_meta("data")) - - tokenized = tokenize_text_series(vocab_hash_file=vocab_hash_file, - do_lower_case=do_lower_case, - text_ser=text_ser, - seq_len=seq_len, - stride=stride, - truncation=truncation, - add_special_tokens=add_special_tokens) - del text_ser - - # Create the inference memory. Keep in mind count here could be > than input count - memory = InferenceMemoryNLP(count=tokenized.input_ids.shape[0], - input_ids=tokenized.input_ids, - input_mask=tokenized.input_mask, - seq_ids=tokenized.segment_ids) - - infer_message = MultiInferenceNLPMessage(meta=x.meta, - mess_offset=x.mess_offset, - mess_count=x.mess_count, - memory=memory, - offset=0, - count=memory.count) - - return infer_message - - def _get_preprocess_fn(self) -> typing.Callable[[MultiMessage], MultiInferenceMessage]: - - return partial(PreprocessNLPStage.pre_process_batch, - vocab_hash_file=self._vocab_hash_file, - do_lower_case=self._do_lower_case, - stride=self._stride, - seq_len=self._seq_length, - truncation=self._truncation, - add_special_tokens=self._add_special_tokens) - - def _get_preprocess_node(self, seg: neo.Segment): - return neos.PreprocessNLPStage(seg, - self.unique_name, - self._vocab_hash_file, - self._seq_length, - self._truncation, - self._do_lower_case, - self._add_special_tokens, - self._stride) - - -class PreprocessFILStage(PreprocessBaseStage): - """ - FIL usecases are preprocessed with this stage class. - - Parameters - ---------- - c : `morpheus.config.Config` - Pipeline configuration instance. - - """ - - def __init__(self, c: Config): - super().__init__(c) - - self._fea_length = c.feature_length - self.features = c.fil.feature_columns - - assert self._fea_length == len(self.features), \ - f"Number of features in preprocessing {len(self.features)}, does not match configuration {self._fea_length}" - - @property - def name(self) -> str: - return "preprocess-fil" - - @staticmethod - def pre_process_batch(x: MultiMessage, fea_len: int, fea_cols: typing.List[str]) -> MultiInferenceFILMessage: - """ - For FIL category usecases, this function performs pre-processing. - - Parameters - ---------- - x : `morpheus.pipeline.messages.MultiMessage` - Input rows received from Deserialized stage. - fea_len : int - Number features are being used in the inference. - fea_cols : typing.Tuple[str] - List of columns that are used as features. - - Returns - ------- - `morpheus.pipeline.messages.MultiInferenceFILMessage` - FIL inference message. - - """ - - try: - df = x.get_meta(fea_cols) - except KeyError: - logger.exception("Cound not get metadat for columns.") - return None - - # Extract just the numbers from each feature col. Not great to operate on x.meta.df here but the operations will - # only happen once. - for col in fea_cols: - if (df[col].dtype == np.dtype(str) or df[col].dtype == np.dtype(object)): - # If the column is a string, parse the number - df[col] = df[col].str.extract(r"(\d+)", expand=False).astype("float32") - elif (df[col].dtype != np.float32): - # Convert to float32 - df[col] = df[col].astype("float32") - - if (isinstance(df, pd.DataFrame)): - df = cudf.from_pandas(df) - - # Convert the dataframe to cupy the same way cuml does - data = cp.asarray(df.as_gpu_matrix(order='C')) - - count = data.shape[0] - - seg_ids = cp.zeros((count, 3), dtype=cp.uint32) - seg_ids[:, 0] = cp.arange(0, count, dtype=cp.uint32) - seg_ids[:, 2] = fea_len - 1 - - # Create the inference memory. Keep in mind count here could be > than input count - memory = InferenceMemoryFIL(count=count, input__0=data, seq_ids=seg_ids) - - infer_message = MultiInferenceFILMessage(meta=x.meta, - mess_offset=x.mess_offset, - mess_count=x.mess_count, - memory=memory, - offset=0, - count=memory.count) - - return infer_message - - def _get_preprocess_fn(self) -> typing.Callable[[MultiMessage], MultiInferenceMessage]: - return partial(PreprocessFILStage.pre_process_batch, fea_len=self._fea_length, fea_cols=self.features) - - def _get_preprocess_node(self, seg: neo.Segment): - return neos.PreprocessFILStage(seg, self.unique_name, self.features) diff --git a/morpheus/pipeline/receiver.py b/morpheus/pipeline/receiver.py new file mode 100644 index 0000000000..7ef8d72fac --- /dev/null +++ b/morpheus/pipeline/receiver.py @@ -0,0 +1,148 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import typing + +import typing_utils + +import morpheus.pipeline as _pipeline +from morpheus.pipeline.stream_pair import StreamPair +from morpheus.utils.type_utils import greatest_ancestor + +logger = logging.getLogger(__name__) + + +class Receiver(): + """ + The `Receiver` object represents a downstream port on a `StreamWrapper` object that gets messages from a `Sender`. + + Parameters + ---------- + parent : `morpheus.pipeline.pipeline.StreamWrapper` + Parent `StreamWrapper` object. + port_number : int + Receiver port number. + """ + + def __init__(self, parent: "_pipeline.StreamWrapper", port_number: int): + + self._parent = parent + self.port_number = port_number + + self._is_linked = False + + self._input_type = None + self._input_stream = None + + self._input_senders: typing.List[_pipeline.Sender] = [] + + @property + def parent(self): + return self._parent + + @property + def is_complete(self): + """ + A receiver is complete if all input senders are also complete. + """ + return all([x.is_complete for x in self._input_senders]) + + @property + def is_partial(self): + """ + A receiver is partially complete if any input sender is complete. Receivers are usually partially complete if + there is a circular pipeline. + """ + # Its partially complete if any input sender is complete + return any([x.is_complete for x in self._input_senders]) + + @property + def in_pair(self): + return (self.in_stream, self.in_pair) + + @property + def in_stream(self): + return self._input_stream + + @property + def in_type(self): + return self._input_type + + def get_input_pair(self) -> StreamPair: + + assert self.is_partial, "Must be partially complete to get the input pair!" + + # Build the input from the senders + if (self._input_stream is None and self._input_type is None): + # First check if we only have 1 input sender + if (len(self._input_senders) == 1): + # In this case, our input stream/type is determined from the sole Sender + sender = self._input_senders[0] + + self._input_stream = sender.out_stream + self._input_type = sender.out_type + self._is_linked = True + else: + # We have multiple senders. Create a dummy stream to connect all senders + if (self.is_complete): + # Connect all streams now + # self._input_stream = streamz.Stream(upstreams=[x.out_stream for x in self._input_senders], + # asynchronous=True, + # loop=IOLoop.current()) + raise NotImplementedError("Still using streamz") + self._is_linked = True + else: + # Create a dummy stream that needs to be linked later + # self._input_stream = streamz.Stream(asynchronous=True, loop=IOLoop.current()) + raise NotImplementedError("Still using streamz") + + # Now determine the output type from what we have + great_ancestor = greatest_ancestor(*[x.out_type for x in self._input_senders if x.is_complete]) + + if (great_ancestor is None): + # TODO: Add stage, port, and type info to message + raise RuntimeError(("Cannot determine single type for senders of input port. " + "Use a merge stage to handle different types of inputs.")) + + self._input_type = great_ancestor + + return (self._input_stream, self._input_type) + + def link(self): + """ + The linking phase determines the final type of the `Receiver` and connects all underlying stages. + + Raises: + RuntimeError: Throws a `RuntimeError` if the predicted input port type determined during the build phase is + different than the current port type. + """ + + assert self.is_complete, "Must be complete before linking!" + + if (self._is_linked): + return + + # Check that the types still work + great_ancestor = greatest_ancestor(*[x.out_type for x in self._input_senders if x.is_complete]) + + if (not typing_utils.issubtype(great_ancestor, self._input_type)): + # TODO: Add stage, port, and type info to message + raise RuntimeError( + "Invalid linking phase. Input port type does not match predicted type determined during build phase") + + for out_stream in [x.out_stream for x in self._input_senders]: + out_stream.connect(self._input_stream) + + self._is_linked = True diff --git a/morpheus/pipeline/sender.py b/morpheus/pipeline/sender.py new file mode 100644 index 0000000000..1465e11cc3 --- /dev/null +++ b/morpheus/pipeline/sender.py @@ -0,0 +1,64 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import typing + +import morpheus.pipeline as _pipeline +from morpheus.pipeline.stream_pair import StreamPair + +logger = logging.getLogger(__name__) + + +class Sender(): + """ + The `Sender` object represents a port on a `StreamWrapper` object that sends messages to a `Receiver`. + + Parameters + ---------- + parent : `morpheus.pipeline.pipeline.StreamWrapper` + Parent `StreamWrapper` object. + port_number : int + Sender port number. + """ + + def __init__(self, parent: "_pipeline.StreamWrapper", port_number: int): + + self._parent = parent + self.port_number = port_number + + self._output_receivers: typing.List[_pipeline.Receiver] = [] + + self._out_stream_pair: StreamPair = (None, None) + + @property + def parent(self): + return self._parent + + @property + def is_complete(self): + # Sender is complete when the type or stream has been set + return self._out_stream_pair != (None, None) + + @property + def out_pair(self): + return self._out_stream_pair + + @property + def out_stream(self): + return self._out_stream_pair[0] + + @property + def out_type(self): + return self._out_stream_pair[1] diff --git a/morpheus/pipeline/single_output_source.py b/morpheus/pipeline/single_output_source.py new file mode 100644 index 0000000000..45e414b6ea --- /dev/null +++ b/morpheus/pipeline/single_output_source.py @@ -0,0 +1,53 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import typing + +import neo + +import morpheus.pipeline as _pipeline +from morpheus.config import Config +from morpheus.pipeline.stream_pair import StreamPair +from morpheus.utils.type_utils import pretty_print_type_name + +logger = logging.getLogger(__name__) + + +class SingleOutputSource(_pipeline.SourceStage): + """ + Subclass of SourceStage for building source stages that generate output for single port. + + Parameters + ---------- + c : `morpheus.config.Config` + Pipeline configuration instance. + """ + + def __init__(self, c: Config): + super().__init__(c) + + self._create_ports(0, 1) + + def _post_build_single(self, seg: neo.Segment, out_pair: StreamPair) -> StreamPair: + return out_pair + + @typing.final + def _post_build(self, seg: neo.Segment, out_ports_pair: typing.List[StreamPair]) -> typing.List[StreamPair]: + + ret_val = self._post_build_single(seg, out_ports_pair[0]) + + logger.info("Added source: {}\n └─> {}".format(str(self), pretty_print_type_name(ret_val[1]))) + + return [ret_val] diff --git a/morpheus/pipeline/single_port_stage.py b/morpheus/pipeline/single_port_stage.py new file mode 100644 index 0000000000..ca712fb0a1 --- /dev/null +++ b/morpheus/pipeline/single_port_stage.py @@ -0,0 +1,98 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import typing +from abc import abstractmethod + +import neo +import typing_utils + +import morpheus.pipeline as _pipeline +from morpheus.config import Config +from morpheus.pipeline.stream_pair import StreamPair +from morpheus.utils.type_utils import pretty_print_type_name + +logger = logging.getLogger(__name__) + + +class SinglePortStage(_pipeline.Stage): + """ + Class used for building stages with single input port and single output port. + + Parameters + ---------- + c : `morpheus.config.Config` + Pipeline configuration instance. + """ + + def __init__(self, c: Config): + super().__init__(c) + + self._create_ports(1, 1) + + @abstractmethod + def accepted_types(self) -> typing.Tuple: + """ + Accepted input types for this stage are returned. Derived classes should override this method. An + error will be generated if the input types to the stage do not match one of the available types + returned from this method. + + Returns + ------- + typing.Tuple + Accepted input types. + + """ + pass + + def _pre_build(self) -> typing.List[StreamPair]: + in_ports_pairs = super()._pre_build() + + # Check the types of all inputs + for x in in_ports_pairs: + if (not typing_utils.issubtype(x[1], typing.Union[self.accepted_types()])): + raise RuntimeError("The {} stage cannot handle input of {}. Accepted input types: {}".format( + self.name, x[1], self.accepted_types())) + + return in_ports_pairs + + @abstractmethod + def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + pass + + def _build(self, seg: neo.Segment, in_ports_streams: typing.List[StreamPair]) -> typing.List[StreamPair]: + # Derived source stages should override `_build_source` instead of this method. This allows for tracking the + # True source object separate from the output stream. If any other operators need to be added after the source, + # use `_post_build` + assert len(self.input_ports) == 1 and len(self.output_ports) == 1, \ + "SinglePortStage must have 1 input port and 1 output port" + + assert len(in_ports_streams) == 1, "Should only have 1 port on input" + + return [self._build_single(seg, in_ports_streams[0])] + + def _post_build_single(self, seg: neo.Segment, out_pair: StreamPair) -> StreamPair: + return out_pair + + @typing.final + def _post_build(self, seg: neo.Segment, out_ports_pair: typing.List[StreamPair]) -> typing.List[StreamPair]: + + ret_val = self._post_build_single(seg, out_ports_pair[0]) + + logger.info("Added stage: {}\n └─ {} -> {}".format(str(self), + pretty_print_type_name(self.input_ports[0].in_type), + pretty_print_type_name(ret_val[1]))) + + return [ret_val] diff --git a/morpheus/pipeline/source_stage.py b/morpheus/pipeline/source_stage.py new file mode 100644 index 0000000000..7787e5f584 --- /dev/null +++ b/morpheus/pipeline/source_stage.py @@ -0,0 +1,106 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import typing +from abc import abstractmethod + +import neo + +import morpheus.pipeline as _pipeline +from morpheus.config import Config +from morpheus.pipeline.stream_pair import StreamPair + +logger = logging.getLogger(__name__) + + +class SourceStage(_pipeline.StreamWrapper): + """ + The SourceStage is mandatory for the Morpheus pipeline to run. This stage represents the start of the pipeline. All + `SourceStage` object take no input but generate output. + + Parameters + ---------- + c : `morpheus.config.Config` + Pipeline configuration instance. + + """ + + def __init__(self, c: Config): + super().__init__(c) + + self._start_callbacks: typing.List[typing.Callable] = [] + self._stop_callbacks: typing.List[typing.Callable] = [] + + self._source_stream: neo.Node = None + + @property + def input_count(self) -> int: + """ + Return None for no max intput count. + + Returns + ------- + int + Input count. + + """ + return None + + @abstractmethod + def _build_source(self, seg: neo.Segment) -> StreamPair: + """ + Abstract method all derived Source classes should implement. Returns the same value as `build`. + + :meta public: + + Returns + ------- + + `morpheus.pipeline.pipeline.StreamPair`: + A tuple containing the output `neo.Node` object from this stage and the message data type. + """ + + pass + + @typing.final + def _build(self, seg: neo.Segment, in_ports_streams: typing.List[StreamPair]) -> typing.List[StreamPair]: + # Derived source stages should override `_build_source` instead of this method. This allows for tracking the + # True source object separate from the output stream. If any other operators need to be added after the source, + # use `_post_build` + assert len(self.input_ports) == 0, "Sources shouldnt have input ports" + + source_pair = self._build_source(seg) + + curr_source = source_pair[0] + + self._source_stream = curr_source + + # Now setup the output ports + self._output_ports[0]._out_stream_pair = source_pair + + return [source_pair] + + def _post_build(self, seg: neo.Segment, out_ports_pair: typing.List[StreamPair]) -> typing.List[StreamPair]: + + return out_ports_pair + + def _start(self): + self._source_stream.start() + + def stop(self): + self._source_stream.stop() + + async def join(self): + self._source_stream.join() diff --git a/morpheus/pipeline/stage.py b/morpheus/pipeline/stage.py new file mode 100644 index 0000000000..d46cc29d69 --- /dev/null +++ b/morpheus/pipeline/stage.py @@ -0,0 +1,57 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import typing + +import neo + +import morpheus.pipeline as _pipeline +from morpheus.config import Config +from morpheus.pipeline.stream_pair import StreamPair + +logger = logging.getLogger(__name__) + + +class Stage(_pipeline.StreamWrapper): + """ + This class serves as the base for all pipeline stage implementations that are not source objects. + + Parameters + ---------- + c : `morpheus.config.Config` + Pipeline configuration instance. + + """ + + def __init__(self, c: Config): + super().__init__(c) + + def _post_build(self, seg: neo.Segment, out_ports_pair: typing.List[StreamPair]) -> typing.List[StreamPair]: + + return out_ports_pair + + def _start(self): + pass + + def on_start(self): + """ + This function can be overridden to add usecase-specific implementation at the start of any stage in + the pipeline. + """ + pass + + def _on_complete(self, stream): + + logger.info("Stage Complete: {}".format(self.name)) diff --git a/morpheus/pipeline/stream_pair.py b/morpheus/pipeline/stream_pair.py new file mode 100644 index 0000000000..5d6ff86508 --- /dev/null +++ b/morpheus/pipeline/stream_pair.py @@ -0,0 +1,20 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import typing + +import neo + +StreamPair = typing.Tuple[neo.Node, typing.Type] diff --git a/morpheus/pipeline/stream_wrapper.py b/morpheus/pipeline/stream_wrapper.py new file mode 100644 index 0000000000..4802607cd9 --- /dev/null +++ b/morpheus/pipeline/stream_wrapper.py @@ -0,0 +1,400 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import collections +import inspect +import logging +import typing +from abc import ABC +from abc import abstractmethod + +import neo + +import morpheus.pipeline as _pipeline +from morpheus.config import Config +from morpheus.config import CppConfig +from morpheus.pipeline.stream_pair import StreamPair +from morpheus.utils.atomic_integer import AtomicInteger +from morpheus.utils.type_utils import _DecoratorType + +logger = logging.getLogger(__name__) + + +def _save_init_vals(func: _DecoratorType) -> _DecoratorType: + + # Save the signature only once + sig = inspect.signature(func, follow_wrapped=True) + + def inner(self: "StreamWrapper", c: Config, *args, **kwargs): + + # Actually call init first. This way any super classes strings will be overridden + func(self, c, *args, **kwargs) + + # Determine all set values + bound = sig.bind(self, c, *args, **kwargs) + bound.apply_defaults() + + init_pairs = [] + + for key, val in bound.arguments.items(): + + # We really dont care about these + if (key == "self" or key == "c"): + continue + + init_pairs.append(f"{key}={val}") + + # Save values on self + self._init_str = ", ".join(init_pairs) + + return + + return typing.cast(_DecoratorType, inner) + + +class StreamWrapper(ABC, collections.abc.Hashable): + """ + This abstract class serves as the morpheus.pipeline's base class. This class wraps a `neo.Node` + object and aids in hooking stages up together. + + Parameters + ---------- + c : `morpheus.config.Config` + Pipeline configuration instance. + + """ + + __ID_COUNTER = AtomicInteger(0) + + def __init__(self, c: Config): + # Save the config + self._config = c + + self._id = StreamWrapper.__ID_COUNTER.get_and_inc() + self._pipeline: _pipeline.Pipeline = None + self._init_str: str = "" # Stores the initialization parameters used for creation. Needed for __repr__ + + # Indicates whether or not this wrapper has been built. Can only be built once + self._is_built = False + + # Input/Output ports used for connecting stages + self._input_ports: typing.List[_pipeline.Receiver] = [] + self._output_ports: typing.List[_pipeline.Sender] = [] + + def __init_subclass__(cls) -> None: + + # Wrap __init__ to save the arg values + cls.__init__ = _save_init_vals(cls.__init__) + + return super().__init_subclass__() + + def __hash__(self) -> int: + return self._id + + def __str__(self): + text = f"<{self.unique_name}; {self.__class__.__name__}({self._init_str})>" + + return text + + __repr__ = __str__ + + @property + @abstractmethod + def name(self) -> str: + """ + The name of the stage. Used in logging. Each derived class should override this property with a unique + name. + + Returns + ------- + str + Name of a stage. + + """ + pass + + @property + def unique_name(self) -> str: + """ + Unique name of stag. Generated by appending stage id to stage name. + + Returns + ------- + str + Unique name of stage. + """ + return f"{self.name}-{self._id}" + + @property + def is_built(self) -> bool: + """ + Indicates if this stage has been built. + + Returns + ------- + bool + True if stage is built, False otherwise. + """ + return self._is_built + + @property + def input_ports(self) -> typing.List[_pipeline.Receiver]: + """Input ports to this stage. + + Returns + ------- + typing.List[`morpheus.pipeline.pipeline.Receiver`] + Input ports to this stage. + """ + return self._input_ports + + @property + def output_ports(self) -> typing.List[_pipeline.Sender]: + """ + Output ports from this stage. + + Returns + ------- + typing.List[`morpheus.pipeline.pipeline.Sender`] + Output ports from this stage. + """ + return self._output_ports + + @property + def has_multi_input_ports(self) -> bool: + """ + Indicates if this stage has multiple input ports. + + Returns + ------- + bool + True if stage has multiple input ports, False otherwise. + """ + return len(self._input_ports) > 1 + + @property + def has_multi_output_ports(self) -> bool: + """ + Indicates if this stage has multiple output ports. + + Returns + ------- + bool + True if stage has multiple output ports, False otherwise. + """ + return len(self._output_ports) > 1 + + def get_all_inputs(self) -> typing.List[_pipeline.Sender]: + """ + Get all input senders to this stage. + + Returns + ------- + typing.List[`morpheus.pipeline.pipeline.Sender`] + All input senders. + """ + + senders = [] + + for in_port in self._input_ports: + senders.extend(in_port._input_senders) + + return senders + + def get_all_input_stages(self) -> typing.List["StreamWrapper"]: + """ + Get all input stages to this stage. + + Returns + ------- + typing.List[`morpheus.pipeline.pipeline.StreamWrapper`] + All input stages. + """ + return [x.parent for x in self.get_all_inputs()] + + def get_all_outputs(self) -> typing.List[_pipeline.Receiver]: + """ + Get all output receivers from this stage. + + Returns + ------- + typing.List[`morpheus.pipeline.pipeline.Receiver`] + All output receivers. + """ + receivers = [] + + for out_port in self._output_ports: + receivers.extend(out_port._output_receivers) + + return receivers + + def get_all_output_stages(self) -> typing.List["StreamWrapper"]: + """ + Get all output stages from this stage. + + Returns + ------- + typing.List[`morpheus.pipeline.pipeline.StreamWrapper`] + All output stages. + """ + return [x.parent for x in self.get_all_outputs()] + + def supports_cpp_node(self): + """ + Specifies whether this Stage is even capable of creating C++ nodes. During the build phase, this value will be + combined with Config.get().use_cpp to determine whether or not a C++ node is created. This is an instance method + to allow runtime decisions and derived classes to override base implementations. + """ + # By default, return False unless otherwise specified + return False + + def _build_cpp_node(self): + """ + Specifies whether or not to build a C++ node. Only should be called during the build phase. + """ + return CppConfig.get_should_use_cpp() and self.supports_cpp_node() + + def can_build(self, check_ports=False) -> bool: + """ + Determines if all inputs have been built allowing this node to be built. + + Parameters + ---------- + check_ports : bool, optional + Check if we can build based on the input ports, by default False. + + Returns + ------- + bool + True if we can build, False otherwise. + """ + + # Can only build once + if (self.is_built): + return False + + if (not check_ports): + # We can build if all input stages have been built. Easy and quick check. Works for non-circular pipelines + for in_stage in self.get_all_input_stages(): + if (not in_stage.is_built): + return False + + return True + else: + # Check if we can build based on the input ports. We can build + for r in self.input_ports: + if (not r.is_partial): + return False + + return True + + def build(self, seg: neo.Segment, do_propagate=True): + """Build this stage. + + Parameters + ---------- + seg : `neo.Segment` + Neo segment for this stage. + do_propagate : bool, optional + Whether to propagate to build output stages, by default True. + + """ + assert not self.is_built, "Can only build stages once!" + assert self._pipeline is not None, "Must be attached to a pipeline before building!" + + # Pre-Build returns the input pairs for each port + in_ports_pairs = self._pre_build() + + out_ports_pair = self._build(seg, in_ports_pairs) + + # Allow stages to do any post build steps (i.e., for sinks, or timing functions) + out_ports_pair = self._post_build(seg, out_ports_pair) + + assert len(out_ports_pair) == len(self.output_ports), \ + "Build must return same number of output pairs as output ports" + + # Assign the output ports + for port_idx, out_pair in enumerate(out_ports_pair): + self.output_ports[port_idx]._out_stream_pair = out_pair + + self._is_built = True + + if (not do_propagate): + return + + # Now build for any dependents + for dep in self.get_all_output_stages(): + if (not dep.can_build()): + continue + + dep.build(seg, do_propagate=do_propagate) + + def _pre_build(self) -> typing.List[StreamPair]: + in_pairs: typing.List[StreamPair] = [x.get_input_pair() for x in self.input_ports] + + return in_pairs + + @abstractmethod + def _build(self, seg: neo.Segment, in_ports_streams: typing.List[StreamPair]) -> typing.List[StreamPair]: + """ + This function is responsible for constructing this stage's internal `neo.Node` object. The input + of this function contains the returned value from the upstream stage. + + The input values are the `neo.Segment` for this stage and a `StreamPair` tuple which contain the input + `neo.Node` object and the message data type. + + :meta public: + + Parameters + ---------- + seg : `neo.Segment` + `neo.Segment` object for the pipeline. This should be used to construct/attach the internal `neo.Node`. + in_ports_streams : `morpheus.pipeline.pipeline.StreamPair` + List of tuples containing the input `neo.Node` object and the message data type. + + Returns + ------- + `typing.List[morpheus.pipeline.pipeline.StreamPair]` + List of tuples containing the output `neo.Node` object from this stage and the message data type. + + """ + pass + + def _post_build(self, seg: neo.Segment, out_ports_pair: typing.List[StreamPair]) -> typing.List[StreamPair]: + return out_ports_pair + + def start(self): + + assert self.is_built, "Must build before starting!" + + self._start() + + def _start(self): + pass + + def stop(self): + """ + Stages can implement this to perform cleanup steps when pipeline is stopped. + """ + pass + + async def join(self): + pass + + def _create_ports(self, input_count: int, output_count: int): + assert len(self._input_ports) == 0 and len(self._output_ports) == 0, "Can only create ports once!" + + self._input_ports = [_pipeline.Receiver(parent=self, port_number=i) for i in range(input_count)] + self._output_ports = [_pipeline.Sender(parent=self, port_number=i) for i in range(output_count)] diff --git a/morpheus/stages/__init__.py b/morpheus/stages/__init__.py new file mode 100644 index 0000000000..45f26a9755 --- /dev/null +++ b/morpheus/stages/__init__.py @@ -0,0 +1,16 @@ +# Copyright (c) 2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +Package containing all Morpheus stages. +""" diff --git a/morpheus/stages/general/__init__.py b/morpheus/stages/general/__init__.py new file mode 100644 index 0000000000..1b50fee19f --- /dev/null +++ b/morpheus/stages/general/__init__.py @@ -0,0 +1,16 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +General stages that can be used at any point in a pipeline. +""" diff --git a/morpheus/stages/general/buffer_stage.py b/morpheus/stages/general/buffer_stage.py new file mode 100644 index 0000000000..ea5c2de455 --- /dev/null +++ b/morpheus/stages/general/buffer_stage.py @@ -0,0 +1,66 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import typing + +import neo + +from morpheus.config import Config +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair +from morpheus.utils.logging import deprecated_stage_warning + +logger = logging.getLogger(__name__) + + +class BufferStage(SinglePortStage): + """ + The input messages are buffered by this stage class for faster access to downstream stages. Allows + upstream stages to run faster than downstream stages. + + Parameters + ---------- + c : `morpheus.config.Config` + Pipeline configuration instance. + + """ + + def __init__(self, c: Config, count: int = 1000): + super().__init__(c) + + self._buffer_count = count + + @property + def name(self) -> str: + return "buffer" + + def accepted_types(self) -> typing.Tuple: + """ + Accepted input types for this stage are returned. + + Returns + ------- + typing.Tuple + Accepted input types. + + """ + return (typing.Any, ) + + def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + + # This stage is no longer needed and is just a pass thru stage + deprecated_stage_warning(logger, type(self), self.unique_name) + + return input_stream diff --git a/morpheus/stages/general/delay_stage.py b/morpheus/stages/general/delay_stage.py new file mode 100644 index 0000000000..789156d632 --- /dev/null +++ b/morpheus/stages/general/delay_stage.py @@ -0,0 +1,66 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import typing + +import neo + +from morpheus.config import Config +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair +from morpheus.utils.logging import deprecated_stage_warning + +logger = logging.getLogger(__name__) + + +class DelayStage(SinglePortStage): + """ + Delay stage class. Used to buffer all inputs until the timeout duration is hit. At that point all messages + will be dumped into downstream stages. Useful for testing performance of one stage at a time. + + Parameters + ---------- + c : `morpheus.config.Config` + Pipeline configuration instance. + + """ + + def __init__(self, c: Config, duration: str): + super().__init__(c) + + self._duration = duration + + @property + def name(self) -> str: + return "delay" + + def accepted_types(self) -> typing.Tuple: + """ + Accepted input types for this stage are returned. + + Returns + ------- + typing.Tuple + Accepted input types. + + """ + return (typing.Any, ) + + def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + + # This stage is no longer needed and is just a pass thru stage + deprecated_stage_warning(logger, type(self), self.unique_name) + + return input_stream diff --git a/morpheus/stages/general/monitor_stage.py b/morpheus/stages/general/monitor_stage.py new file mode 100644 index 0000000000..0fdf5ef0f4 --- /dev/null +++ b/morpheus/stages/general/monitor_stage.py @@ -0,0 +1,280 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import typing +from functools import reduce + +import neo +from tqdm import TMonitor +from tqdm import TqdmSynchronisationWarning +from tqdm import tqdm + +import cudf + +from morpheus.config import Config +from morpheus.messages import MessageMeta +from morpheus.messages import MultiMessage +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair + +logger = logging.getLogger(__name__) + + +# Functions exactly the same as TMonitor, except we do not check for `instance.miniters == 1` before updating. This +# allows the timer to update every 1 second on the screen making the pipeline feel running +class MorpheusTqdmMonitor(TMonitor): + + def run(self): + cur_t = self._time() + while True: + # After processing and before sleeping, notify that we woke + # Need to be done just before sleeping + self.woken = cur_t + # Sleep some time... + self.was_killed.wait(self.sleep_interval) + # Quit if killed + if self.was_killed.is_set(): + return + # Then monitor! + # Acquire lock (to access _instances) + with self.tqdm_cls.get_lock(): + cur_t = self._time() + # Check tqdm instances are waiting too long to print + instances = self.get_instances() + for instance in instances: + # Check event in loop to reduce blocking time on exit + if self.was_killed.is_set(): + return + # Only if mininterval > 1 (else iterations are just slow) + # and last refresh exceeded maxinterval + if ((cur_t - instance.last_print_t) >= instance.maxinterval): + # Refresh now! (works only for manual tqdm) + instance.refresh(nolock=True) + # Remove accidental long-lived strong reference + del instance + if instances != self.get_instances(): # pragma: nocover + logging.warn("Set changed size during iteration" + " (see https://github.com/tqdm/tqdm/issues/481)", + TqdmSynchronisationWarning, + stacklevel=2) + # Remove accidental long-lived strong references + del instances + + +class MorpheusTqdm(tqdm): + """ + Subclass of tqdm to provide slightly different functionality with their TMonitor. + + """ + monitor_interval = 1 # set to 0 to disable the thread + monitor: MorpheusTqdmMonitor = None + + def __new__(cls, *args, **kwargs): + with cls.get_lock(): # also constructs lock if non-existent + + if (cls.monitor is None or not cls.monitor.report()): + # Set the new type of monitor + cls.monitor = MorpheusTqdmMonitor(cls, cls.monitor_interval) + + return tqdm.__new__(cls, args, kwargs) + + def __init__(self, *args, **kwargs): + + # Must set this first + self.is_running = True + + super().__init__(*args, **kwargs) + + self.last_update_t = self.start_t + + @property + def format_dict(self): + + base_val = super().format_dict + + # If we arent running, dont increment the time + if (not self.is_running): + base_val["elapsed"] = self.last_update_t - self.start_t + + return base_val + + def update(self, n=1): + + self.last_update_t = self._time() + + return super().update(n) + + def stop(self): + + # Set is running to false to stop elapsed from incrementing + self.is_running = False + + +class MonitorStage(SinglePortStage): + """ + Monitor stage used to monitor stage performance metrics using Tqdm. Each Monitor Stage will represent one + line in the console window showing throughput statistics. Can be set up to show an instantaneous + throughput or average input. + + Parameters + ---------- + c : `morpheus.config.Config` + Pipeline configuration instance. + description : str + Name to show for this Monitor Stage in the console window. + smoothing : float + Smoothing parameter to determine how much the throughput should be averaged. 0 = Instantaneous, 1 = + Average. + unit : str + Units to show in the rate value. + delayed_start : bool + Delay start of progress bar. + determine_count_fn : typing.Callable[[typing.Any], int] + Custom function for determining the count in a message. Gets called for each message. Allows for + correct counting of batched and sliced messages. + + """ + stage_count: int = 0 + + def __init__(self, + c: Config, + description: str = "Progress", + smoothing: float = 0.05, + unit="messages", + delayed_start: bool = False, + determine_count_fn: typing.Callable[[typing.Any], int] = None): + super().__init__(c) + + self._progress: MorpheusTqdm = None + self._position = MonitorStage.stage_count + + MonitorStage.stage_count += 1 + + self._description = description + self._smoothing = smoothing + self._unit = unit + self._delayed_start = delayed_start + + self._determine_count_fn = determine_count_fn + + @property + def name(self) -> str: + return "monitor" + + def accepted_types(self) -> typing.Tuple: + """ + Accepted input types for this stage are returned. + + Returns + ------- + typing.Tuple + Accepted input types. + + """ + return (typing.Any, ) + + def on_start(self): + + # Set the monitor interval to 0 to use prevent using tqdms monitor + tqdm.monitor_interval = 0 + + # Start the progress bar if we dont have a delayed start + if (not self._delayed_start): + self._ensure_progress_bar() + + def stop(self): + if (self._progress is not None): + self._progress.close() + + def _ensure_progress_bar(self): + if (self._progress is None): + self._progress = MorpheusTqdm(desc=self._description, + smoothing=self._smoothing, + dynamic_ncols=True, + unit=self._unit, + mininterval=0.25, + maxinterval=1.0, + miniters=1, + position=self._position) + + self._progress.reset() + + def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + + def sink_on_error(x): + logger.error("Node: '%s' received error: %s", self.unique_name, x) + + def sink_on_completed(): + # Set the name to complete. This refreshes the display + self._progress.set_description_str(self._progress.desc + "[Complete]") + + self._progress.stop() + + # To prevent the monitors from writing over eachother, stop the monitor when the last stage completes + MonitorStage.stage_count -= 1 + + if (MonitorStage.stage_count <= 0 and MorpheusTqdm.monitor is not None): + MorpheusTqdm.monitor.exit() + MorpheusTqdm.monitor = None + + stream = seg.make_sink(self.unique_name, self._progress_sink, sink_on_error, sink_on_completed) + + seg.make_edge(input_stream[0], stream) + + return input_stream + + def _refresh_progress(self, _): + self._progress.refresh() + + def _progress_sink(self, x): + + # Make sure the progress bar is shown + self._ensure_progress_bar() + + if (self._determine_count_fn is None): + self._determine_count_fn = self._auto_count_fn(x) + + # Skip incase we have empty objects + if (self._determine_count_fn is None): + return + + # Do our best to determine the count + n = self._determine_count_fn(x) + + self._progress.update(n=n) + + def _auto_count_fn(self, x): + + if (x is None): + return None + + # Wait for a list thats not empty + if (isinstance(x, list) and len(x) == 0): + return None + + if (isinstance(x, cudf.DataFrame)): + return lambda y: len(y.index) + elif (isinstance(x, MultiMessage)): + return lambda y: y.mess_count + elif (isinstance(x, MessageMeta)): + return lambda y: y.count + elif (isinstance(x, list)): + item_count_fn = self._auto_count_fn(x[0]) + return lambda y: reduce(lambda sum, z, item_count_fn=item_count_fn: sum + item_count_fn(z), y, 0) + elif (isinstance(x, str)): + return lambda y: 1 + elif (hasattr(x, "__len__")): + return len # Return len directly (same as `lambda y: len(y)`) + else: + raise NotImplementedError("Unsupported type: {}".format(type(x))) diff --git a/morpheus/stages/general/trigger_stage.py b/morpheus/stages/general/trigger_stage.py new file mode 100644 index 0000000000..ef511158ac --- /dev/null +++ b/morpheus/stages/general/trigger_stage.py @@ -0,0 +1,69 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import typing + +import neo +from neo.core import operators as ops + +from morpheus.config import Config +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair + +logger = logging.getLogger(__name__) + + +class TriggerStage(SinglePortStage): + """ + This stage will buffer all inputs until the source stage is complete. At that point all messages + will be dumped into downstream stages. Useful for testing performance of one stage at a time. + + Parameters + ---------- + c : `morpheus.config.Config` + Pipeline configuration instance. + + """ + + def __init__(self, c: Config): + super().__init__(c) + + @property + def name(self) -> str: + return "trigger" + + def accepted_types(self) -> typing.Tuple: + """ + Accepted input types for this stage are returned. + + Returns + ------- + typing.Tuple + Accepted input types. + + """ + return (typing.Any, ) + + def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + + # Store all messages until on_complete is called and then push them + def node_fn(input: neo.Observable, output: neo.Subscriber): + + input.pipe(ops.to_list(), ops.flatten()).subscribe(output) + + node = seg.make_node_full(self.unique_name, node_fn) + seg.make_edge(input_stream[0], node) + + return node, input_stream[1] diff --git a/morpheus/pipeline/inference/__init__.py b/morpheus/stages/inference/__init__.py similarity index 100% rename from morpheus/pipeline/inference/__init__.py rename to morpheus/stages/inference/__init__.py diff --git a/morpheus/pipeline/inference/inference_ae.py b/morpheus/stages/inference/auto_encoder_inference_stage.py similarity index 58% rename from morpheus/pipeline/inference/inference_ae.py rename to morpheus/stages/inference/auto_encoder_inference_stage.py index 640400eeda..3f7a5a6646 100644 --- a/morpheus/pipeline/inference/inference_ae.py +++ b/morpheus/stages/inference/auto_encoder_inference_stage.py @@ -12,99 +12,21 @@ # See the License for the specific language governing permissions and # limitations under the License. -import dataclasses import typing import cupy as cp -from dfencoder.autoencoder import AutoEncoder from morpheus.config import Config -from morpheus.pipeline.inference.inference_stage import InferenceStage -from morpheus.pipeline.inference.inference_stage import InferenceWorker -from morpheus.pipeline.messages import MultiInferenceMessage -from morpheus.pipeline.messages import MultiResponseAEMessage -from morpheus.pipeline.messages import ResponseMemory -from morpheus.pipeline.messages import ResponseMemoryProbs -from morpheus.pipeline.messages import UserMessageMeta +from morpheus.messages import MultiResponseAEMessage +from morpheus.messages import ResponseMemory +from morpheus.messages import ResponseMemoryProbs +from morpheus.messages.multi_inference_ae_message import MultiInferenceAEMessage +from morpheus.stages.inference.inference_stage import InferenceStage +from morpheus.stages.inference.inference_stage import InferenceWorker from morpheus.utils.producer_consumer_queue import ProducerConsumerQueue -@dataclasses.dataclass -class MultiInferenceAEMessage(MultiInferenceMessage): - """ - A stronger typed version of `MultiInferenceMessage` that is used for AE workloads. Helps ensure the - proper inputs are set and eases debugging. Associates a user ID with a message. - """ - - model: AutoEncoder - - @property - def user_id(self): - """ - Returns the user ID associated with this message. - - """ - - return typing.cast(UserMessageMeta, self.meta).user_id - - @property - def input(self): - """ - Returns autoecoder input tensor. - - Returns - ------- - cupy.ndarray - The autoencoder input tensor. - - """ - - return self.get_input("input") - - @property - def seq_ids(self): - """ - Returns sequence ids, which are used to keep track of messages in a multi-threaded environment. - - Returns - ------- - cupy.ndarray - seq_ids - - """ - - return self.get_input("seq_ids") - - def get_slice(self, start, stop): - """ - Returns sliced batches based on offsets supplied. Automatically calculates the correct `mess_offset` - and `mess_count`. - - Parameters - ---------- - start : int - Start offset address. - stop : int - Stop offset address. - - Returns - ------- - `MultiInferenceAEMessage` - A new `MultiInferenceAEMessage` with sliced offset and count. - - """ - mess_start = self.mess_offset + self.seq_ids[start, 0].item() - mess_stop = self.mess_offset + self.seq_ids[stop - 1, 0].item() + 1 - return MultiInferenceAEMessage(meta=self.meta, - mess_offset=mess_start, - mess_count=mess_stop - mess_start, - memory=self.memory, - offset=start, - count=stop - start, - model=self.model) - - -class AutoEncoderInference(InferenceWorker): +class _AutoEncoderInferenceWorker(InferenceWorker): def __init__(self, inf_queue: ProducerConsumerQueue, c: Config): super().__init__(inf_queue) @@ -192,4 +114,4 @@ def __init__(self, c: Config): def _get_inference_worker(self, inf_queue: ProducerConsumerQueue) -> InferenceWorker: - return AutoEncoderInference(inf_queue, self._config) + return _AutoEncoderInferenceWorker(inf_queue, self._config) diff --git a/morpheus/pipeline/inference/inference_identity.py b/morpheus/stages/inference/identity_inference_stage.py similarity index 83% rename from morpheus/pipeline/inference/inference_identity.py rename to morpheus/stages/inference/identity_inference_stage.py index eb3ab729cd..7884b86b34 100644 --- a/morpheus/pipeline/inference/inference_identity.py +++ b/morpheus/stages/inference/identity_inference_stage.py @@ -17,15 +17,15 @@ import cupy as cp from morpheus.config import Config -from morpheus.pipeline.inference.inference_stage import InferenceStage -from morpheus.pipeline.inference.inference_stage import InferenceWorker -from morpheus.pipeline.messages import MultiInferenceMessage -from morpheus.pipeline.messages import ResponseMemory -from morpheus.pipeline.messages import ResponseMemoryProbs +from morpheus.messages import MultiInferenceMessage +from morpheus.messages import ResponseMemory +from morpheus.messages import ResponseMemoryProbs +from morpheus.stages.inference.inference_stage import InferenceStage +from morpheus.stages.inference.inference_stage import InferenceWorker from morpheus.utils.producer_consumer_queue import ProducerConsumerQueue -class IdentityInferenceWorker(InferenceWorker): +class _IdentityInferenceWorker(InferenceWorker): """ Worker used by IdentityInferenceStage to set inference probabilities to zeros. @@ -75,4 +75,4 @@ def __init__(self, c: Config): self._config = c def _get_inference_worker(self, inf_queue: ProducerConsumerQueue) -> InferenceWorker: - return IdentityInferenceWorker(inf_queue=inf_queue, c=self._config) + return _IdentityInferenceWorker(inf_queue=inf_queue, c=self._config) diff --git a/morpheus/pipeline/inference/inference_stage.py b/morpheus/stages/inference/inference_stage.py similarity index 97% rename from morpheus/pipeline/inference/inference_stage.py rename to morpheus/stages/inference/inference_stage.py index fb346548d9..61c6975376 100644 --- a/morpheus/pipeline/inference/inference_stage.py +++ b/morpheus/stages/inference/inference_stage.py @@ -22,12 +22,12 @@ from neo.core import operators as ops from morpheus.config import Config -from morpheus.pipeline.messages import MultiInferenceMessage -from morpheus.pipeline.messages import MultiResponseProbsMessage -from morpheus.pipeline.messages import ResponseMemory -from morpheus.pipeline.messages import ResponseMemoryProbs -from morpheus.pipeline.pipeline import MultiMessageStage -from morpheus.pipeline.pipeline import StreamPair +from morpheus.messages import MultiInferenceMessage +from morpheus.messages import MultiResponseProbsMessage +from morpheus.messages import ResponseMemory +from morpheus.messages import ResponseMemoryProbs +from morpheus.pipeline.multi_message_stage import MultiMessageStage +from morpheus.pipeline.stream_pair import StreamPair from morpheus.utils.producer_consumer_queue import ProducerConsumerQueue diff --git a/morpheus/pipeline/inference/inference_pytorch.py b/morpheus/stages/inference/pytorch_inference_stage.py similarity index 90% rename from morpheus/pipeline/inference/inference_pytorch.py rename to morpheus/stages/inference/pytorch_inference_stage.py index 5d9e62499c..3220abf142 100644 --- a/morpheus/pipeline/inference/inference_pytorch.py +++ b/morpheus/stages/inference/pytorch_inference_stage.py @@ -17,11 +17,11 @@ import cupy as cp from morpheus.config import Config -from morpheus.pipeline.inference.inference_stage import InferenceStage -from morpheus.pipeline.inference.inference_stage import InferenceWorker -from morpheus.pipeline.messages import MultiInferenceMessage -from morpheus.pipeline.messages import ResponseMemory -from morpheus.pipeline.messages import ResponseMemoryProbs +from morpheus.messages import MultiInferenceMessage +from morpheus.messages import ResponseMemory +from morpheus.messages import ResponseMemoryProbs +from morpheus.stages.inference.inference_stage import InferenceStage +from morpheus.stages.inference.inference_stage import InferenceWorker from morpheus.utils.producer_consumer_queue import ProducerConsumerQueue try: @@ -36,7 +36,7 @@ raise -class PyTorchInference(InferenceWorker): +class _PyTorchInferenceWorker(InferenceWorker): """ Inference worker used by PyTorchInferenceStage. @@ -124,4 +124,4 @@ def __init__(self, c: Config, model_filename: str): def _get_inference_worker(self, inf_queue: ProducerConsumerQueue) -> InferenceWorker: - return PyTorchInference(inf_queue, self._config, model_filename=self._model_filename) + return _PyTorchInferenceWorker(inf_queue, self._config, model_filename=self._model_filename) diff --git a/morpheus/pipeline/inference/inference_triton.py b/morpheus/stages/inference/triton_inference_stage.py similarity index 98% rename from morpheus/pipeline/inference/inference_triton.py rename to morpheus/stages/inference/triton_inference_stage.py index 11ceab6267..997eb46e42 100644 --- a/morpheus/pipeline/inference/inference_triton.py +++ b/morpheus/stages/inference/triton_inference_stage.py @@ -33,11 +33,11 @@ import morpheus._lib.stages as neos from morpheus.config import Config from morpheus.config import PipelineModes -from morpheus.pipeline.inference.inference_stage import InferenceStage -from morpheus.pipeline.inference.inference_stage import InferenceWorker -from morpheus.pipeline.messages import MultiInferenceMessage -from morpheus.pipeline.messages import ResponseMemory -from morpheus.pipeline.messages import ResponseMemoryProbs +from morpheus.messages import MultiInferenceMessage +from morpheus.messages import ResponseMemory +from morpheus.messages import ResponseMemoryProbs +from morpheus.stages.inference.inference_stage import InferenceStage +from morpheus.stages.inference.inference_stage import InferenceWorker from morpheus.utils.producer_consumer_queue import ProducerConsumerQueue logger = logging.getLogger(__name__) @@ -371,7 +371,7 @@ def build_input(self, name: str, data: cp.ndarray, force_convert_inputs: bool) - # This class is exclusively run in the worker thread. Separating the classes helps keeps the threads separate -class TritonInferenceWorker(InferenceWorker): +class _TritonInferenceWorker(InferenceWorker): """ This is a base class for all Triton inference server requests. @@ -598,7 +598,7 @@ def process(self, batch: MultiInferenceMessage, cb: typing.Callable[[ResponseMem outputs=outputs) -class TritonInferenceNLP(TritonInferenceWorker): +class TritonInferenceNLP(_TritonInferenceWorker): """ This class extends TritonInference to deal with scenario-specific NLP models inference requests like building response. @@ -670,7 +670,7 @@ def _build_response(self, batch: MultiInferenceMessage, result: tritonclient.Inf return mem -class TritonInferenceFIL(TritonInferenceWorker): +class TritonInferenceFIL(_TritonInferenceWorker): """ This class extends `TritonInference` to deal with scenario-specific FIL models inference requests like building response. @@ -738,7 +738,7 @@ def _build_response(self, batch: MultiInferenceMessage, result: tritonclient.Inf return mem -class TritonInferenceAE(TritonInferenceWorker): +class TritonInferenceAE(_TritonInferenceWorker): """ This class extends `TritonInference` to deal with inference processing specific to the AutoEncoder. diff --git a/morpheus/pipeline/input/__init__.py b/morpheus/stages/input/__init__.py similarity index 100% rename from morpheus/pipeline/input/__init__.py rename to morpheus/stages/input/__init__.py diff --git a/morpheus/pipeline/input/from_cloudtrail.py b/morpheus/stages/input/cloud_trail_source_stage.py similarity index 97% rename from morpheus/pipeline/input/from_cloudtrail.py rename to morpheus/stages/input/cloud_trail_source_stage.py index 451918f600..c4424ddc8a 100644 --- a/morpheus/pipeline/input/from_cloudtrail.py +++ b/morpheus/stages/input/cloud_trail_source_stage.py @@ -25,13 +25,13 @@ from neo.core import operators as ops from morpheus._lib.common import FiberQueue +from morpheus._lib.file_types import FileTypes from morpheus._lib.file_types import determine_file_type from morpheus.config import Config -from morpheus.pipeline.file_types import FileTypes -from morpheus.pipeline.input.utils import read_file_to_df -from morpheus.pipeline.messages import UserMessageMeta -from morpheus.pipeline.pipeline import SingleOutputSource -from morpheus.pipeline.pipeline import StreamPair +from morpheus.io.deserializers import read_file_to_df +from morpheus.messages import UserMessageMeta +from morpheus.pipeline.single_output_source import SingleOutputSource +from morpheus.pipeline.stream_pair import StreamPair from morpheus.utils.producer_consumer_queue import Closed logger = logging.getLogger(__name__) @@ -55,7 +55,7 @@ class CloudTrailSourceStage(SingleOutputSource): files. Any new files that are added that match the glob will then be processed. max_files: int, default = -1 Max number of files to read. Useful for debugging to limit startup time. Default value of -1 is unlimited. - file_type : `morpheus.pipeline.file_types.FileTypes`, default = 'FileTypes.Auto'. + file_type : `morpheus._lib.file_types.FileTypes`, default = 'FileTypes.Auto'. Indicates what type of file to read. Specifying 'auto' will determine the file type from the extension. Supported extensions: 'json', 'csv' repeat: int, default = 1 @@ -129,7 +129,7 @@ def read_file(filename: str, file_type: FileTypes) -> pd.DataFrame: ---------- filename : str Path to a file to read. - file_type : `morpheus.pipeline.file_types.FileTypes` + file_type : `morpheus._lib.file_types.FileTypes` What type of file to read. Leave as Auto to auto detect based on the file extension. Returns diff --git a/morpheus/pipeline/input/from_file.py b/morpheus/stages/input/file_source_stage.py similarity index 93% rename from morpheus/pipeline/input/from_file.py rename to morpheus/stages/input/file_source_stage.py index 2ddddaa540..9426cb764e 100644 --- a/morpheus/pipeline/input/from_file.py +++ b/morpheus/stages/input/file_source_stage.py @@ -20,13 +20,13 @@ from neo.core import operators as ops import morpheus._lib.stages as neos +from morpheus._lib.file_types import FileTypes from morpheus.config import Config from morpheus.config import CppConfig -from morpheus.pipeline.file_types import FileTypes -from morpheus.pipeline.input.utils import read_file_to_df -from morpheus.pipeline.messages import MessageMeta -from morpheus.pipeline.pipeline import SingleOutputSource -from morpheus.pipeline.pipeline import StreamPair +from morpheus.io.deserializers import read_file_to_df +from morpheus.messages import MessageMeta +from morpheus.pipeline.single_output_source import SingleOutputSource +from morpheus.pipeline.stream_pair import StreamPair logger = logging.getLogger(__name__) @@ -45,7 +45,7 @@ class FileSourceStage(SingleOutputSource): iterative: boolean Iterative mode will emit dataframes one at a time. Otherwise a list of dataframes is emitted. Iterative mode is good for interleaving source stages. - file_type : `morpheus.pipeline.file_types.FileTypes`, default = 'auto' + file_type : `morpheus._lib.file_types.FileTypes`, default = 'auto' Indicates what type of file to read. Specifying 'auto' will determine the file type from the extension. Supported extensions: 'json', 'csv' repeat: int, default = 1 diff --git a/morpheus/pipeline/input/from_kafka.py b/morpheus/stages/input/kafka_source_stage.py similarity index 98% rename from morpheus/pipeline/input/from_kafka.py rename to morpheus/stages/input/kafka_source_stage.py index 68411c8074..885bcd2a47 100644 --- a/morpheus/pipeline/input/from_kafka.py +++ b/morpheus/stages/input/kafka_source_stage.py @@ -24,9 +24,9 @@ import morpheus._lib.stages as neos from morpheus.config import Config -from morpheus.pipeline.messages import MessageMeta -from morpheus.pipeline.pipeline import SingleOutputSource -from morpheus.pipeline.pipeline import StreamPair +from morpheus.messages import MessageMeta +from morpheus.pipeline.single_output_source import SingleOutputSource +from morpheus.pipeline.stream_pair import StreamPair logger = logging.getLogger(__name__) diff --git a/morpheus/pipeline/output/__init__.py b/morpheus/stages/output/__init__.py similarity index 100% rename from morpheus/pipeline/output/__init__.py rename to morpheus/stages/output/__init__.py diff --git a/morpheus/pipeline/output/to_file.py b/morpheus/stages/output/write_to_file_stage.py similarity index 87% rename from morpheus/pipeline/output/to_file.py rename to morpheus/stages/output/write_to_file_stage.py index e869359688..d67ca16681 100644 --- a/morpheus/pipeline/output/to_file.py +++ b/morpheus/stages/output/write_to_file_stage.py @@ -25,10 +25,10 @@ from morpheus._lib.file_types import FileTypes from morpheus._lib.file_types import determine_file_type from morpheus.config import Config -from morpheus.pipeline.messages import MessageMeta -from morpheus.pipeline.output import utils -from morpheus.pipeline.pipeline import SinglePortStage -from morpheus.pipeline.pipeline import StreamPair +from morpheus.io import serializers +from morpheus.messages import MessageMeta +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair class WriteToFileStage(SinglePortStage): @@ -91,9 +91,9 @@ def supports_cpp_node(self): def _convert_to_strings(self, df: typing.Union[pd.DataFrame, cudf.DataFrame]): if (self._file_type == FileTypes.JSON): - output_strs = utils.df_to_json(df) + output_strs = serializers.df_to_json(df) elif (self._file_type == FileTypes.CSV): - output_strs = utils.df_to_csv(df, include_header=self._is_first) + output_strs = serializers.df_to_csv(df, include_header=self._is_first) self._is_first = False else: raise NotImplementedError("Unknown file type: {}".format(self._file_type)) @@ -110,11 +110,7 @@ def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPai # Sink to file if (self._build_cpp_node()): - to_file = neos.WriteToFileStage(seg, - self.unique_name, - self._output_file, - "w", - self._file_type) + to_file = neos.WriteToFileStage(seg, self.unique_name, self._output_file, "w", self._file_type) else: def node_fn(input: neo.Observable, output: neo.Subscriber): diff --git a/morpheus/pipeline/output/to_kafka.py b/morpheus/stages/output/write_to_kafka_stage.py similarity index 94% rename from morpheus/pipeline/output/to_kafka.py rename to morpheus/stages/output/write_to_kafka_stage.py index 207fda79fd..d406d89420 100644 --- a/morpheus/pipeline/output/to_kafka.py +++ b/morpheus/stages/output/write_to_kafka_stage.py @@ -21,10 +21,10 @@ from neo.core import operators as ops from morpheus.config import Config -from morpheus.pipeline.messages import MessageMeta -from morpheus.pipeline.output import utils -from morpheus.pipeline.pipeline import SinglePortStage -from morpheus.pipeline.pipeline import StreamPair +from morpheus.io import serializers +from morpheus.messages import MessageMeta +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair logger = logging.getLogger(__name__) @@ -96,7 +96,7 @@ def cb(_, msg): msg.error()) output.on_error(msg.error()) - records = utils.df_to_json(x.df, strip_newlines=True) + records = serializers.df_to_json(x.df, strip_newlines=True) for m in records: # Push all of the messages diff --git a/morpheus/pipeline/postprocess/__init__.py b/morpheus/stages/postprocess/__init__.py similarity index 100% rename from morpheus/pipeline/postprocess/__init__.py rename to morpheus/stages/postprocess/__init__.py diff --git a/morpheus/stages/postprocess/add_classifications_stage.py b/morpheus/stages/postprocess/add_classifications_stage.py new file mode 100644 index 0000000000..50cc9be263 --- /dev/null +++ b/morpheus/stages/postprocess/add_classifications_stage.py @@ -0,0 +1,122 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import typing + +import neo + +import morpheus._lib.stages as neos +from morpheus.config import Config +from morpheus.config import CppConfig +from morpheus.messages import MultiResponseProbsMessage +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair + +logger = logging.getLogger(__name__) + + +class AddClassificationsStage(SinglePortStage): + """ + Add classification labels based on probabilities calculated in inference stage. Label indexes will be looked up in + the Config.class_labels property. Uses default threshold of 0.5 for predictions. + + Parameters + ---------- + c : `morpheus.config.Config` + Pipeline configuration instance. + threshold : float + Threshold to classify, default is 0.5. + labels: list, default = None + The list of labels to add classifications for. Each item in the list will determine its index from the + Config.class_labels property and must be one of the available class labels. Leave as None to add all labels in + the Config.class_labels property. + prefix: str, default = "" + A prefix to append to each label. + + """ + + def __init__(self, c: Config, threshold: float = 0.5, labels: typing.List[str] = None, prefix: str = ""): + super().__init__(c) + + self._feature_length = c.feature_length + self._threshold = threshold + self._prefix = prefix + self._class_labels = c.class_labels + self._labels = labels if labels is not None and len(labels) > 0 else c.class_labels + + # Build the Index to Label map. + self._idx2label = {} + + for label in self._labels: + # All labels must be in class_labels in order to get their position + if (label not in self._class_labels): + logger.warning("The label '%s' is not in Config.class_labels and will be ignored", label) + continue + + self._idx2label[self._class_labels.index(label)] = self._prefix + label + + assert len(self._idx2label) > 0, "No labels were added to the stage" + + @property + def name(self) -> str: + return "add-class" + + def accepted_types(self) -> typing.Tuple: + """ + Accepted input types for this stage are returned. + + Returns + ------- + typing.Tuple[`morpheus.pipeline.messages.MultiResponseProbsMessage`, ] + Accepted input types. + + """ + return (MultiResponseProbsMessage, ) + + @classmethod + def supports_cpp_node(cls): + # Enable support by default + return True + + def _add_labels(self, x: MultiResponseProbsMessage): + + if (x.probs.shape[1] != len(self._class_labels)): + raise RuntimeError("Label count does not match output of model. Label count: {}, Model output: {}".format( + len(self._class_labels), x.probs.shape[1])) + + probs_np = (x.probs > self._threshold).astype(bool).get() + + for i, label in self._idx2label.items(): + x.set_meta(label, probs_np[:, i].tolist()) + + # Return passthrough + return x + + def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + + # Convert the messages to rows of strings + if CppConfig.get_should_use_cpp(): + stream = neos.AddClassificationsStage(seg, + self.unique_name, + self._threshold, + len(self._class_labels), + self._idx2label) + else: + stream = seg.make_node(self.unique_name, self._add_labels) + + seg.make_edge(input_stream[0], stream) + + # Return input unchanged + return stream, MultiResponseProbsMessage diff --git a/morpheus/stages/postprocess/add_scores_stage.py b/morpheus/stages/postprocess/add_scores_stage.py new file mode 100644 index 0000000000..3bbc5463af --- /dev/null +++ b/morpheus/stages/postprocess/add_scores_stage.py @@ -0,0 +1,115 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import typing + +import neo + +import morpheus._lib.stages as neos +from morpheus.config import Config +from morpheus.config import CppConfig +from morpheus.messages import MultiResponseProbsMessage +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair + +logger = logging.getLogger(__name__) + + +class AddScoresStage(SinglePortStage): + """ + Add score labels based on probabilities calculated in inference stage. Label indexes will be looked up in + the Config.class_labels property. + + Parameters + ---------- + c : morpheus.config.Config + Pipeline configuration instance. + labels: list, default = None + The list of labels to add classifications for. Each item in the list will determine its index from the + Config.class_labels property and must be one of the available class labels. Leave as None to add all labels in + the Config.class_labels property. + prefix: str, default = "" + A prefix to append to each label. + + """ + + def __init__(self, c: Config, labels: typing.List[str] = None, prefix: str = ""): + super().__init__(c) + + self._feature_length = c.feature_length + self._prefix = prefix + self._class_labels = c.class_labels + self._labels = labels if labels is not None and len(labels) > 0 else c.class_labels + + # Build the Index to Label map. + self._idx2label = {} + + for label in self._labels: + # All labels must be in class_labels in order to get their position + if (label not in self._class_labels): + logger.warning("The label '%s' is not in Config.class_labels and will be ignored", label) + continue + + self._idx2label[self._class_labels.index(label)] = self._prefix + label + + assert len(self._idx2label) > 0, "No labels were added to the stage" + + @property + def name(self) -> str: + return "add-scores" + + def accepted_types(self) -> typing.Tuple: + """ + Accepted input types for this stage are returned. + + Returns + ------- + typing.Tuple[`morpheus.pipeline.messages.MultiResponseProbsMessage`, ] + Accepted input types. + + """ + return (MultiResponseProbsMessage, ) + + @classmethod + def supports_cpp_node(cls): + # Enable support by default + return True + + def _add_labels(self, x: MultiResponseProbsMessage): + + if (x.probs.shape[1] != len(self._class_labels)): + raise RuntimeError("Label count does not match output of model. Label count: {}, Model output: {}".format( + len(self._class_labels), x.probs.shape[1])) + + probs_np = x.probs.get() + + for i, label in self._idx2label.items(): + x.set_meta(label, probs_np[:, i].tolist()) + + # Return passthrough + return x + + def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + + # Convert the messages to rows of strings + if CppConfig.get_should_use_cpp(): + stream = neos.AddScoresStage(seg, self.unique_name, len(self._class_labels), self._idx2label) + else: + stream = seg.make_node(self.unique_name, self._add_labels) + + seg.make_edge(input_stream[0], stream) + + # Return input unchanged + return stream, input_stream[1] diff --git a/morpheus/stages/postprocess/filter_detections_stage.py b/morpheus/stages/postprocess/filter_detections_stage.py new file mode 100644 index 0000000000..cc43841137 --- /dev/null +++ b/morpheus/stages/postprocess/filter_detections_stage.py @@ -0,0 +1,131 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import typing + +import cupy as cp +import neo +from neo.core import operators as ops + +import morpheus._lib.stages as neos +from morpheus.config import Config +from morpheus.config import CppConfig +from morpheus.messages import MultiResponseProbsMessage +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair + +logger = logging.getLogger(__name__) + + +class FilterDetectionsStage(SinglePortStage): + """ + This Stage class is used to filter results based on a given criteria. + + Parameters + ---------- + c : `morpheus.config.Config` + Pipeline configuration instance. + threshold : float + Threshold to classify, default is 0.5. + + """ + + def __init__(self, c: Config, threshold: float = 0.5): + super().__init__(c) + + # Probability to consider a detection + self._threshold = threshold + + @property + def name(self) -> str: + return "filter" + + def accepted_types(self) -> typing.Tuple: + """ + Accepted input types for this stage are returned. + + Returns + ------- + typing.Tuple[`morpheus.pipeline.messages.MultiResponseProbsMessage`, ] + Accepted input types. + + """ + return (MultiResponseProbsMessage, ) + + @classmethod + def supports_cpp_node(cls): + # Enable support by default + return True + + def filter(self, x: MultiResponseProbsMessage) -> typing.List[MultiResponseProbsMessage]: + """ + This function uses a threshold value to filter the messages. + + Parameters + ---------- + x : `morpheus.pipeline.messages.MultiResponseProbsMessage` + Response message with probabilities calculated from inference results. + + Returns + ------- + typing.List[`morpheus.pipeline.messages.MultiResponseProbsMessage`] + List of filtered messages. + + """ + # Unfortunately we have to convert this to a list in case there are non-contiguous groups + output_list = [] + + # Get per row detections + detections = (x.probs > self._threshold).any(axis=1) + + # Surround in False to ensure we get an even number of pairs + detections = cp.concatenate([cp.array([False]), detections, cp.array([False])]) + + true_pairs = cp.where(detections[1:] != detections[:-1])[0].reshape((-1, 2)) + + for pair in true_pairs: + pair = tuple(pair.tolist()) + mess_offset = x.mess_offset + pair[0] + mess_count = pair[1] - pair[0] + + # Filter empty message groups + if (mess_count == 0): + continue + + output_list.append( + MultiResponseProbsMessage(x.meta, + mess_offset=mess_offset, + mess_count=mess_count, + memory=x.memory, + offset=pair[0], + count=mess_count)) + + return output_list + + def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + + # Convert list back to single MultiResponseProbsMessage + def flatten_fn(input: neo.Observable, output: neo.Subscriber): + + input.pipe(ops.map(self.filter), ops.flatten()).subscribe(output) + + if CppConfig.get_should_use_cpp(): + stream = neos.FilterDetectionsStage(seg, self.unique_name, self._threshold) + else: + stream = seg.make_node_full(self.unique_name, flatten_fn) + + seg.make_edge(input_stream[0], stream) + + return stream, MultiResponseProbsMessage diff --git a/morpheus/pipeline/output/gen_viz_frames.py b/morpheus/stages/postprocess/generate_viz_frames_stage.py similarity index 96% rename from morpheus/pipeline/output/gen_viz_frames.py rename to morpheus/stages/postprocess/generate_viz_frames_stage.py index 4c7e1064b2..d97ba14870 100644 --- a/morpheus/pipeline/output/gen_viz_frames.py +++ b/morpheus/stages/postprocess/generate_viz_frames_stage.py @@ -23,9 +23,9 @@ import pandas as pd from morpheus.config import Config -from morpheus.pipeline.messages import MultiResponseProbsMessage -from morpheus.pipeline.pipeline import SinglePortStage -from morpheus.pipeline.pipeline import StreamPair +from morpheus.messages import MultiResponseProbsMessage +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair class GenerateVizFramesStage(SinglePortStage): diff --git a/morpheus/pipeline/postprocess/mlflow_drift.py b/morpheus/stages/postprocess/ml_flow_drift_stage.py similarity index 96% rename from morpheus/pipeline/postprocess/mlflow_drift.py rename to morpheus/stages/postprocess/ml_flow_drift_stage.py index e4c1cbe3ea..a18a88de10 100644 --- a/morpheus/pipeline/postprocess/mlflow_drift.py +++ b/morpheus/stages/postprocess/ml_flow_drift_stage.py @@ -21,10 +21,10 @@ import neo from morpheus.config import Config -from morpheus.pipeline.messages import MultiResponseMessage -from morpheus.pipeline.messages import MultiResponseProbsMessage -from morpheus.pipeline.pipeline import SinglePortStage -from morpheus.pipeline.pipeline import StreamPair +from morpheus.messages import MultiResponseMessage +from morpheus.messages import MultiResponseProbsMessage +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair logger = logging.getLogger(__name__) diff --git a/morpheus/pipeline/output/serialize.py b/morpheus/stages/postprocess/serialize_stage.py similarity index 95% rename from morpheus/pipeline/output/serialize.py rename to morpheus/stages/postprocess/serialize_stage.py index 6541486576..8b235875e4 100644 --- a/morpheus/pipeline/output/serialize.py +++ b/morpheus/stages/postprocess/serialize_stage.py @@ -21,10 +21,10 @@ import morpheus._lib.stages as neos from morpheus.config import Config -from morpheus.pipeline.messages import MessageMeta -from morpheus.pipeline.messages import MultiMessage -from morpheus.pipeline.pipeline import SinglePortStage -from morpheus.pipeline.pipeline import StreamPair +from morpheus.messages import MessageMeta +from morpheus.messages import MultiMessage +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair class SerializeStage(SinglePortStage): diff --git a/morpheus/pipeline/postprocess/timeseries.py b/morpheus/stages/postprocess/timeseries_stage.py similarity index 98% rename from morpheus/pipeline/postprocess/timeseries.py rename to morpheus/stages/postprocess/timeseries_stage.py index 52a564fed1..de7a26332b 100644 --- a/morpheus/pipeline/postprocess/timeseries.py +++ b/morpheus/stages/postprocess/timeseries_stage.py @@ -26,10 +26,10 @@ from neo.core import operators as ops from morpheus.config import Config -from morpheus.pipeline.messages import MultiResponseAEMessage -from morpheus.pipeline.messages import MultiResponseMessage -from morpheus.pipeline.pipeline import SinglePortStage -from morpheus.pipeline.pipeline import StreamPair +from morpheus.messages import MultiResponseAEMessage +from morpheus.messages import MultiResponseMessage +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair logger = logging.getLogger(__name__) diff --git a/morpheus/pipeline/output/validation.py b/morpheus/stages/postprocess/validation_stage.py similarity index 96% rename from morpheus/pipeline/output/validation.py rename to morpheus/stages/postprocess/validation_stage.py index face57fcd3..60d6215d63 100644 --- a/morpheus/pipeline/output/validation.py +++ b/morpheus/stages/postprocess/validation_stage.py @@ -25,12 +25,12 @@ import cudf +from morpheus._lib.file_types import FileTypes from morpheus.config import Config -from morpheus.pipeline.file_types import FileTypes -from morpheus.pipeline.input.utils import read_file_to_df -from morpheus.pipeline.messages import MultiMessage -from morpheus.pipeline.pipeline import MultiMessageStage -from morpheus.pipeline.pipeline import StreamPair +from morpheus.io.deserializers import read_file_to_df +from morpheus.messages import MultiMessage +from morpheus.pipeline.multi_message_stage import MultiMessageStage +from morpheus.pipeline.stream_pair import StreamPair logger = logging.getLogger(__name__) diff --git a/morpheus/pipeline/preprocess/__init__.py b/morpheus/stages/preprocess/__init__.py similarity index 100% rename from morpheus/pipeline/preprocess/__init__.py rename to morpheus/stages/preprocess/__init__.py diff --git a/morpheus/stages/preprocess/deserialize_stage.py b/morpheus/stages/preprocess/deserialize_stage.py new file mode 100644 index 0000000000..6dec7966dd --- /dev/null +++ b/morpheus/stages/preprocess/deserialize_stage.py @@ -0,0 +1,108 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import typing +from functools import partial + +import neo +from neo.core import operators as ops + +import morpheus._lib.stages as neos +from morpheus.config import Config +from morpheus.config import CppConfig +from morpheus.messages import MessageMeta +from morpheus.messages import MultiMessage +from morpheus.pipeline.multi_message_stage import MultiMessageStage +from morpheus.pipeline.stream_pair import StreamPair + +logger = logging.getLogger(__name__) + + +class DeserializeStage(MultiMessageStage): + """ + This stage deserialize the output of `FileSourceStage`/`KafkaSourceStage` into a `MultiMessage`. This + should be one of the first stages after the `Source` object. + + Parameters + ---------- + c : `morpheus.config.Config` + Pipeline configuration instance. + + """ + + def __init__(self, c: Config): + super().__init__(c) + + self._batch_size = c.pipeline_batch_size + + self._max_concurrent = c.num_threads + + # Mark these stages to log timestamps if requested + self._should_log_timestamps = True + + @property + def name(self) -> str: + return "deserialize" + + def accepted_types(self) -> typing.Tuple: + """ + Returns accepted input types for this stage. + + """ + return (MessageMeta) + + @staticmethod + def process_dataframe(x: MessageMeta, batch_size: int) -> typing.List[MultiMessage]: + """ + The deserialization of the cudf is implemented in this function. + + Parameters + ---------- + x : cudf.DataFrame + Input rows that needs to be deserilaized. + batch_size : int + Batch size. + + """ + + full_message = MultiMessage(meta=x, mess_offset=0, mess_count=x.count) + + # Now break it up by batches + output = [] + + for i in range(0, full_message.mess_count, batch_size): + output.append(full_message.get_slice(i, min(i + batch_size, full_message.mess_count))) + + return output + + def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + + stream = input_stream[0] + out_type = MultiMessage + + def node_fn(input: neo.Observable, output: neo.Subscriber): + + input.pipe(ops.map(partial(DeserializeStage.process_dataframe, batch_size=self._batch_size)), + ops.flatten()).subscribe(output) + + if CppConfig.get_should_use_cpp(): + stream = neos.DeserializeStage(seg, self.unique_name, self._batch_size) + else: + stream = seg.make_node_full(self.unique_name, node_fn) + + seg.make_edge(input_stream[0], stream) + + return stream, out_type diff --git a/morpheus/stages/preprocess/drop_null_stage.py b/morpheus/stages/preprocess/drop_null_stage.py new file mode 100644 index 0000000000..10704e38ea --- /dev/null +++ b/morpheus/stages/preprocess/drop_null_stage.py @@ -0,0 +1,81 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import typing + +import neo +from neo.core import operators as ops + +from morpheus.config import Config +from morpheus.messages import MessageMeta +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair + + +class DropNullStage(SinglePortStage): + """ + Drop null/empty data input entries. + + Parameters + ---------- + c : `morpheus.config.Config` + Pipeline configuration instance. + column : str + Column name to perform null check. + + """ + + def __init__(self, c: Config, column: str): + super().__init__(c) + + self._column = column + + # Mark these stages to log timestamps if requested + self._should_log_timestamps = True + + @property + def name(self) -> str: + return "dropna" + + def accepted_types(self) -> typing.Tuple: + """ + Accepted input types for this stage are returned. + + Returns + ------- + typing.Tuple + Accepted input types. + + """ + return (MessageMeta, ) + + def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + stream = input_stream[0] + + # Finally, flatten to a single stream + def node_fn(input: neo.Observable, output: neo.Subscriber): + + def on_next(x: MessageMeta): + + y = MessageMeta(x.df[~x.df[self._column].isna()]) + + return y + + input.pipe(ops.map(on_next), ops.filter(lambda x: not x.df.empty)).subscribe(output) + + node = seg.make_node_full(self.unique_name, node_fn) + seg.make_edge(stream, node) + stream = node + + return stream, input_stream[1] diff --git a/morpheus/stages/preprocess/preprocess_ae_stage.py b/morpheus/stages/preprocess/preprocess_ae_stage.py new file mode 100644 index 0000000000..4e757a967c --- /dev/null +++ b/morpheus/stages/preprocess/preprocess_ae_stage.py @@ -0,0 +1,112 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import typing +from functools import partial + +import cupy as cp +import neo + +from morpheus.config import Config +from morpheus.messages import InferenceMemoryAE +from morpheus.messages import MultiInferenceMessage +from morpheus.messages import MultiMessage +from morpheus.messages.multi_ae_message import MultiAEMessage +from morpheus.stages.inference.auto_encoder_inference_stage import MultiInferenceAEMessage +from morpheus.stages.preprocess.preprocess_base_stage import PreprocessBaseStage + +logger = logging.getLogger(__name__) + + +class PreprocessAEStage(PreprocessBaseStage): + """ + Autoencoder usecases are preprocessed with this stage class. + + Parameters + ---------- + c : morpheus.config.Config + Pipeline configuration instance. + + """ + + def __init__(self, c: Config): + super().__init__(c) + + self._fea_length = c.feature_length + self._feature_columns = c.ae.feature_columns + + @property + def name(self) -> str: + return "preprocess-ae" + + def accepted_types(self) -> typing.Tuple: + """ + Returns accepted input types for this stage. + """ + return (MultiAEMessage, ) + + def supports_cpp_node(self): + return False + + @staticmethod + def pre_process_batch(x: MultiAEMessage, fea_len: int, + feature_columns: typing.List[str]) -> MultiInferenceAEMessage: + """ + This function performs pre-processing for autoencoder. + + Parameters + ---------- + x : morpheus.pipeline.preprocess.autoencoder.MultiAEMessage + Input rows received from Deserialized stage. + + Returns + ------- + morpheus.pipeline.inference.inference_ae.MultiInferenceAEMessage + Autoencoder inference message. + + """ + + meta_df = x.get_meta(x.meta.df.columns.intersection(feature_columns)) + autoencoder = x.model + + data = autoencoder.prepare_df(meta_df) + input = autoencoder.build_input_tensor(data) + input = cp.asarray(input.detach()) + + count = input.shape[0] + + seg_ids = cp.zeros((count, 3), dtype=cp.uint32) + seg_ids[:, 0] = cp.arange(0, count, dtype=cp.uint32) + seg_ids[:, 2] = fea_len - 1 + + memory = InferenceMemoryAE(count=count, input=input, seq_ids=seg_ids) + + infer_message = MultiInferenceAEMessage(meta=x.meta, + mess_offset=x.mess_offset, + mess_count=x.mess_count, + memory=memory, + offset=0, + count=memory.count, + model=autoencoder) + + return infer_message + + def _get_preprocess_fn(self) -> typing.Callable[[MultiMessage], MultiInferenceMessage]: + return partial(PreprocessAEStage.pre_process_batch, + fea_len=self._fea_length, + feature_columns=self._feature_columns) + + def _get_preprocess_node(self, seg: neo.Segment): + raise NotImplementedError("No C++ node for AE") diff --git a/morpheus/stages/preprocess/preprocess_base_stage.py b/morpheus/stages/preprocess/preprocess_base_stage.py new file mode 100644 index 0000000000..ef031375af --- /dev/null +++ b/morpheus/stages/preprocess/preprocess_base_stage.py @@ -0,0 +1,81 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import inspect +import typing +from abc import abstractmethod + +import neo +import typing_utils + +from morpheus.config import Config +from morpheus.config import CppConfig +from morpheus.messages import MultiInferenceMessage +from morpheus.messages import MultiMessage +from morpheus.pipeline.multi_message_stage import MultiMessageStage +from morpheus.pipeline.stream_pair import StreamPair + + +class PreprocessBaseStage(MultiMessageStage): + """ + This is a base pre-processing class holding general functionality for all preprocessing stages. + + Parameters + ---------- + c : `morpheus.config.Config` + Pipeline configuration instance. + + """ + + def __init__(self, c: Config): + super().__init__(c) + + self._should_log_timestamps = True + + def accepted_types(self) -> typing.Tuple: + """ + Returns accepted input types for this stage. + + """ + return (MultiMessage, ) + + @abstractmethod + def _get_preprocess_fn(self) -> typing.Callable[[MultiMessage], MultiInferenceMessage]: + pass + + @abstractmethod + def _get_preprocess_node(self, seg: neo.Segment): + pass + + def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + + stream = input_stream[0] + out_type = MultiInferenceMessage + + preprocess_fn = self._get_preprocess_fn() + + preproc_sig = inspect.signature(preprocess_fn) + + # If the innerfunction returns a type annotation, update the output type + if (preproc_sig.return_annotation and typing_utils.issubtype(preproc_sig.return_annotation, out_type)): + out_type = preproc_sig.return_annotation + + if CppConfig.get_should_use_cpp(): + stream = self._get_preprocess_node(seg) + else: + stream = seg.make_node(self.unique_name, preprocess_fn) + + seg.make_edge(input_stream[0], stream) + + return stream, out_type diff --git a/morpheus/stages/preprocess/preprocess_fil_stage.py b/morpheus/stages/preprocess/preprocess_fil_stage.py new file mode 100644 index 0000000000..388538a6e2 --- /dev/null +++ b/morpheus/stages/preprocess/preprocess_fil_stage.py @@ -0,0 +1,126 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import typing +from functools import partial + +import cupy as cp +import neo +import numpy as np +import pandas as pd + +import cudf + +import morpheus._lib.stages as neos +from morpheus.config import Config +from morpheus.messages import InferenceMemoryFIL +from morpheus.messages import MultiInferenceFILMessage +from morpheus.messages import MultiInferenceMessage +from morpheus.messages import MultiMessage +from morpheus.stages.preprocess.preprocess_base_stage import PreprocessBaseStage + +logger = logging.getLogger(__name__) + + +class PreprocessFILStage(PreprocessBaseStage): + """ + FIL usecases are preprocessed with this stage class. + + Parameters + ---------- + c : `morpheus.config.Config` + Pipeline configuration instance. + + """ + + def __init__(self, c: Config): + super().__init__(c) + + self._fea_length = c.feature_length + self.features = c.fil.feature_columns + + assert self._fea_length == len(self.features), \ + f"Number of features in preprocessing {len(self.features)}, does not match configuration {self._fea_length}" + + @property + def name(self) -> str: + return "preprocess-fil" + + @staticmethod + def pre_process_batch(x: MultiMessage, fea_len: int, fea_cols: typing.List[str]) -> MultiInferenceFILMessage: + """ + For FIL category usecases, this function performs pre-processing. + + Parameters + ---------- + x : `morpheus.pipeline.messages.MultiMessage` + Input rows received from Deserialized stage. + fea_len : int + Number features are being used in the inference. + fea_cols : typing.Tuple[str] + List of columns that are used as features. + + Returns + ------- + `morpheus.pipeline.messages.MultiInferenceFILMessage` + FIL inference message. + + """ + + try: + df = x.get_meta(fea_cols) + except KeyError: + logger.exception("Cound not get metadat for columns.") + return None + + # Extract just the numbers from each feature col. Not great to operate on x.meta.df here but the operations will + # only happen once. + for col in fea_cols: + if (df[col].dtype == np.dtype(str) or df[col].dtype == np.dtype(object)): + # If the column is a string, parse the number + df[col] = df[col].str.extract(r"(\d+)", expand=False).astype("float32") + elif (df[col].dtype != np.float32): + # Convert to float32 + df[col] = df[col].astype("float32") + + if (isinstance(df, pd.DataFrame)): + df = cudf.from_pandas(df) + + # Convert the dataframe to cupy the same way cuml does + data = cp.asarray(df.as_gpu_matrix(order='C')) + + count = data.shape[0] + + seg_ids = cp.zeros((count, 3), dtype=cp.uint32) + seg_ids[:, 0] = cp.arange(0, count, dtype=cp.uint32) + seg_ids[:, 2] = fea_len - 1 + + # Create the inference memory. Keep in mind count here could be > than input count + memory = InferenceMemoryFIL(count=count, input__0=data, seq_ids=seg_ids) + + infer_message = MultiInferenceFILMessage(meta=x.meta, + mess_offset=x.mess_offset, + mess_count=x.mess_count, + memory=memory, + offset=0, + count=memory.count) + + return infer_message + + def _get_preprocess_fn(self) -> typing.Callable[[MultiMessage], MultiInferenceMessage]: + return partial(PreprocessFILStage.pre_process_batch, fea_len=self._fea_length, fea_cols=self.features) + + def _get_preprocess_node(self, seg: neo.Segment): + return neos.PreprocessFILStage(seg, self.unique_name, self.features) diff --git a/morpheus/stages/preprocess/preprocess_nlp_stage.py b/morpheus/stages/preprocess/preprocess_nlp_stage.py new file mode 100644 index 0000000000..29be78a356 --- /dev/null +++ b/morpheus/stages/preprocess/preprocess_nlp_stage.py @@ -0,0 +1,176 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import typing +from functools import partial + +import neo + +import cudf +from cudf.core.subword_tokenizer import SubwordTokenizer + +import morpheus._lib.stages as neos +from morpheus.config import Config +from morpheus.messages import InferenceMemoryNLP +from morpheus.messages import MultiInferenceMessage +from morpheus.messages import MultiInferenceNLPMessage +from morpheus.messages import MultiMessage +from morpheus.stages.preprocess.preprocess_base_stage import PreprocessBaseStage +from morpheus.utils.cudf_subword_helper import tokenize_text_series + + +class PreprocessNLPStage(PreprocessBaseStage): + """ + NLP usecases are preprocessed with this stage class. + + Parameters + ---------- + c : `morpheus.config.Config` + Pipeline configuration instance. + vocab_hashfile : str + Path to hash file containing vocabulary of words with token-ids. This can be created from the raw vocabulary + using the `cudf.utils.hash_vocab_utils.hash_vocab` function. + truncation : bool + If set to true, strings will be truncated and padded to max_length. Each input string will result in exactly one + output sequence. If set to false, there may be multiple output sequences when the max_length is smaller + than generated tokens. + do_lower_case : bool + If set to true, original text will be lowercased before encoding. + add_special_tokens : bool + Whether or not to encode the sequences with the special tokens of the BERT classification model. + stride : int + If `truncation` == False and the tokenized string is larger than max_length, the sequences containing the + overflowing token-ids can contain duplicated token-ids from the main sequence. If max_length is equal to stride + there are no duplicated-id tokens. If stride is 80% of max_length, 20% of the first sequence will be repeated on + the second sequence and so on until the entire sentence is encoded. + + """ + + def __init__(self, + c: Config, + vocab_hash_file: str, + truncation: bool, + do_lower_case: bool, + add_special_tokens: bool, + stride: int = -1): + super().__init__(c) + + self._seq_length = c.feature_length + self._vocab_hash_file = vocab_hash_file + + if (stride <= 0): + # Set the stride to 75%. Works well with powers of 2 + self._stride = self._seq_length // 2 + self._stride = self._stride + self._stride // 2 + else: + # Use the given value + self._stride = stride + + self._truncation = truncation + self._do_lower_case = do_lower_case + self._add_special_tokens = add_special_tokens + + self._tokenizer: SubwordTokenizer = None + + @property + def name(self) -> str: + return "preprocess-nlp" + + @staticmethod + def pre_process_batch(x: MultiMessage, + vocab_hash_file: str, + do_lower_case: bool, + seq_len: int, + stride: int, + truncation: bool, + add_special_tokens: bool) -> MultiInferenceNLPMessage: + """ + For NLP category usecases, this function performs pre-processing. + + Parameters + ---------- + x : `morpheus.pipeline.messages.MultiMessage` + Input rows received from Deserialized stage. + vocab_hashfile : str + Path to hash file containing vocabulary of words with token-ids. This can be created from the raw vocabulary + using the `cudf.utils.hash_vocab_utils.hash_vocab` function. + do_lower_case : bool + If set to true, original text will be lowercased before encoding. + seq_len : int + Limits the length of the sequence returned. If tokenized string is shorter than max_length, output will be + padded with 0s. If the tokenized string is longer than max_length and do_truncate == False, there will be + multiple returned sequences containing the overflowing token-ids. + stride : int + If do_truncate == False and the tokenized string is larger than max_length, the sequences containing the + overflowing token-ids can contain duplicated token-ids from the main sequence. If max_length is equal to + stride there are no duplicated-id tokens. If stride is 80% of max_length, 20% of the first sequence will be + repeated on the second sequence and so on until the entire sentence is encoded. + truncation : bool + If set to true, strings will be truncated and padded to max_length. Each input string will result in exactly + one output sequence. If set to false, there may be multiple output sequences when the max_length is smaller + than generated tokens. + add_special_tokens : bool + Whether or not to encode the sequences with the special tokens of the BERT classification model. + + Returns + ------- + `morpheus.pipeline.messages.MultiInferenceNLPMessage` + NLP inference message. + + """ + text_ser = cudf.Series(x.get_meta("data")) + + tokenized = tokenize_text_series(vocab_hash_file=vocab_hash_file, + do_lower_case=do_lower_case, + text_ser=text_ser, + seq_len=seq_len, + stride=stride, + truncation=truncation, + add_special_tokens=add_special_tokens) + del text_ser + + # Create the inference memory. Keep in mind count here could be > than input count + memory = InferenceMemoryNLP(count=tokenized.input_ids.shape[0], + input_ids=tokenized.input_ids, + input_mask=tokenized.input_mask, + seq_ids=tokenized.segment_ids) + + infer_message = MultiInferenceNLPMessage(meta=x.meta, + mess_offset=x.mess_offset, + mess_count=x.mess_count, + memory=memory, + offset=0, + count=memory.count) + + return infer_message + + def _get_preprocess_fn(self) -> typing.Callable[[MultiMessage], MultiInferenceMessage]: + + return partial(PreprocessNLPStage.pre_process_batch, + vocab_hash_file=self._vocab_hash_file, + do_lower_case=self._do_lower_case, + stride=self._stride, + seq_len=self._seq_length, + truncation=self._truncation, + add_special_tokens=self._add_special_tokens) + + def _get_preprocess_node(self, seg: neo.Segment): + return neos.PreprocessNLPStage(seg, + self.unique_name, + self._vocab_hash_file, + self._seq_length, + self._truncation, + self._do_lower_case, + self._add_special_tokens, + self._stride) diff --git a/morpheus/pipeline/preprocess/autoencoder.py b/morpheus/stages/preprocess/train_ae_stage.py similarity index 62% rename from morpheus/pipeline/preprocess/autoencoder.py rename to morpheus/stages/preprocess/train_ae_stage.py index 92e4e8f78a..0d8c0eff65 100644 --- a/morpheus/pipeline/preprocess/autoencoder.py +++ b/morpheus/stages/preprocess/train_ae_stage.py @@ -12,13 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -import dataclasses import glob import logging import typing -from functools import partial -import cupy as cp import dill import neo import numpy as np @@ -27,48 +24,18 @@ from dfencoder import AutoEncoder from neo.core import operators as ops +from morpheus._lib.file_types import FileTypes from morpheus.config import Config -from morpheus.pipeline.file_types import FileTypes -from morpheus.pipeline.inference.inference_ae import MultiInferenceAEMessage -from morpheus.pipeline.input.from_cloudtrail import CloudTrailSourceStage -from morpheus.pipeline.messages import InferenceMemoryAE -from morpheus.pipeline.messages import MultiInferenceMessage -from morpheus.pipeline.messages import MultiMessage -from morpheus.pipeline.messages import UserMessageMeta -from morpheus.pipeline.pipeline import MultiMessageStage -from morpheus.pipeline.pipeline import StreamPair -from morpheus.pipeline.preprocessing import PreprocessBaseStage +from morpheus.messages.message_meta import UserMessageMeta +from morpheus.messages.multi_ae_message import MultiAEMessage +from morpheus.pipeline.multi_message_stage import MultiMessageStage +from morpheus.pipeline.stream_pair import StreamPair +from morpheus.stages.input.cloud_trail_source_stage import CloudTrailSourceStage logger = logging.getLogger(__name__) -@dataclasses.dataclass -class MultiAEMessage(MultiMessage): - - model: AutoEncoder - - def get_slice(self, start, stop): - """ - Returns sliced batches based on offsets supplied. Automatically calculates the correct `mess_offset` - and `mess_count`. - - Parameters - ---------- - start : int - Start offset address. - stop : int - Stop offset address. - - Returns - ------- - morpheus.pipeline.preprocess.autoencoder.MultiAEMessage - A new `MultiAEMessage` with sliced offset and count. - - """ - return MultiAEMessage(meta=self.meta, mess_offset=start, mess_count=stop - start, model=self.model) - - -class UserModelManager(object): +class _UserModelManager(object): def __init__(self, c: Config, @@ -188,7 +155,7 @@ def __init__(self, self._pretrained_model: AutoEncoder = None # Per user model data - self._user_models: typing.Dict[str, UserModelManager] = {} + self._user_models: typing.Dict[str, _UserModelManager] = {} @property def name(self) -> str: @@ -218,12 +185,12 @@ def _get_per_user_model(self, x: UserMessageMeta): def _train_model(self, x: UserMessageMeta) -> typing.List[MultiAEMessage]: if (x.user_id not in self._user_models): - self._user_models[x.user_id] = UserModelManager(self._config, - x.user_id, - False, - self._train_epochs, - self._train_max_history, - self._seed) + self._user_models[x.user_id] = _UserModelManager(self._config, + x.user_id, + False, + self._train_epochs, + self._train_max_history, + self._seed) model = self._user_models[x.user_id].train(x.df) @@ -257,12 +224,12 @@ def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPai self._config.ae.userid_filter) for user_id, df in user_to_df.items(): - self._user_models[user_id] = UserModelManager(self._config, - user_id, - True, - self._train_epochs, - self._train_max_history, - self._seed) + self._user_models[user_id] = _UserModelManager(self._config, + user_id, + True, + self._train_epochs, + self._train_max_history, + self._seed) self._user_models[user_id].train(df) @@ -295,85 +262,3 @@ def on_next(x: UserMessageMeta): stream = node return stream, MultiAEMessage - - -class PreprocessAEStage(PreprocessBaseStage): - """ - Autoencoder usecases are preprocessed with this stage class. - - Parameters - ---------- - c : morpheus.config.Config - Pipeline configuration instance. - - """ - - def __init__(self, c: Config): - super().__init__(c) - - self._fea_length = c.feature_length - self._feature_columns = c.ae.feature_columns - - @property - def name(self) -> str: - return "preprocess-ae" - - def accepted_types(self) -> typing.Tuple: - """ - Returns accepted input types for this stage. - """ - return (MultiAEMessage, ) - - def supports_cpp_node(self): - return False - - @staticmethod - def pre_process_batch(x: MultiAEMessage, fea_len: int, - feature_columns: typing.List[str]) -> MultiInferenceAEMessage: - """ - This function performs pre-processing for autoencoder. - - Parameters - ---------- - x : morpheus.pipeline.preprocess.autoencoder.MultiAEMessage - Input rows received from Deserialized stage. - - Returns - ------- - morpheus.pipeline.inference.inference_ae.MultiInferenceAEMessage - Autoencoder inference message. - - """ - - meta_df = x.get_meta(x.meta.df.columns.intersection(feature_columns)) - autoencoder = x.model - - data = autoencoder.prepare_df(meta_df) - input = autoencoder.build_input_tensor(data) - input = cp.asarray(input.detach()) - - count = input.shape[0] - - seg_ids = cp.zeros((count, 3), dtype=cp.uint32) - seg_ids[:, 0] = cp.arange(0, count, dtype=cp.uint32) - seg_ids[:, 2] = fea_len - 1 - - memory = InferenceMemoryAE(count=count, input=input, seq_ids=seg_ids) - - infer_message = MultiInferenceAEMessage(meta=x.meta, - mess_offset=x.mess_offset, - mess_count=x.mess_count, - memory=memory, - offset=0, - count=memory.count, - model=autoencoder) - - return infer_message - - def _get_preprocess_fn(self) -> typing.Callable[[MultiMessage], MultiInferenceMessage]: - return partial(PreprocessAEStage.pre_process_batch, - fea_len=self._fea_length, - feature_columns=self._feature_columns) - - def _get_preprocess_node(self, seg: neo.Segment): - raise NotImplementedError("No C++ node for AE") diff --git a/tests/benchmarks/static_message_source.py b/tests/benchmarks/static_message_source.py index ef4302f49b..856339b2bb 100644 --- a/tests/benchmarks/static_message_source.py +++ b/tests/benchmarks/static_message_source.py @@ -22,9 +22,9 @@ import cudf from morpheus.config import Config -from morpheus.pipeline.messages import MessageMeta -from morpheus.pipeline.pipeline import SingleOutputSource -from morpheus.pipeline.pipeline import StreamPair +from morpheus.messages import MessageMeta +from morpheus.pipeline import SingleOutputSource +from morpheus.pipeline import StreamPair class StaticMessageSource(SingleOutputSource): diff --git a/tests/benchmarks/test_bench_monitor_stage.py b/tests/benchmarks/test_bench_monitor_stage.py index edcc3e6f4b..5ea624b0a0 100644 --- a/tests/benchmarks/test_bench_monitor_stage.py +++ b/tests/benchmarks/test_bench_monitor_stage.py @@ -23,9 +23,9 @@ from morpheus.config import Config from morpheus.config import CppConfig from morpheus.config import PipelineModes -from morpheus.pipeline.general_stages import MonitorStage -from morpheus.pipeline.pipeline import LinearPipeline -from morpheus.pipeline.preprocessing import DeserializeStage +from morpheus.pipeline.linear_pipeline import LinearPipeline +from morpheus.stages.general.monitor_stage import MonitorStage +from morpheus.stages.preprocess.deserialize_stage import DeserializeStage from morpheus.utils.logging import configure_logging diff --git a/tests/benchmarks/test_bench_serialize_stage.py b/tests/benchmarks/test_bench_serialize_stage.py index dfae6e1ba4..5fe018713f 100644 --- a/tests/benchmarks/test_bench_serialize_stage.py +++ b/tests/benchmarks/test_bench_serialize_stage.py @@ -24,9 +24,9 @@ from morpheus.config import Config from morpheus.config import CppConfig from morpheus.config import PipelineModes -from morpheus.pipeline.output.serialize import SerializeStage -from morpheus.pipeline.pipeline import LinearPipeline -from morpheus.pipeline.preprocessing import DeserializeStage +from morpheus.pipeline.linear_pipeline import LinearPipeline +from morpheus.stages.postprocess.serialize_stage import SerializeStage +from morpheus.stages.preprocess.deserialize_stage import DeserializeStage from morpheus.utils.logging import configure_logging diff --git a/tests/test_abp.py b/tests/test_abp.py index 45a9689bd1..2c78754e4c 100755 --- a/tests/test_abp.py +++ b/tests/test_abp.py @@ -24,15 +24,15 @@ from morpheus.config import ConfigFIL from morpheus.config import PipelineModes from morpheus.pipeline import LinearPipeline -from morpheus.pipeline.general_stages import AddClassificationsStage -from morpheus.pipeline.general_stages import MonitorStage -from morpheus.pipeline.inference.inference_triton import TritonInferenceStage -from morpheus.pipeline.input.from_file import FileSourceStage -from morpheus.pipeline.output.serialize import SerializeStage -from morpheus.pipeline.output.to_file import WriteToFileStage -from morpheus.pipeline.output.validation import ValidationStage -from morpheus.pipeline.preprocessing import DeserializeStage -from morpheus.pipeline.preprocessing import PreprocessFILStage +from morpheus.stages.general.monitor_stage import MonitorStage +from morpheus.stages.inference.triton_inference_stage import TritonInferenceStage +from morpheus.stages.input.file_source_stage import FileSourceStage +from morpheus.stages.output.write_to_file_stage import WriteToFileStage +from morpheus.stages.postprocess.add_classifications_stage import AddClassificationsStage +from morpheus.stages.postprocess.serialize_stage import SerializeStage +from morpheus.stages.postprocess.validation_stage import ValidationStage +from morpheus.stages.preprocess.deserialize_stage import DeserializeStage +from morpheus.stages.preprocess.preprocess_fil_stage import PreprocessFILStage from utils import TEST_DIRS from utils import calc_error_val diff --git a/tests/test_add_classifications_stage.py b/tests/test_add_classifications_stage.py index f225924dfa..43e842944e 100755 --- a/tests/test_add_classifications_stage.py +++ b/tests/test_add_classifications_stage.py @@ -19,7 +19,7 @@ import cupy as cp import pytest -from morpheus.pipeline.general_stages import AddClassificationsStage +from morpheus.stages.postprocess.add_classifications_stage import AddClassificationsStage def test_constructor(config): diff --git a/tests/test_add_classifications_stage_pipe.py b/tests/test_add_classifications_stage_pipe.py index cca4845781..5c1cc6eb5f 100755 --- a/tests/test_add_classifications_stage_pipe.py +++ b/tests/test_add_classifications_stage_pipe.py @@ -20,11 +20,11 @@ import pandas as pd from morpheus.pipeline import LinearPipeline -from morpheus.pipeline.general_stages import AddClassificationsStage -from morpheus.pipeline.input.from_file import FileSourceStage -from morpheus.pipeline.output.serialize import SerializeStage -from morpheus.pipeline.output.to_file import WriteToFileStage -from morpheus.pipeline.preprocessing import DeserializeStage +from morpheus.stages.input.file_source_stage import FileSourceStage +from morpheus.stages.output.write_to_file_stage import WriteToFileStage +from morpheus.stages.postprocess.add_classifications_stage import AddClassificationsStage +from morpheus.stages.postprocess.serialize_stage import SerializeStage +from morpheus.stages.preprocess.deserialize_stage import DeserializeStage from utils import TEST_DIRS from utils import ConvMsg diff --git a/tests/test_add_scores_stage.py b/tests/test_add_scores_stage.py index a7e8d8b336..b05193dd13 100755 --- a/tests/test_add_scores_stage.py +++ b/tests/test_add_scores_stage.py @@ -19,7 +19,7 @@ import cupy as cp import pytest -from morpheus.pipeline.general_stages import AddScoresStage +from morpheus.stages.postprocess.add_scores_stage import AddScoresStage def test_constructor(config): diff --git a/tests/test_add_scores_stage_pipe.py b/tests/test_add_scores_stage_pipe.py index 74dad687f9..f096097336 100755 --- a/tests/test_add_scores_stage_pipe.py +++ b/tests/test_add_scores_stage_pipe.py @@ -20,11 +20,11 @@ import pandas as pd from morpheus.pipeline import LinearPipeline -from morpheus.pipeline.general_stages import AddScoresStage -from morpheus.pipeline.input.from_file import FileSourceStage -from morpheus.pipeline.output.serialize import SerializeStage -from morpheus.pipeline.output.to_file import WriteToFileStage -from morpheus.pipeline.preprocessing import DeserializeStage +from morpheus.stages.input.file_source_stage import FileSourceStage +from morpheus.stages.output.write_to_file_stage import WriteToFileStage +from morpheus.stages.postprocess.add_scores_stage import AddScoresStage +from morpheus.stages.postprocess.serialize_stage import SerializeStage +from morpheus.stages.preprocess.deserialize_stage import DeserializeStage from utils import TEST_DIRS from utils import ConvMsg diff --git a/tests/test_cli.py b/tests/test_cli.py index 0024e131b4..a16812240f 100755 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -26,29 +26,29 @@ from morpheus.config import ConfigAutoEncoder from morpheus.config import CppConfig from morpheus.config import PipelineModes -from morpheus.pipeline.general_stages import AddClassificationsStage -from morpheus.pipeline.general_stages import AddScoresStage -from morpheus.pipeline.general_stages import FilterDetectionsStage -from morpheus.pipeline.general_stages import MonitorStage -from morpheus.pipeline.inference.inference_ae import AutoEncoderInferenceStage -from morpheus.pipeline.inference.inference_identity import IdentityInferenceStage -from morpheus.pipeline.inference.inference_pytorch import PyTorchInferenceStage -from morpheus.pipeline.inference.inference_triton import TritonInferenceStage -from morpheus.pipeline.input.from_cloudtrail import CloudTrailSourceStage -from morpheus.pipeline.input.from_file import FileSourceStage -from morpheus.pipeline.input.from_kafka import KafkaSourceStage -from morpheus.pipeline.output.serialize import SerializeStage -from morpheus.pipeline.output.to_file import WriteToFileStage -from morpheus.pipeline.output.to_kafka import WriteToKafkaStage -from morpheus.pipeline.output.validation import ValidationStage -from morpheus.pipeline.postprocess.mlflow_drift import MLFlowDriftStage -from morpheus.pipeline.postprocess.timeseries import TimeSeriesStage -from morpheus.pipeline.preprocess.autoencoder import PreprocessAEStage -from morpheus.pipeline.preprocess.autoencoder import TrainAEStage -from morpheus.pipeline.preprocessing import DeserializeStage -from morpheus.pipeline.preprocessing import DropNullStage -from morpheus.pipeline.preprocessing import PreprocessFILStage -from morpheus.pipeline.preprocessing import PreprocessNLPStage +from morpheus.stages.general.monitor_stage import MonitorStage +from morpheus.stages.inference.auto_encoder_inference_stage import AutoEncoderInferenceStage +from morpheus.stages.inference.identity_inference_stage import IdentityInferenceStage +from morpheus.stages.inference.pytorch_inference_stage import PyTorchInferenceStage +from morpheus.stages.inference.triton_inference_stage import TritonInferenceStage +from morpheus.stages.input.cloud_trail_source_stage import CloudTrailSourceStage +from morpheus.stages.input.file_source_stage import FileSourceStage +from morpheus.stages.input.kafka_source_stage import KafkaSourceStage +from morpheus.stages.output.write_to_file_stage import WriteToFileStage +from morpheus.stages.output.write_to_kafka_stage import WriteToKafkaStage +from morpheus.stages.postprocess.add_classifications_stage import AddClassificationsStage +from morpheus.stages.postprocess.add_scores_stage import AddScoresStage +from morpheus.stages.postprocess.filter_detections_stage import FilterDetectionsStage +from morpheus.stages.postprocess.ml_flow_drift_stage import MLFlowDriftStage +from morpheus.stages.postprocess.serialize_stage import SerializeStage +from morpheus.stages.postprocess.timeseries_stage import TimeSeriesStage +from morpheus.stages.postprocess.validation_stage import ValidationStage +from morpheus.stages.preprocess.deserialize_stage import DeserializeStage +from morpheus.stages.preprocess.drop_null_stage import DropNullStage +from morpheus.stages.preprocess.preprocess_ae_stage import PreprocessAEStage +from morpheus.stages.preprocess.preprocess_fil_stage import PreprocessFILStage +from morpheus.stages.preprocess.preprocess_nlp_stage import PreprocessNLPStage +from morpheus.stages.preprocess.train_ae_stage import TrainAEStage from utils import TEST_DIRS GENERAL_ARGS = ['run', '--num_threads=12', '--pipeline_batch_size=1024', '--model_max_batch_size=1024', '--use_cpp=0'] diff --git a/tests/test_config.py b/tests/test_config.py index 08290a0c33..4c6e51d6de 100755 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -18,8 +18,6 @@ import os from unittest import mock -import pytest - import morpheus # Using morpheus.config to distinguish between the config package and the pytest fixture of the same name diff --git a/tests/test_file_in_out_stage_pipe.py b/tests/test_file_in_out_stage_pipe.py index aa79fc42bb..c1dd3e1d07 100755 --- a/tests/test_file_in_out_stage_pipe.py +++ b/tests/test_file_in_out_stage_pipe.py @@ -19,11 +19,11 @@ import numpy as np import pytest +from morpheus._lib.file_types import FileTypes +from morpheus.io.deserializers import read_file_to_df from morpheus.pipeline import LinearPipeline -from morpheus.pipeline.file_types import FileTypes -from morpheus.pipeline.input.from_file import FileSourceStage -from morpheus.pipeline.input.utils import read_file_to_df -from morpheus.pipeline.output.to_file import WriteToFileStage +from morpheus.stages.input.file_source_stage import FileSourceStage +from morpheus.stages.output.write_to_file_stage import WriteToFileStage from utils import TEST_DIRS diff --git a/tests/test_filter_detections_stage.py b/tests/test_filter_detections_stage.py index 990db58a9b..89f88c59c5 100755 --- a/tests/test_filter_detections_stage.py +++ b/tests/test_filter_detections_stage.py @@ -19,7 +19,7 @@ import cupy as cp import pytest -from morpheus.pipeline.general_stages import FilterDetectionsStage +from morpheus.stages.postprocess.filter_detections_stage import FilterDetectionsStage def test_constructor(config): diff --git a/tests/test_filter_detections_stage_pipe.py b/tests/test_filter_detections_stage_pipe.py index 4c7268d634..a9a2cc2c12 100755 --- a/tests/test_filter_detections_stage_pipe.py +++ b/tests/test_filter_detections_stage_pipe.py @@ -19,11 +19,11 @@ import numpy as np from morpheus.pipeline import LinearPipeline -from morpheus.pipeline.general_stages import FilterDetectionsStage -from morpheus.pipeline.input.from_file import FileSourceStage -from morpheus.pipeline.output.serialize import SerializeStage -from morpheus.pipeline.output.to_file import WriteToFileStage -from morpheus.pipeline.preprocessing import DeserializeStage +from morpheus.stages.input.file_source_stage import FileSourceStage +from morpheus.stages.output.write_to_file_stage import WriteToFileStage +from morpheus.stages.postprocess.filter_detections_stage import FilterDetectionsStage +from morpheus.stages.postprocess.serialize_stage import SerializeStage +from morpheus.stages.preprocess.deserialize_stage import DeserializeStage from utils import TEST_DIRS from utils import ConvMsg diff --git a/tests/test_hammah.py b/tests/test_hammah.py index 5c6a62da73..b6de493e1b 100755 --- a/tests/test_hammah.py +++ b/tests/test_hammah.py @@ -23,15 +23,16 @@ from morpheus.config import ConfigAutoEncoder from morpheus.config import PipelineModes from morpheus.pipeline import LinearPipeline -from morpheus.pipeline.general_stages import AddScoresStage -from morpheus.pipeline.general_stages import MonitorStage -from morpheus.pipeline.inference.inference_ae import AutoEncoderInferenceStage -from morpheus.pipeline.input.from_cloudtrail import CloudTrailSourceStage -from morpheus.pipeline.output.serialize import SerializeStage -from morpheus.pipeline.output.to_file import WriteToFileStage -from morpheus.pipeline.output.validation import ValidationStage -from morpheus.pipeline.postprocess.timeseries import TimeSeriesStage -from morpheus.pipeline.preprocess import autoencoder +from morpheus.stages.general.monitor_stage import MonitorStage +from morpheus.stages.inference.auto_encoder_inference_stage import AutoEncoderInferenceStage +from morpheus.stages.input.cloud_trail_source_stage import CloudTrailSourceStage +from morpheus.stages.output.write_to_file_stage import WriteToFileStage +from morpheus.stages.postprocess.add_scores_stage import AddScoresStage +from morpheus.stages.postprocess.serialize_stage import SerializeStage +from morpheus.stages.postprocess.timeseries_stage import TimeSeriesStage +from morpheus.stages.postprocess.validation_stage import ValidationStage +from morpheus.stages.preprocess import preprocess_ae_stage +from morpheus.stages.preprocess import train_ae_stage from utils import TEST_DIRS from utils import calc_error_val @@ -40,9 +41,10 @@ @pytest.mark.slow @pytest.mark.use_python -@pytest.mark.reload_modules(autoencoder) +@pytest.mark.reload_modules(preprocess_ae_stage) +@pytest.mark.reload_modules(train_ae_stage) @pytest.mark.usefixtures("reload_modules") -@mock.patch('morpheus.pipeline.preprocess.autoencoder.AutoEncoder') +@mock.patch('morpheus.stages.preprocess.train_ae_stage.AutoEncoder') def test_hammah_roleg(mock_ae, config, tmp_path): tensor_data = np.loadtxt(os.path.join(TEST_DIRS.expeced_data_dir, 'hammah_roleg_tensor.csv'), delimiter=',') anomaly_score = np.loadtxt(os.path.join(TEST_DIRS.expeced_data_dir, 'hammah_roleg_anomaly_score.csv'), @@ -79,8 +81,8 @@ def test_hammah_roleg(mock_ae, config, tmp_path): pipe = LinearPipeline(config) pipe.set_source(CloudTrailSourceStage(config, input_glob=input_glob, sort_glob=True)) - pipe.add_stage(autoencoder.TrainAEStage(config, train_data_glob=train_data_glob, seed=42, sort_glob=True)) - pipe.add_stage(autoencoder.PreprocessAEStage(config)) + pipe.add_stage(train_ae_stage.TrainAEStage(config, train_data_glob=train_data_glob, seed=42, sort_glob=True)) + pipe.add_stage(preprocess_ae_stage.PreprocessAEStage(config)) pipe.add_stage(AutoEncoderInferenceStage(config)) pipe.add_stage(AddScoresStage(config)) pipe.add_stage( @@ -114,9 +116,10 @@ def test_hammah_roleg(mock_ae, config, tmp_path): @pytest.mark.slow @pytest.mark.use_python -@pytest.mark.reload_modules(autoencoder) +@pytest.mark.reload_modules(preprocess_ae_stage) +@pytest.mark.reload_modules(train_ae_stage) @pytest.mark.usefixtures("reload_modules") -@mock.patch('morpheus.pipeline.preprocess.autoencoder.AutoEncoder') +@mock.patch('morpheus.stages.preprocess.train_ae_stage.AutoEncoder') def test_hammah_user123(mock_ae, config, tmp_path): tensor_data = np.loadtxt(os.path.join(TEST_DIRS.expeced_data_dir, 'hammah_user123_tensor.csv'), delimiter=',') anomaly_score = np.loadtxt(os.path.join(TEST_DIRS.expeced_data_dir, 'hammah_user123_anomaly_score.csv'), @@ -152,8 +155,8 @@ def test_hammah_user123(mock_ae, config, tmp_path): pipe = LinearPipeline(config) pipe.set_source(CloudTrailSourceStage(config, input_glob=input_glob, sort_glob=True)) - pipe.add_stage(autoencoder.TrainAEStage(config, train_data_glob=train_data_glob, seed=42, sort_glob=True)) - pipe.add_stage(autoencoder.PreprocessAEStage(config)) + pipe.add_stage(train_ae_stage.TrainAEStage(config, train_data_glob=train_data_glob, seed=42, sort_glob=True)) + pipe.add_stage(preprocess_ae_stage.PreprocessAEStage(config)) pipe.add_stage(AutoEncoderInferenceStage(config)) pipe.add_stage(AddScoresStage(config)) pipe.add_stage( diff --git a/tests/test_inference_stage.py b/tests/test_inference_stage.py index 83ab5469df..826a9d3e59 100755 --- a/tests/test_inference_stage.py +++ b/tests/test_inference_stage.py @@ -20,8 +20,8 @@ import cupy as cp import pytest -from morpheus.pipeline.inference import inference_stage -from morpheus.pipeline.messages import ResponseMemoryProbs +from morpheus.messages import ResponseMemoryProbs +from morpheus.stages.inference import inference_stage from utils import IW @@ -107,7 +107,7 @@ def test_py_inf_fn(config): @pytest.mark.use_python @mock.patch('neo.Future') -@mock.patch('morpheus.pipeline.inference.inference_stage.ops') +@mock.patch('morpheus.stages.inference.inference_stage.ops') def test_py_inf_fn_on_next(mock_ops, mock_future, config): mock_future.return_value = mock_future mock_node = mock.MagicMock() diff --git a/tests/test_inference_worker.py b/tests/test_inference_worker.py index c98330155a..b02d7dacbe 100755 --- a/tests/test_inference_worker.py +++ b/tests/test_inference_worker.py @@ -18,7 +18,7 @@ import pytest -from morpheus.pipeline.inference import inference_stage +from morpheus.stages.inference import inference_stage from morpheus.utils.producer_consumer_queue import ProducerConsumerQueue from utils import IW diff --git a/tests/test_messages.py b/tests/test_messages.py index f14447f6ad..dec9d4ae5d 100644 --- a/tests/test_messages.py +++ b/tests/test_messages.py @@ -20,7 +20,8 @@ import pytest import morpheus._lib.messages as neom -from morpheus.pipeline import messages +import morpheus.config +from morpheus import messages def check_message(python_type: type, cpp_type: type, should_be_cpp: bool, no_cpp_class: bool, args: tuple): @@ -108,15 +109,17 @@ def check_all_messages(should_be_cpp: bool, no_cpp_class: bool): def test_constructor_cpp(config): - from morpheus.config import CppConfig - check_all_messages(CppConfig.get_should_use_cpp(), False) + check_all_messages(morpheus.config.CppConfig.get_should_use_cpp(), False) -@pytest.mark.reload_modules(messages) +@pytest.mark.reload_modules(morpheus.config) @pytest.mark.usefixtures("reload_modules", "restore_environ") -@pytest.mark.use_cpp def test_constructor_env(config): + # Set the NO_CPP flag which should disable C++ regardless os.environ['MORPHEUS_NO_CPP'] = '1' - importlib.reload(messages) - check_all_messages(False, True) + # Reload the CppConfig class just in case + importlib.reload(morpheus.config) + + # Check all messages. Should be False regardless due to the environment variable + check_all_messages(False, False) diff --git a/tests/test_monitor_stage.py b/tests/test_monitor_stage.py index c31529c886..683bcf9fce 100755 --- a/tests/test_monitor_stage.py +++ b/tests/test_monitor_stage.py @@ -21,14 +21,14 @@ import cudf -from morpheus.pipeline import general_stages as gs -from morpheus.pipeline.messages import MultiMessage +from morpheus.messages import MultiMessage +from morpheus.stages.general.monitor_stage import MonitorStage def test_constructor(config): # Intentionally not making assumptions about the defaults other than they exist # and still create a valid stage. - m = gs.MonitorStage(config) + m = MonitorStage(config) assert m.name == "monitor" # Just ensure that we get a valid non-empty tuple @@ -36,19 +36,21 @@ def test_constructor(config): assert isinstance(accepted_types, tuple) assert len(accepted_types) > 0 - two_x = lambda x: x * 2 - m = gs.MonitorStage(config, description="Test Description", smoothing=0.7, unit='units', determine_count_fn=two_x) + def two_x(x): + return x * 2 + + m = MonitorStage(config, description="Test Description", smoothing=0.7, unit='units', determine_count_fn=two_x) assert m._description == "Test Description" assert m._smoothing == 0.7 assert m._unit == "units" assert m._determine_count_fn is two_x -@mock.patch('morpheus.pipeline.general_stages.MorpheusTqdm') +@mock.patch('morpheus.stages.general.monitor_stage.MorpheusTqdm') def test_on_start(mock_morph_tqdm, config): mock_morph_tqdm.return_value = mock_morph_tqdm - m = gs.MonitorStage(config) + m = MonitorStage(config) assert m._progress is None m.on_start() @@ -57,11 +59,11 @@ def test_on_start(mock_morph_tqdm, config): assert m._progress is mock_morph_tqdm -@mock.patch('morpheus.pipeline.general_stages.MorpheusTqdm') +@mock.patch('morpheus.stages.general.monitor_stage.MorpheusTqdm') def test_stop(mock_morph_tqdm, config): mock_morph_tqdm.return_value = mock_morph_tqdm - m = gs.MonitorStage(config) + m = MonitorStage(config) assert m._progress is None # Calling on_stop is a noop if we are stopped @@ -73,11 +75,11 @@ def test_stop(mock_morph_tqdm, config): mock_morph_tqdm.close.assert_called_once() -@mock.patch('morpheus.pipeline.general_stages.MorpheusTqdm') +@mock.patch('morpheus.stages.general.monitor_stage.MorpheusTqdm') def test_refresh(mock_morph_tqdm, config): mock_morph_tqdm.return_value = mock_morph_tqdm - m = gs.MonitorStage(config) + m = MonitorStage(config) assert m._progress is None m.on_start() @@ -85,7 +87,7 @@ def test_refresh(mock_morph_tqdm, config): mock_morph_tqdm.refresh.assert_called_once() -@mock.patch('morpheus.pipeline.general_stages.MorpheusTqdm') +@mock.patch('morpheus.stages.general.monitor_stage.MorpheusTqdm') def test_build_single(mock_morph_tqdm, config): mock_morph_tqdm.return_value = mock_morph_tqdm @@ -94,7 +96,7 @@ def test_build_single(mock_morph_tqdm, config): mock_segment.make_sink.return_value = mock_stream mock_input = mock.MagicMock() - m = gs.MonitorStage(config) + m = MonitorStage(config) m._build_single(mock_segment, mock_input) m.on_start() @@ -113,7 +115,7 @@ def test_build_single(mock_morph_tqdm, config): def test_auto_count_fn(config): - m = gs.MonitorStage(config) + m = MonitorStage(config) assert m._auto_count_fn(None) is None assert m._auto_count_fn([]) is None @@ -134,11 +136,11 @@ def test_auto_count_fn(config): assert m._auto_count_fn(set()) is len -@mock.patch('morpheus.pipeline.general_stages.MorpheusTqdm') +@mock.patch('morpheus.stages.general.monitor_stage.MorpheusTqdm') def test_progress_sink(mock_morph_tqdm, config): mock_morph_tqdm.return_value = mock_morph_tqdm - m = gs.MonitorStage(config) + m = MonitorStage(config) m.on_start() m._progress_sink(None) diff --git a/tests/test_phishing.py b/tests/test_phishing.py index fa0d68dd19..120c7560dc 100755 --- a/tests/test_phishing.py +++ b/tests/test_phishing.py @@ -22,15 +22,15 @@ from morpheus.config import PipelineModes from morpheus.pipeline import LinearPipeline -from morpheus.pipeline.general_stages import AddClassificationsStage -from morpheus.pipeline.general_stages import MonitorStage -from morpheus.pipeline.inference.inference_triton import TritonInferenceStage -from morpheus.pipeline.input.from_file import FileSourceStage -from morpheus.pipeline.output.serialize import SerializeStage -from morpheus.pipeline.output.to_file import WriteToFileStage -from morpheus.pipeline.output.validation import ValidationStage -from morpheus.pipeline.preprocessing import DeserializeStage -from morpheus.pipeline.preprocessing import PreprocessNLPStage +from morpheus.stages.general.monitor_stage import MonitorStage +from morpheus.stages.inference.triton_inference_stage import TritonInferenceStage +from morpheus.stages.input.file_source_stage import FileSourceStage +from morpheus.stages.output.write_to_file_stage import WriteToFileStage +from morpheus.stages.postprocess.add_classifications_stage import AddClassificationsStage +from morpheus.stages.postprocess.serialize_stage import SerializeStage +from morpheus.stages.postprocess.validation_stage import ValidationStage +from morpheus.stages.preprocess.deserialize_stage import DeserializeStage +from morpheus.stages.preprocess.preprocess_nlp_stage import PreprocessNLPStage from utils import TEST_DIRS from utils import calc_error_val diff --git a/tests/test_serialize_stage.py b/tests/test_serialize_stage.py index 940a0b36fc..d2e43da59b 100755 --- a/tests/test_serialize_stage.py +++ b/tests/test_serialize_stage.py @@ -20,9 +20,9 @@ import cudf -from morpheus.pipeline.messages import MessageMeta -from morpheus.pipeline.messages import MultiMessage -from morpheus.pipeline.output.serialize import SerializeStage +from morpheus.messages import MessageMeta +from morpheus.messages import MultiMessage +from morpheus.stages.postprocess.serialize_stage import SerializeStage @pytest.mark.use_python diff --git a/tests/test_serialize_stage_pipe.py b/tests/test_serialize_stage_pipe.py index e295f1d357..c34d07b8ba 100755 --- a/tests/test_serialize_stage_pipe.py +++ b/tests/test_serialize_stage_pipe.py @@ -19,13 +19,13 @@ import numpy as np import pytest -from morpheus.pipeline import LinearPipeline -from morpheus.pipeline.file_types import FileTypes -from morpheus.pipeline.input.from_file import FileSourceStage -from morpheus.pipeline.input.utils import read_file_to_df -from morpheus.pipeline.output.serialize import SerializeStage -from morpheus.pipeline.output.to_file import WriteToFileStage -from morpheus.pipeline.preprocessing import DeserializeStage +from morpheus._lib.file_types import FileTypes +from morpheus.io.deserializers import read_file_to_df +from morpheus.pipeline.linear_pipeline import LinearPipeline +from morpheus.stages.input.file_source_stage import FileSourceStage +from morpheus.stages.output.write_to_file_stage import WriteToFileStage +from morpheus.stages.postprocess.serialize_stage import SerializeStage +from morpheus.stages.preprocess.deserialize_stage import DeserializeStage from utils import TEST_DIRS diff --git a/tests/test_sid.py b/tests/test_sid.py index 40541ec005..d2a4f34d03 100755 --- a/tests/test_sid.py +++ b/tests/test_sid.py @@ -22,15 +22,15 @@ from morpheus.config import PipelineModes from morpheus.pipeline import LinearPipeline -from morpheus.pipeline.general_stages import AddClassificationsStage -from morpheus.pipeline.general_stages import MonitorStage -from morpheus.pipeline.inference.inference_triton import TritonInferenceStage -from morpheus.pipeline.input.from_file import FileSourceStage -from morpheus.pipeline.output.serialize import SerializeStage -from morpheus.pipeline.output.to_file import WriteToFileStage -from morpheus.pipeline.output.validation import ValidationStage -from morpheus.pipeline.preprocessing import DeserializeStage -from morpheus.pipeline.preprocessing import PreprocessNLPStage +from morpheus.stages.general.monitor_stage import MonitorStage +from morpheus.stages.inference.triton_inference_stage import TritonInferenceStage +from morpheus.stages.input.file_source_stage import FileSourceStage +from morpheus.stages.output.write_to_file_stage import WriteToFileStage +from morpheus.stages.postprocess.add_classifications_stage import AddClassificationsStage +from morpheus.stages.postprocess.serialize_stage import SerializeStage +from morpheus.stages.postprocess.validation_stage import ValidationStage +from morpheus.stages.preprocess.deserialize_stage import DeserializeStage +from morpheus.stages.preprocess.preprocess_nlp_stage import PreprocessNLPStage from utils import TEST_DIRS from utils import calc_error_val diff --git a/tests/test_trigger_stage.py b/tests/test_trigger_stage.py index 9d4f83f82d..54c11e45f5 100755 --- a/tests/test_trigger_stage.py +++ b/tests/test_trigger_stage.py @@ -18,7 +18,7 @@ import pytest -from morpheus.pipeline.general_stages import TriggerStage +from morpheus.stages.general.trigger_stage import TriggerStage def test_constructor(config): diff --git a/tests/utils.py b/tests/utils.py index 45176a23f0..1f770e57cd 100755 --- a/tests/utils.py +++ b/tests/utils.py @@ -17,14 +17,14 @@ import json import os +from morpheus._lib.file_types import FileTypes from morpheus.config import Config -from morpheus.pipeline.file_types import FileTypes -from morpheus.pipeline.inference import inference_stage -from morpheus.pipeline.input.utils import read_file_to_df -from morpheus.pipeline.messages import MultiMessage -from morpheus.pipeline.messages import MultiResponseProbsMessage -from morpheus.pipeline.messages import ResponseMemoryProbs -from morpheus.pipeline.pipeline import SinglePortStage +from morpheus.io.deserializers import read_file_to_df +from morpheus.messages import MultiMessage +from morpheus.messages import MultiResponseProbsMessage +from morpheus.messages import ResponseMemoryProbs +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.stages.inference import inference_stage class TestDirectories(object): From bd60e5d2afbbd5e5d51dc91e3b956965ce0e3cf4 Mon Sep 17 00:00:00 2001 From: Devin Robison Date: Tue, 17 May 2022 09:27:00 -0600 Subject: [PATCH 21/73] Update morpheus dev container to support flag for building with debug python build + source files. (#81) resolves #21 Add the ability to build the morpheus dev container with a debug build of cpython + source libraries. Authors: - Devin Robison (https://github.com/drobison00) Approvers: - Pete MacKinnon (https://github.com/pdmack) - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/NVIDIA/Morpheus/pull/81 --- CONTRIBUTING.md | 22 ++++ ci/conda/recipes/python-dbg/build.sh | 23 ++++ .../python-dbg/conda_build_config.yaml | 20 +++ ci/conda/recipes/python-dbg/meta.yaml | 67 ++++++++++ ci/conda/recipes/python_dbg_install.sh | 118 ++++++++++++++++++ ci/conda/recipes/run_conda_build.sh | 9 ++ docker/Dockerfile | 28 ++++- 7 files changed, 284 insertions(+), 3 deletions(-) create mode 100644 ci/conda/recipes/python-dbg/build.sh create mode 100644 ci/conda/recipes/python-dbg/conda_build_config.yaml create mode 100644 ci/conda/recipes/python-dbg/meta.yaml create mode 100755 ci/conda/recipes/python_dbg_install.sh diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c462b698bd..c06f2780d4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -90,6 +90,28 @@ This workflow utilizes a docker container to set up most dependencies ensuring a DOCKER_IMAGE_TAG=my_tag ./docker/build_container_dev.sh ``` Would build the container `morpheus:my_tag`. + 1. To build the container with a debugging version of cpython installed, update the docker target as follows: + ```shell + DOCKER_TARGET=development_pydbg ./docker/build_container_dev.sh + ``` + 1. Note: When debugging python code, you just need to add `ci/conda/recipes/python-dbg/source` to your debugger's + source path. + 1. Once created, you will be able to introspect python objects from within GDB. For example, if we were to break + within a generator setup call and examine it's PyFrame_Object `f`, it might look like this: + ```shell + #4 0x000056498ce685f4 in gen_send_ex (gen=0x7f3ecc07ad40, arg=, exc=, closing=) at Objects/genobject.c:222 + (gdb) pyo f + object address : 0x7f3eb3888750 + object refcount : 1 + object type : 0x56498cf99c00 + object type name: frame + object repr : =1.1.1n,<2.0 # Required for TLS/SSL capabilities in pip. + - readline [unix] + - sqlite [unix] + - tk [unix] + - xz [unix] + - zlib [unix] + run: + - bzip2 [unix] + - libffi [unix] + - openssl >=1.1.1n,<2.0 # Required for TLS/SSL capabilities in pip. + - readline [unix] + - sqlite [unix] + - tk [unix] + - xz [unix] + - zlib [unix] + +test: + commands: + - python -V [unix] + - python3 -V [unix] + - 2to3 -h + - pydoc -h + - python3-config --help [unix] + +about: + home: http://www.python.org/ + license: PSF + summary: general purpose programming language diff --git a/ci/conda/recipes/python_dbg_install.sh b/ci/conda/recipes/python_dbg_install.sh new file mode 100755 index 0000000000..46fe26ce3c --- /dev/null +++ b/ci/conda/recipes/python_dbg_install.sh @@ -0,0 +1,118 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e + +function usage { + echo "$0 -s [CPYTHON_SOURCE] -p [CONDA_INSTALL_FILE_PATH] -i [SOURCE_INSTALL_PATH] -g [GDBINIT_INSTALL_PATH]" + + exit 0 +} + +function help { +echo <<-DOC +Usage: $0 [OPTION]... +Install debug version of cpython, into the current conda environment, which has previously been downloaded/built. + +Arguments: +-s Path to cpython (s)ource tarball, source files will be extracted and installed to path specified by '-i'. +-c Path to cpython (c)onda tarball, this is what will be installed into the conda environment. +-i Path where cpython source files will be installed. + Default: ci/conda/recipes/python-dbg/source +-g Path to install point for cpython 'gdbinit' file. Ignored if empty. + Note: Requires cpython source install point '-i' to be specified so that we can locate the gdb macros. +DOC + +exit 0 +} + +function set_py_ver { + ## Get the version information + PYDEBUG_VERSION=$(python --version | cut -d ' ' -f2 ) + PYDEBUG_VERSION_MAJ_MIN=$(echo "${PYDEBUG_VERSION}" | awk '{split($0,ver,"."); print ver[1] "." ver[2]}') +} + +PYDEBUG_CONDA_INSTALL_FILE="" +PYDEBUG_INSTALL_GDB_PATH="" +PYDEBUG_INSTALL_GDB_PATH="" +PYDEBUG_INSTALL_PATH=${PWD}/ci/conda/recipes/python-dbg/source +PYDEBUG_VERSION="" +PYDEBUG_VERSION_MAJ_MIN="" + +while getopts "s:c:i:gh" opt; do + case ${opt} in + s) PYDEBUG_SOURCE=${OPTARG};; + c) PYDEBUG_CONDA_INSTALL_FILE=${OPTARG};; + i) PYDEBUG_INSTALL_PATH=${OPTARG};; + g) PYDEBUG_INSTALL_GDB_PATH=${OPTARG};; + h) help;; + *) usage;; + esac +done + +# Install conda package +if [ -n "${PYDEBUG_CONDA_INSTALL_FILE}" ]; then + if [ ! -f "${PYDEBUG_CONDA_INSTALL_FILE}" ]; then + echo "Conda install file does not exist or is inaccessible: ${PYDEBUG_CONDA_INSTALL_FILE}" + exit 1 + else + echo "Installing cpython debug build: ${PYDEBUG_CONDA_INSTALL_FILE}" + mamba install --use-local "${PYDEBUG_CONDA_INSTALL_FILE}" + + set_py_ver + ## Conda package will install python source to python3.xd (for development), which the CMake configure files won't find + ## Copy the includes to the python3.x folder so CMake can find them. + cp -R /opt/conda/envs/morpheus/include/python${PYDEBUG_VERSION_MAJ_MIN}d/* \ + /opt/conda/envs/morpheus/include/python${PYDEBUG_VERSION_MAJ_MIN} + fi +else + echo "No Conda install file specified, skipping..." + set_py_ver +fi + +# Install cpython source files +if [[ -n ${PYDEBUG_SOURCE} && -n ${PYDEBUG_INSTALL_PATH} ]]; then + if [[ ! -f ${PYDEBUG_SOURCE} ]]; then + echo "Cpython source file does not exist or is inaccessible: ${PYDEBUG_SOURCE}" + exit 1 + fi + + if [[ ! -f ${PYDEBUG_INSTALL_PATH} ]]; then + mkdir -p "${PYDEBUG_INSTALL_PATH}" + fi + + # Extract cpython source to /workspace \ + for src_dir in Include Misc Modules Objects Python; do + tar --strip-components=1 --extract --wildcards --file="${PYDEBUG_SOURCE}" Python-${PYDEBUG_VERSION}/${src_dir}/* + mv ./${src_dir} "${PYDEBUG_INSTALL_PATH}/${src_dir}" + done +else + echo "Missing cpython source tarball or install path, skipping..." +fi + +# Install GDB init macros +if [[ -f ${PYDEBUG_INSTALL_PATH} ]]; then + # Move cpython gdb helper macros to ${HOME}/.gdbinit \ + # See: https://github.com/python/cpython/blob/main/Misc/gdbinit + if [[ "${PYDEBUG_INSTALL_GDB_PATH}" != "" ]]; then + GDB_SRC_PATH="${PYDEBUG_INSTALL_PATH}/Misc/gdbinit" + if [[ ! -f "${GDB_SRC_PATH}" ]]; then + echo "gdbinit path does not exist or is inaccessible: ${GDB_SRC_PATH}" + exit 1 + fi + + cp "${GDB_SRC_PATH}" "${PYDEBUG_INSTALL_GDB_PATH}" + fi +fi diff --git a/ci/conda/recipes/run_conda_build.sh b/ci/conda/recipes/run_conda_build.sh index 2d6ab7cb99..98b25d62b5 100755 --- a/ci/conda/recipes/run_conda_build.sh +++ b/ci/conda/recipes/run_conda_build.sh @@ -140,3 +140,12 @@ if hasArg morpheus; then conda ${CONDA_COMMAND} "${CONDA_ARGS_ARRAY[@]}" ${CONDA_ARGS} ci/conda/recipes/morpheus set +x fi + +if hasArg pydebug; then + export MORPHEUS_PYTHON_VER=$(python --version | cut -d ' ' -f 2) + + echo "Running conda-build for python-dbg..." + set -x + conda ${CONDA_COMMAND} "${CONDA_ARGS_ARRAY[@]}" ${CONDA_ARGS} ./ci/conda/recipes/python-dbg + set +x +fi diff --git a/docker/Dockerfile b/docker/Dockerfile index 5fd3f6055e..2c813572c9 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -80,7 +80,7 @@ RUN --mount=type=ssh \ source activate base &&\ # Run with --no-test for now until we can build with builtkit and default nvidia runtime # Temp add CONDA_CHANNEL_ALIAS to get around conda-build 404 errors - MORPHEUS_ROOT=/workspace CONDA_BLD_DIR=/opt/conda/conda-bld CONDA_ARGS="--no-test" ./ci/conda/recipes/run_conda_build.sh libcudf cudf + MORPHEUS_ROOT=/workspace CONDA_BLD_PATH=/opt/conda/conda-bld CONDA_ARGS="--no-test" ./ci/conda/recipes/run_conda_build.sh libcudf cudf # ============ Stage: conda_env ============ # Create the conda environment and install all dependencies @@ -143,7 +143,7 @@ RUN --mount=type=ssh \ --mount=type=cache,id=conda_pkgs,target=/opt/conda/pkgs,sharing=locked \ source activate base &&\ # Temp add CONDA_CHANNEL_ALIAS to get around conda-build 404 errors - MORPHEUS_ROOT=/workspace CONDA_BLD_DIR=/opt/conda/conda-bld CONDA_ARGS="--no-test" ./ci/conda/recipes/run_conda_build.sh morpheus + MORPHEUS_ROOT=/workspace CONDA_BLD_PATH=/opt/conda/conda-bld CONDA_ARGS="--no-test" ./ci/conda/recipes/run_conda_build.sh morpheus # ============ Stage: runtime ============ # Setup container for runtime environment @@ -178,7 +178,6 @@ CMD [ "morpheus" ] # ============ Stage: development ============ # Install and configure development only packages FROM conda_env_dev as development - # Copy the source # COPY . ./ @@ -189,3 +188,26 @@ RUN npm install -g camouflage-server # greater. See https://marc.info/?l=git&m=164989570902912&w=2. Only enable for # development RUN git config --global --add safe.directory "*" + +# ============ Stage: python_debug_bld =========== +# Configure and build cpython with debugging symbols +FROM development as development_pydbg + +COPY ci/conda/recipes/python-dbg/ ./ci/conda/recipes/python-dbg +COPY ci/conda/recipes/run_conda_build.sh ./ci/conda/recipes/run_conda_build.sh +COPY ci/conda/recipes/python_dbg_install.sh ./ci/conda/recipes/python_dbg_install.sh + +# Temporary until #68 goes in +ARG MORPHEUS_USER="root" + +# Build and install debug cpython +RUN source activate morpheus \ + && MORPHEUS_ROOT=/workspace \ + CONDA_BLD_PATH=/opt/conda/conda-bld \ + CONDA_ARGS="--no-test" \ + ./ci/conda/recipes/run_conda_build.sh pydebug \ + && ./ci/conda/recipes/python_dbg_install.sh \ + -s $( ls /opt/conda/conda-bld/src_cache/Python-${PYTHON_VER}*.tar.xz ) \ + -c $( ls /opt/conda/conda-bld/linux-64/python-${PYTHON_VER}*.tar.bz2 ) \ + -i ./ci/conda/recipes/python-dbg/source \ + -g $(eval echo "~${MORPHEUS_USER}")/.gdbinit From 820258d48d32584aba851394d464781a1f334522 Mon Sep 17 00:00:00 2001 From: Pete MacKinnon Date: Tue, 17 May 2022 11:28:10 -0400 Subject: [PATCH 22/73] Update morpheus_quickstart_guide.md (#106) Make sure we resolve symlinks in the model copy. Authors: - Pete MacKinnon (https://github.com/pdmack) Approvers: - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/NVIDIA/Morpheus/pull/106 --- docs/source/morpheus_quickstart_guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/morpheus_quickstart_guide.md b/docs/source/morpheus_quickstart_guide.md index f8cf38860f..c8f7a41d68 100644 --- a/docs/source/morpheus_quickstart_guide.md +++ b/docs/source/morpheus_quickstart_guide.md @@ -230,7 +230,7 @@ pod/sdk-cli-helper 1/1 Running 0 41s Connect to the **sdk-cli-helper** and copy models to `/common`, which is mapped to `/opt/morpheus/common` on the host and where MLFlow will have access to model files. ```bash -$ kubectl -n $NAMESPACE exec sdk-cli-helper -- cp -R /workspace/models /common +$ kubectl -n $NAMESPACE exec sdk-cli-helper -- cp -RL /workspace/models /common ``` ### Install Morpheus MLFlow Triton Plugin From 77a591861f202c12f010fa54d8f9488ec933060a Mon Sep 17 00:00:00 2001 From: Devin Robison Date: Tue, 17 May 2022 09:36:42 -0600 Subject: [PATCH 23/73] Add pybind11-stubgen to conda environment yaml. (#109) Resolves #108 Authors: - Devin Robison (https://github.com/drobison00) Approvers: - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/NVIDIA/Morpheus/pull/109 --- docker/conda/environments/cuda11.4_dev.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/conda/environments/cuda11.4_dev.yml b/docker/conda/environments/cuda11.4_dev.yml index 1a7252f9d6..6620542ccd 100644 --- a/docker/conda/environments/cuda11.4_dev.yml +++ b/docker/conda/environments/cuda11.4_dev.yml @@ -56,6 +56,7 @@ dependencies: - pandas=1.3 - pip - protobuf=3.19 + - pybind11-stubgen - pydot - pytest - pytest-benchmark From 91225b98bf685387bcc82e7e31dea8bfed385d8b Mon Sep 17 00:00:00 2001 From: Pete MacKinnon Date: Wed, 18 May 2022 09:25:27 -0400 Subject: [PATCH 24/73] Update mlflow-env.yml (#113) Upgrade openssl Authors: - Pete MacKinnon (https://github.com/pdmack) Approvers: - Bartley Richardson (https://github.com/BartleyR) URL: https://github.com/NVIDIA/Morpheus/pull/113 --- models/mlflow/docker/conda/mlflow-env.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/models/mlflow/docker/conda/mlflow-env.yml b/models/mlflow/docker/conda/mlflow-env.yml index bfdcb38c0d..9b06584b19 100644 --- a/models/mlflow/docker/conda/mlflow-env.yml +++ b/models/mlflow/docker/conda/mlflow-env.yml @@ -6,6 +6,7 @@ dependencies: - python=3.8 - pip - onnx + - openssl>=1.1.1o - pip: - onnxruntime - mlflow From c52cb248d13a3d54adee9e1b39ba8a21b9866d90 Mon Sep 17 00:00:00 2001 From: David Gardner <96306125+dagardner-nv@users.noreply.github.com> Date: Mon, 23 May 2022 13:16:31 -0700 Subject: [PATCH 25/73] Jenkins integration (#80) Updates conda scripts to uses sccache (ccache work-alike with an S3 backend) Adds 4 Jenkins stages: 1. check 1. build 1. test 1. docs build Results are publised into S3 with a 30 day retention police and are available via: `https://downloads.rapids.ai/ci/morpheus/pull-request////` ex: https://downloads.rapids.ai/ci/morpheus/pull-request/80/5161d30673f4d5fb34452df5a8ac6f68b8462685/x86_64/ Intermediate Artifacts pushed to S3: * conda_env.tar.gz - Morpheus conda environment used by test & documentation stages * workspace.tar.bz - Morpheus workspace used by test & documentation stages Results pushed to S3: * docs.tar.bz - Sphinx HTML documentation * report_pytest.xml - Pytest junit report * report_pytest_coverage.xml - Pytest coverage report * conda_build.tar.bz - Morpheus conda build (not currently working) Conda builds for cudf are cached seperately (even with sscache this step was still took 17 minutes). S3 cache location at: `https://downloads.rapids.ai/ci/morpheus/cudf/////cudf_conda.tar.bz` ex: https://downloads.rapids.ai/ci/morpheus/cudf/11.4/3.8/21.10/b7f728e6db4fc6124970935f461a6791818bfb1d/x86_64/cudf_conda.tar.bz TODO List: - [x] Need a test stage - [x] Need to run style checks - [x] Need to add sccache - [x] Need to cache cudf conda packages - [x] Need to be able to build without using a gpu - [x] Output junit style xml - [x] Output docs build - [ ] Add conda build step - [ ] Need to figure out a way to cache lfs Closes #102 Closes #104 Authors: - David Gardner (https://github.com/dagardner-nv) Approvers: - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/80 --- ci/Jenkinsfile | 147 ++++++++++++++++++++ ci/conda/recipes/cudf/meta.yaml | 4 +- ci/conda/recipes/morpheus/morpheus_build.sh | 9 +- ci/conda/recipes/run_conda_build.sh | 23 ++- ci/scripts/common.sh | 4 +- ci/scripts/jenkins/build.sh | 120 ++++++++++++++++ ci/scripts/jenkins/checks.sh | 30 ++++ ci/scripts/jenkins/common.sh | 46 ++++++ ci/scripts/jenkins/docs.sh | 53 +++++++ ci/scripts/jenkins/test.sh | 77 ++++++++++ docker/conda/environments/cuda11.4_ci.yml | 23 +++ docker/conda/environments/requirements.txt | 1 + 12 files changed, 526 insertions(+), 11 deletions(-) create mode 100644 ci/Jenkinsfile create mode 100755 ci/scripts/jenkins/build.sh create mode 100755 ci/scripts/jenkins/checks.sh create mode 100644 ci/scripts/jenkins/common.sh create mode 100755 ci/scripts/jenkins/docs.sh create mode 100755 ci/scripts/jenkins/test.sh create mode 100644 docker/conda/environments/cuda11.4_ci.yml diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile new file mode 100644 index 0000000000..aaffaf22d6 --- /dev/null +++ b/ci/Jenkinsfile @@ -0,0 +1,147 @@ +pipeline { + agent any + options { + disableConcurrentBuilds(abortPrevious: true) + } + environment { + PYTHON_VER = '3.8' + RAPIDS_VER = '21.10' + CUDA_VER = '11.4' + HOME = "${WORKSPACE}" + } + stages { + stage('Checks & Builds') { + failFast true + parallel { + stage('Check') { + options { + timeout(time: 1, unit: 'HOURS') + } + agent { + docker { + image 'gpuci/rapidsai-driver:21.10-cuda11.4-devel-ubuntu20.04-py3.8' + label 'cpu' + } + } + steps { + cleanWs( + deleteDirs: true, + externalDelete: 'sudo rm -rf %s' + ) + checkout scm + sh "${WORKSPACE}/ci/scripts/jenkins/checks.sh" + } + } + stage('Build:linux:x86_64:gcc') { + options { + timeout(time: 4, unit: 'HOURS') + } + environment { + PARALLEL_LEVEL = '10' + USE_SCCACHE = '1' + HOME = "${WORKSPACE}" + } + agent { + docker { + image 'gpuci/rapidsai:21.10-cuda11.4-devel-ubuntu20.04-py3.8' + label 'driver-495' + args '--runtime "nvidia" -e "NVIDIA_VISIBLE_DEVICES=$EXECUTOR_NUMBER"' + } + } + steps { + cleanWs( + deleteDirs: true, + externalDelete: 'sudo rm -rf %s' + ) + checkout scm + withCredentials([[ + $class: 'AmazonWebServicesCredentialsBinding', + credentialsId: "aws-s3-gpuci", + accessKeyVariable: 'AWS_ACCESS_KEY_ID', + secretKeyVariable: 'AWS_SECRET_ACCESS_KEY' + ]]) + { + sh "${WORKSPACE}/ci/scripts/jenkins/build.sh" + } + } + } + } + } + stage('Post Build Stages') { + failFast true + parallel { + stage('Test') { + options { + timeout(time: 1, unit: 'HOURS') + } + agent { + docker { + image 'gpuci/rapidsai:21.10-cuda11.4-devel-ubuntu20.04-py3.8' + label 'driver-495' + args '--runtime "nvidia" -e "NVIDIA_VISIBLE_DEVICES=$EXECUTOR_NUMBER"' + } + } + environment { + HOME = "${WORKSPACE}" + } + steps { + cleanWs( + deleteDirs: true, + externalDelete: 'sudo rm -rf %s' + ) + checkout scm + withCredentials([[ + $class: 'AmazonWebServicesCredentialsBinding', + credentialsId: "aws-s3-gpuci", + accessKeyVariable: 'AWS_ACCESS_KEY_ID', + secretKeyVariable: 'AWS_SECRET_ACCESS_KEY' + ]]) + { + sh "${WORKSPACE}/ci/scripts/jenkins/test.sh" + } + } + } + stage('Documentation') { + options { + timeout(time: 1, unit: 'HOURS') + } + agent { + docker { + image 'gpuci/rapidsai:21.10-cuda11.4-devel-ubuntu20.04-py3.8' + label 'driver-495' + args '--runtime "nvidia" -e "NVIDIA_VISIBLE_DEVICES=$EXECUTOR_NUMBER"' + } + } + environment { + HOME = "${WORKSPACE}" + MORPHEUS_NO_CPP = '1' + } + steps { + cleanWs( + deleteDirs: true, + externalDelete: 'sudo rm -rf %s' + ) + checkout scm + withCredentials([[ + $class: 'AmazonWebServicesCredentialsBinding', + credentialsId: "aws-s3-gpuci", + accessKeyVariable: 'AWS_ACCESS_KEY_ID', + secretKeyVariable: 'AWS_SECRET_ACCESS_KEY' + ]]) + { + sh "${WORKSPACE}/ci/scripts/jenkins/docs.sh" + } + } + } + } + } + } + post { + always { + cleanWs( + deleteDirs: true, + externalDelete: 'sudo rm -rf %s' + ) + } + } +} diff --git a/ci/conda/recipes/cudf/meta.yaml b/ci/conda/recipes/cudf/meta.yaml index 451ac90679..bc2c298d59 100644 --- a/ci/conda/recipes/cudf/meta.yaml +++ b/ci/conda/recipes/cudf/meta.yaml @@ -53,7 +53,7 @@ requirements: - {{ compiler("cxx") }} - ccache host: - - protobuf + - protobuf=3.19 - python {{ python }} - cython >=0.29,<0.30 - setuptools @@ -65,7 +65,7 @@ requirements: - cudatoolkit {{ cuda_version }} - rapidjson=1.1 run: - - protobuf + - protobuf=3.19 - python - typing_extensions - pandas >=1.0,<1.4.0dev0 diff --git a/ci/conda/recipes/morpheus/morpheus_build.sh b/ci/conda/recipes/morpheus/morpheus_build.sh index cc0528ad9f..1f767545ae 100644 --- a/ci/conda/recipes/morpheus/morpheus_build.sh +++ b/ci/conda/recipes/morpheus/morpheus_build.sh @@ -21,6 +21,7 @@ CMAKE_ARGS=${CMAKE_ARGS:-""} export CCACHE_BASEDIR=$(realpath ${SRC_DIR}/..) +export USE_SCCACHE=${USE_SCCACHE:-""} # Check for some neo environment variables. Append to front of args to allow users to overwrite them if [[ -n "${MORPHEUS_CACHE_DIR}" ]]; then @@ -36,7 +37,13 @@ CMAKE_ARGS="-DCMAKE_INSTALL_PREFIX=$PREFIX ${CMAKE_ARGS}" CMAKE_ARGS="-DCMAKE_INSTALL_LIBDIR=lib ${CMAKE_ARGS}" CMAKE_ARGS="-DBUILD_SHARED_LIBS=ON ${CMAKE_ARGS}" CMAKE_ARGS="-DMORPHEUS_USE_CONDA=ON ${CMAKE_ARGS}" -CMAKE_ARGS="-DMORPHEUS_USE_CCACHE=ON ${CMAKE_ARGS}" + +if [[ "${USE_SCCACHE}" == "" ]]; then + CMAKE_ARGS="-DMORPHEUS_USE_CCACHE=ON ${CMAKE_ARGS}" +else + CMAKE_ARGS="-DMORPHEUS_USE_CCACHE=OFF ${CMAKE_ARGS}" +fi + CMAKE_ARGS="-DMORPHEUS_BUILD_PYTHON=ON ${CMAKE_ARGS}" CMAKE_ARGS="-DMORPHEUS_PYTHON_INPLACE_BUILD=ON ${CMAKE_ARGS}" CMAKE_ARGS="-DCMAKE_CUDA_ARCHITECTURES=${CMAKE_CUDA_ARCHITECTURES=-"ALL"} ${CMAKE_ARGS}" diff --git a/ci/conda/recipes/run_conda_build.sh b/ci/conda/recipes/run_conda_build.sh index 98b25d62b5..16e48af16a 100755 --- a/ci/conda/recipes/run_conda_build.sh +++ b/ci/conda/recipes/run_conda_build.sh @@ -39,6 +39,7 @@ export NEO_GIT_TAG=${NEO_GIT_TAG:-"5b55e37c6320c1a5747311a1e29e7ebb049d12bc"} # Set CONDA_CHANNEL_ALIAS to mimic the conda config channel_alias property during the build CONDA_CHANNEL_ALIAS=${CONDA_CHANNEL_ALIAS:-""} +export USE_SCCACHE=${USE_SCCACHE:-""} export CUDA="$(conda list | grep cudatoolkit | egrep -o "[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+")" export PYTHON_VER="$(python -c "import sys; print('.'.join(map(str, sys.version_info[:2])))")" @@ -48,21 +49,31 @@ echo "PYTHON_VER : ${PYTHON_VER}" echo "NEO_GIT_TAG : ${NEO_GIT_TAG}" echo "" +export CMAKE_GENERATOR="Ninja" + # Export variables for the cache export MORPHEUS_CACHE_DIR=${MORPHEUS_CACHE_DIR:-"${MORPHEUS_ROOT}/.cache"} - -# Export CCACHE variables export CCACHE_DIR="${MORPHEUS_CACHE_DIR}/ccache" export CCACHE_NOHASHDIR=1 -export CMAKE_GENERATOR="Ninja" -export CMAKE_C_COMPILER_LAUNCHER="ccache" -export CMAKE_CXX_COMPILER_LAUNCHER="ccache" -export CMAKE_CUDA_COMPILER_LAUNCHER="ccache" # Ensure the necessary folders exist before continuing mkdir -p ${MORPHEUS_CACHE_DIR} mkdir -p ${CCACHE_DIR} +# Local builds use ccache +# ci builds will use sccache which is a ccache work-alike but uses an S3 backend +# (https://github.com/mozilla/sccache) +if [[ "${USE_SCCACHE}" == "" ]]; then + # Export CCACHE variables + export CMAKE_C_COMPILER_LAUNCHER="ccache" + export CMAKE_CXX_COMPILER_LAUNCHER="ccache" + export CMAKE_CUDA_COMPILER_LAUNCHER="ccache" +else + export CMAKE_C_COMPILER_LAUNCHER="sccache" + export CMAKE_CXX_COMPILER_LAUNCHER="sccache" + export CMAKE_CUDA_COMPILER_LAUNCHER="sccache" +fi + # Holds the arguments in an array to allow for complex json objects CONDA_ARGS_ARRAY=() diff --git a/ci/scripts/common.sh b/ci/scripts/common.sh index e8a964e7c3..7297169ecf 100644 --- a/ci/scripts/common.sh +++ b/ci/scripts/common.sh @@ -25,8 +25,8 @@ export PY_DIRS="${PY_ROOT} ci/scripts" export YAPF_EXCLUDE_FLAGS="-e ${PY_ROOT}/versioneer.py -e ${PY_ROOT}/morpheus/_version.py" # Determine the commits to compare against. If running in CI, these will be set. Otherwise, diff with main -export BASE_SHA=${CI_MERGE_REQUEST_DIFF_BASE_SHA:-${BASE_SHA:-main}} -export COMMIT_SHA=${CI_COMMIT_SHA:-${COMMIT_SHA:-HEAD}} +export BASE_SHA=${CHANGE_TARGET:-${BASE_SHA:-main}} +export COMMIT_SHA=${GIT_COMMIT:-${COMMIT_SHA:-HEAD}} export CPP_FILE_REGEX='^(\.\/)?(src|include|tests|benchmarks|python)\/.*\.(cc|cpp|h|hpp)$' export PYTHON_FILE_REGEX='^(\.\/)?(?!\.|build).*\.(py|pyx|pxd)$' diff --git a/ci/scripts/jenkins/build.sh b/ci/scripts/jenkins/build.sh new file mode 100755 index 0000000000..cea5b45988 --- /dev/null +++ b/ci/scripts/jenkins/build.sh @@ -0,0 +1,120 @@ +#!/bin/bash +# SPDX-FileCopyrightText: Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e + +source ${WORKSPACE}/ci/scripts/jenkins/common.sh + +gpuci_logger "Creating conda env" +conda config --add pkgs_dirs /opt/conda/pkgs +conda config --env --add channels conda-forge +conda config --env --set channel_alias ${CONDA_CHANNEL_ALIAS:-"https://conda.anaconda.org"} +mamba install -q -y -n base -c conda-forge "boa >=0.10" +mamba create -q -y -n morpheus python=${PYTHON_VER} +conda activate morpheus + +gpuci_logger "Installing CI dependencies" +mamba env update -q -n morpheus -f ${MORPHEUS_ROOT}/docker/conda/environments/cuda${CUDA_VER}_ci.yml + +gpuci_logger "Check versions" +python3 --version +gcc --version +g++ --version + +gpuci_logger "Check conda environment" +conda info +conda config --show-sources +conda list --show-channel-urls + +gpuci_logger "Checking S3 cuDF cache" +CUDF_CONDA_BLD_DIR=/opt/conda/conda-bld +CUDF_CONDA_COMMIT=$(git log -n 1 --pretty=format:%H -- ci/conda) +CUDF_CONDA_CACHE_PATH="/cudf/${CUDA_VER}/${PYTHON_VER}/${RAPIDS_VER}/${CUDF_CONDA_COMMIT}/${NVARCH}/cudf_conda.tar.bz" +CUDF_CONDA_CACHE_URL="${S3_URL}${CUDF_CONDA_CACHE_PATH}" +CUDF_CONDA_TAR="${WORKSPACE_TMP}/cudf_conda.tar.bz" + +gpuci_logger "Checking ${DISPLAY_URL}${CUDF_CONDA_CACHE_PATH}" +set +e +aws s3 cp --no-progress ${CUDF_CONDA_CACHE_URL} ${CUDF_CONDA_TAR} +CUDF_CACHE_CHECK=$? +set -e + +if [[ "${CUDF_CACHE_CHECK}" != "0" ]]; then + gpuci_logger "Cache miss, Building cuDF" + mkdir -p ${CUDF_CONDA_BLD_DIR} + # The --no-build-id bit is needed for sccache + CONDA_ARGS="--no-build-id --output-folder ${CUDF_CONDA_BLD_DIR} --skip-existing --no-test" ${MORPHEUS_ROOT}/ci/conda/recipes/run_conda_build.sh libcudf cudf + + gpuci_logger "sccache usage for cudf build:" + sccache --show-stats + sccache --zero-stats 2>&1 > /dev/null + + gpuci_logger "Archiving cuDF build" + cd $(dirname ${CUDF_CONDA_BLD_DIR}) + tar cfj ${CUDF_CONDA_TAR} $(basename ${CUDF_CONDA_BLD_DIR}) + cd - + aws s3 cp --no-progress ${CUDF_CONDA_TAR} ${CUDF_CONDA_CACHE_URL} +else + gpuci_logger "Cache hit, using cached cuDF" + cd $(dirname ${CUDF_CONDA_BLD_DIR}) + tar xf ${CUDF_CONDA_TAR} + cd - +fi + +gpuci_logger "Installing cuDF" +mamba install -q -y -c local -c nvidia -c rapidsai -c conda-forge libcudf cudf + +gpuci_logger "Installing other dependencies" +mamba env update -q -n morpheus -f ${MORPHEUS_ROOT}/docker/conda/environments/cuda${CUDA_VER}_dev.yml + +gpuci_logger "Check cmake & ninja" +cmake --version +ninja --version + +gpuci_logger "Configuring cmake for Morpheus" +cmake -B build -G Ninja \ + -DCMAKE_MESSAGE_CONTEXT_SHOW=ON \ + -DMORPHEUS_BUILD_BENCHMARKS=ON \ + -DMORPHEUS_BUILD_EXAMPLES=ON \ + -DMORPHEUS_BUILD_TESTS=ON \ + -DMORPHEUS_USE_CONDA=ON \ + -DMORPHEUS_PYTHON_INPLACE_BUILD=ON \ + -DMORPHEUS_USE_CCACHE=OFF \ + -DCMAKE_C_COMPILER_LAUNCHER=sccache \ + -DCMAKE_CXX_COMPILER_LAUNCHER=sccache \ + -DCMAKE_CUDA_COMPILER_LAUNCHER=sccache \ + . + +gpuci_logger "Building Morpheus" +cmake --build build -j --parallel ${PARALLEL_LEVEL} + +gpuci_logger "sccache usage for morpheus build:" +sccache --show-stats + +gpuci_logger "Installing Morpheus" +pip install -e ${MORPHEUS_ROOT} + +gpuci_logger "Archiving results" +mamba pack --quiet --force --ignore-editable-packages --ignore-missing-files --n-threads ${PARALLEL_LEVEL} -n morpheus -o ${WORKSPACE_TMP}/conda_env.tar.gz +tar cfj ${WORKSPACE_TMP}/workspace.tar.bz --exclude=".git" --exclude="models" --exclude=".cache" ./ +ls -lh ${WORKSPACE_TMP}/ + +gpuci_logger "Pushing results to ${DISPLAY_ARTIFACT_URL}" +aws s3 cp --no-progress "${WORKSPACE_TMP}/conda_env.tar.gz" "${ARTIFACT_URL}/conda_env.tar.gz" +aws s3 cp --no-progress "${WORKSPACE_TMP}/workspace.tar.bz" "${ARTIFACT_URL}/workspace.tar.bz" + +gpuci_logger "Success" +exit 0 diff --git a/ci/scripts/jenkins/checks.sh b/ci/scripts/jenkins/checks.sh new file mode 100755 index 0000000000..5d8acb5cc2 --- /dev/null +++ b/ci/scripts/jenkins/checks.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# SPDX-FileCopyrightText: Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e + +source ${WORKSPACE}/ci/scripts/jenkins/common.sh + +conda activate rapids + +gpuci_logger "Installing CI dependencies" +mamba install -q -y -c conda-forge "yapf=0.32" + +gpuci_logger "Runing Python style checks" +${MORPHEUS_ROOT}/ci/scripts/python_checks.sh + +gpuci_logger "Checking copyright headers" +python ${MORPHEUS_ROOT}/ci/scripts/copyright.py --verify-apache-v2 --git-diff-commits ${CHANGE_TARGET} ${GIT_COMMIT} diff --git a/ci/scripts/jenkins/common.sh b/ci/scripts/jenkins/common.sh new file mode 100644 index 0000000000..bc943c121a --- /dev/null +++ b/ci/scripts/jenkins/common.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# SPDX-FileCopyrightText: Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +gpuci_logger "Env Setup" +source /opt/conda/etc/profile.d/conda.sh +export MORPHEUS_ROOT=${MORPHEUS_ROOT:-$(git rev-parse --show-toplevel)} +gpuci_logger "Procs: $(nproc)" +gpuci_logger "Memory" + +/usr/bin/free -g + +gpuci_logger "user info" +id + +# Change target is the branch name we are merging into but due to the weird way jenkins does +# the checkout it isn't recognized by git without the origin/ prefix +export CHANGE_TARGET="origin/${CHANGE_TARGET}" + +# S3 vars +export S3_URL="s3://rapids-downloads/ci/morpheus" +export DISPLAY_URL="https://downloads.rapids.ai/ci/morpheus" +export ARTIFACT_URL="${S3_URL}/pull-request/${CHANGE_ID}/${GIT_COMMIT}/${NVARCH}" +export DISPLAY_ARTIFACT_URL="${DISPLAY_URL}/pull-request/${CHANGE_ID}/${GIT_COMMIT}/${NVARCH}/" + +# Set sccache env vars +export SCCACHE_S3_KEY_PREFIX=morpheus-${NVARCH} +export SCCACHE_BUCKET=rapids-sccache +export SCCACHE_REGION=us-west-2 +export SCCACHE_IDLE_TIMEOUT=32768 +#export SCCACHE_LOG=debug + +gpuci_logger "Environ:" +env | sort diff --git a/ci/scripts/jenkins/docs.sh b/ci/scripts/jenkins/docs.sh new file mode 100755 index 0000000000..95a059f451 --- /dev/null +++ b/ci/scripts/jenkins/docs.sh @@ -0,0 +1,53 @@ +#!/bin/bash +# SPDX-FileCopyrightText: Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e + +source ${WORKSPACE}/ci/scripts/jenkins/common.sh + +gpuci_logger "Downloading build artifacts from ${DISPLAY_ARTIFACT_URL}" +aws s3 cp --no-progress "${ARTIFACT_URL}/conda_env.tar.gz" "${WORKSPACE_TMP}/conda_env.tar.gz" +aws s3 cp --no-progress "${ARTIFACT_URL}/workspace.tar.bz" "${WORKSPACE_TMP}/workspace.tar.bz" + +gpuci_logger "Extracting" +mkdir -p /opt/conda/envs/morpheus +tar xf "${WORKSPACE_TMP}/conda_env.tar.gz" --no-same-owner --directory /opt/conda/envs/morpheus +tar xf "${WORKSPACE_TMP}/workspace.tar.bz" --no-same-owner + +gpuci_logger "Setting test env" +conda activate morpheus +conda-unpack + +# Work-around for issue where libmorpheus_utils.so is not found by libmorpheus.so +export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${MORPHEUS_ROOT}/morpheus/_lib + +pip install -e ${MORPHEUS_ROOT} + +cd ${MORPHEUS_ROOT}/docs +gpuci_logger "Installing Documentation dependencies" +pip install -r requirement.txt + +gpuci_logger "Building docs" +make html + +gpuci_logger "Tarring the docs" +tar cfj "${WORKSPACE_TMP}/docs.tar.bz" build/html + +gpuci_logger "Pushing results to ${DISPLAY_ARTIFACT_URL}" +aws s3 cp --no-progress "${WORKSPACE_TMP}/docs.tar.bz" "${ARTIFACT_URL}/docs.tar.bz" + +gpuci_logger "Success" +exit 0 diff --git a/ci/scripts/jenkins/test.sh b/ci/scripts/jenkins/test.sh new file mode 100755 index 0000000000..93ae07bf6c --- /dev/null +++ b/ci/scripts/jenkins/test.sh @@ -0,0 +1,77 @@ +#!/bin/bash +# SPDX-FileCopyrightText: Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e + +source ${WORKSPACE}/ci/scripts/jenkins/common.sh +/usr/bin/nvidia-smi + +gpuci_logger "Check versions" +python3 --version +gcc --version +g++ --version + +gpuci_logger "Check conda environment" +conda info +conda config --show-sources +conda list --show-channel-urls + +gpuci_logger "Downloading build artifacts from ${DISPLAY_ARTIFACT_URL}" +aws s3 cp --no-progress "${ARTIFACT_URL}/conda_env.tar.gz" "${WORKSPACE_TMP}/conda_env.tar.gz" +aws s3 cp --no-progress "${ARTIFACT_URL}/workspace.tar.bz" "${WORKSPACE_TMP}/workspace.tar.bz" + +gpuci_logger "Extracting" +mkdir -p /opt/conda/envs/morpheus +tar xf "${WORKSPACE_TMP}/conda_env.tar.gz" --no-same-owner --directory /opt/conda/envs/morpheus +tar xf "${WORKSPACE_TMP}/workspace.tar.bz" --no-same-owner + +gpuci_logger "Setting test env" +conda activate morpheus +conda-unpack +conda list --show-channel-urls + +npm install --slient -g camouflage-server +mamba install -q -y -c conda-forge "git-lfs=3.1.4" + +gpuci_logger "Pulling LFS assets" +cd ${MORPHEUS_ROOT} +git lfs install +git lfs pull + +pip install -e ${MORPHEUS_ROOT} + +# Work-around for issue where libmorpheus_utils.so is not found by libmorpheus.so +# The build and test nodes have different workspace paths (/jenkins vs. /var/lib/jenkins) +# Typically these are fixed by conda-unpack but since we did an in-place build we will +# have to fix this ourselves by setting LD_LIBRARY_PATH +export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${MORPHEUS_ROOT}/morpheus/_lib + +gpuci_logger "Running tests" +set +e +pytest --run_slow \ + --junit-xml=${WORKSPACE_TMP}/report_pytest.xml \ + --cov=morpheus \ + --cov-report term-missing \ + --cov-report=xml:${WORKSPACE_TMP}/report_pytest_coverage.xml + +PYTEST_RESULTS=$? +set -e + +gpuci_logger "Pushing results to ${DISPLAY_ARTIFACT_URL}" +aws s3 cp ${WORKSPACE_TMP}/report_pytest.xml "${ARTIFACT_URL}/report_pytest.xml" +aws s3 cp ${WORKSPACE_TMP}/report_pytest_coverage.xml "${ARTIFACT_URL}/report_pytest_coverage.xml" + +exit ${PYTEST_RESULTS} diff --git a/docker/conda/environments/cuda11.4_ci.yml b/docker/conda/environments/cuda11.4_ci.yml new file mode 100644 index 0000000000..2700ab0cb8 --- /dev/null +++ b/docker/conda/environments/cuda11.4_ci.yml @@ -0,0 +1,23 @@ +# SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Morpheus dependencies only needed during a CI build +name: morpheus +channels: + - conda-forge +dependencies: + - conda-pack=0.7 + - pkg-config=0.29 + - sccache=0.3 diff --git a/docker/conda/environments/requirements.txt b/docker/conda/environments/requirements.txt index 9e5f490f1c..0654517c23 100644 --- a/docker/conda/environments/requirements.txt +++ b/docker/conda/environments/requirements.txt @@ -11,6 +11,7 @@ git+https://github.com/efajardo-nv/dfencoder.git@nv-updates#egg=dfencoder grpcio-channelz networkx nvidia-pyindex +pybind11-stubgen==0.10.5 torch==1.10.2+cu113 tqdm tritonclient[all] From 23fe46a6c324fbe5323894bfd65159ff5aee6e69 Mon Sep 17 00:00:00 2001 From: Michael Demoret <42954918+mdemoret-nv@users.noreply.github.com> Date: Mon, 23 May 2022 14:21:06 -0600 Subject: [PATCH 26/73] Updating CODEOWNERS for New Organization (#118) Updating the CODEOWNERS for the new Github organization and expanding the engineering directories to include more subfolders. Authors: - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - Bartley Richardson (https://github.com/BartleyR) URL: https://github.com/nv-morpheus/Morpheus/pull/118 --- .github/CODEOWNERS | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 2a94042b9b..2a6cb21c1f 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,10 +1,15 @@ # Default Approval rule if one of the later sections does not apply -* @BartleyR @mdemoret-nv @pdmack @raykallen +* @nv-morpheus/morpheus-codeowners -# Engineering is requried for changes to the following -/morpheus/ @BartleyR @mdemoret-nv @pdmack @bsuryadevara @dagardner-nv @drobison00 @efajardo-nv @cwharris -/cmake/ @BartleyR @mdemoret-nv @pdmack @bsuryadevara @dagardner-nv @drobison00 @efajardo-nv @cwharris -/tests/ @BartleyR @mdemoret-nv @pdmack @bsuryadevara @dagardner-nv @drobison00 @efajardo-nv @cwharris +# Engineering is requried for changes to the following: +/ci/ @nv-morpheus/morpheus-codeowners-eng +/cmake/ @nv-morpheus/morpheus-codeowners-eng +/docker/ @nv-morpheus/morpheus-codeowners-eng +/docs/ @nv-morpheus/morpheus-codeowners-eng +/examples/ @nv-morpheus/morpheus-codeowners-eng +/morpheus/ @nv-morpheus/morpheus-codeowners-eng +/scripts/ @nv-morpheus/morpheus-codeowners-eng +/tests/ @nv-morpheus/morpheus-codeowners-eng # Data Science is requried for changes to `models` -/models/ @BartleyR @mdemoret-nv @pdmack @bsuryadevara @raykallen @gbatmaz @tzemicheal +/models/ @nv-morpheus/morpheus-codeowners-ds From d46382bb75dfbad0fceb3226e367067333327e43 Mon Sep 17 00:00:00 2001 From: Jeffrey James Date: Mon, 23 May 2022 18:38:24 -0400 Subject: [PATCH 27/73] Updates to developer_guide for clarity. (#96) Closes #95 Authors: - Jeffrey James (https://github.com/lobotmcj) - David Gardner (https://github.com/dagardner-nv) - Pete MacKinnon (https://github.com/pdmack) Approvers: - Pete MacKinnon (https://github.com/pdmack) - David Gardner (https://github.com/dagardner-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/96 --- docs/source/developer_guide/architecture.md | 4 +- .../guides/1_simple_python_stage.md | 32 +++-- .../guides/2_real_world_phishing.md | 117 ++++++++++-------- .../guides/3_simple_cpp_stage.md | 51 ++++---- .../guides/4_source_cpp_stage.md | 28 ++--- 5 files changed, 129 insertions(+), 103 deletions(-) diff --git a/docs/source/developer_guide/architecture.md b/docs/source/developer_guide/architecture.md index 1abe0efd92..60ac0ac337 100644 --- a/docs/source/developer_guide/architecture.md +++ b/docs/source/developer_guide/architecture.md @@ -40,7 +40,7 @@ The organization of Morpheus can be broken down into four different layers. Work ## Pipeline Details Pipelines are a collection of one or more stages that are connected via edges. Data flows from one stage to the next across these edges using buffers. We utilize these buffers to allow stages to process messages at different rates. Once each stage is done processing a message, the pipeline will move it onto the next stage's buffer for processing. This process continues until the message has made it through the entire pipeline. -The main goal of the pipeline is to maximize throughput via parallel execution of the stages. So we can utilize hardware optimally and avoid processing individual messages sequentially. Given a multi-stage pipeline consisting of stages 1 and 2. Stage 1 collects its first message from its data source and begins processing it once Stage 1 is done with its first message, the resulting output message will be forwarded to Stage 2. At this point, Stage 1 immediately begins processing the next input to the pipeline, while Stage 2 begins work on the output of Stage 1. This allows for multiple messages to be in flight in the pipeline at a time, increasing parallelization. +The main goal of the pipeline is to maximize throughput via parallel execution of the stages. So we can utilize hardware optimally and avoid processing individual messages sequentially. Given a multi-stage pipeline consisting of stages 1 and 2. Stage 1 collects its first message from its data source and begins processing it. Once Stage 1 is done with its first message, the resulting output message will be forwarded to Stage 2. At this point, Stage 1 immediately begins processing the next input to the pipeline, while Stage 2 begins work on the output of Stage 1. This allows for multiple messages to be in flight in the pipeline at a time, increasing parallelization. Utilizing buffers between stages in this way does come at a cost. Increasing the size of the buffers helps improve parallelization by ensuring all stages have some work to do. But this also increases latency since messages can sit in a buffer waiting to be processed. The inverse is also true. Decreasing the buffer sizes improves latency, but can starve some stages of work to do, decreasing parallelization. The pipeline has to walk a fine line of keeping all stages supplied with data with the smallest buffers possible. @@ -55,7 +55,7 @@ The stage identifier is a unique string used in both logging and creating the st ### Type Inference To perform work, each stage needs to know what type of data it will be operating on. Since Morpheus can pass any type of data from stage to stage, the pipeline must ensure compatible types at every edge connection between stages. This process is called stage type inference and is performed during the pipeline build phase. -Stage type inference is necessary because the output type of some stages may depend on the output type of the previous stage. For example, consider a simple pass through stage that passes the input message to the next stage unmodified. If our pass through stage is connected to another stage generating a string, its output type will be a string. Instead, if it's connected to another stage generating an integer, its output type will be an integer. +Stage type inference is necessary because the output type of some stages may depend on the output type of the previous stage. For example, consider a simple pass through stage that passes the input message to the next stage unmodified. If our pass through stage is preceded by a stage generating a string, its output type will be a string. Instead, if it's preceded by a stage generating an integer, its output type will be an integer. Due to the dynamic nature of the output type of a stage, stages must specify a type inference function that accepts an input type and returns the output type. Starting at the source stages, the pipeline will use this function to determine the output type of the source stages. This result will then be passed to the type inference function of the next stage, and so on until the input and output types of every stage in the pipeline have been determined. diff --git a/docs/source/developer_guide/guides/1_simple_python_stage.md b/docs/source/developer_guide/guides/1_simple_python_stage.md index 247b003450..9ec7d4198a 100644 --- a/docs/source/developer_guide/guides/1_simple_python_stage.md +++ b/docs/source/developer_guide/guides/1_simple_python_stage.md @@ -19,7 +19,7 @@ limitations under the License. ## Background -Morpheus makes use of the Neo graph-execution framework. Morpheus pipelines are built on top of Neo pipelines. Pipelines in Neo are made up of segments; however, in many common cases, a Neo pipeline will consist of only a single segment. Our Morpheus stages will interact with the Neo segment to build nodes and add them to the Neo graph. In the common case, a Morpheus stage will add a single node to the graph, but in some cases will add multiple nodes to the graph. +Morpheus makes use of the Neo graph-execution framework. Morpheus pipelines are built on top of Neo pipelines. Pipelines in Neo are made up of segments; however, in many common cases, a Neo pipeline will consist of only a single segment. Our Morpheus stages will interact with the Neo segment to build nodes and add them to the Neo graph. In the common case, a Morpheus stage will add a single node to the graph, but in some cases it will add multiple nodes to the graph. ## The Pass Through Stage @@ -37,7 +37,7 @@ from morpheus.pipeline.pipeline import StreamPair class PassThruStage(SinglePortStage): ``` -There are three methods that need to be defined in our new subclass to implement the stage interface: `name`, `accepted_types`, and `_build_single`. In practice, it is often necessary to define at least one more method which will perform the actual work of the stage; by convention, this method is typically named on_data, which we will define in our examples. +There are three methods that need to be defined in our new subclass to implement the stage interface: `name`, `accepted_types`, and `_build_single`. In practice, it is often necessary to define at least one more method which will perform the actual work of the stage; by convention, this method is typically named `on_data`, which we will define in our examples. `name` is a property method; it should return a user-friendly name for the stage. Currently, this property is only used for debugging purposes, and there are no requirements on the content or format of the name. ```python @@ -46,7 +46,7 @@ There are three methods that need to be defined in our new subclass to implement return "pass-thru" ``` -The `accepted_types` method returns a tuple of message classes that this stage accepts as valid inputs. Morpheus uses this to validate that the parent of this stage emits a message that this stage can accept. Since our stage is a pass through, we will declare that we can accept any incoming message type; however, in practice, production stages will often declare a single Morpheus message class such as `MessageMeta` and `MultiMessage` (see the message classes defined in `morpheus.pipeline.messages` for a complete list). +The `accepted_types` method returns a tuple of message classes that this stage accepts as valid inputs. Morpheus uses this to validate that the parent of this stage emits a message that this stage can accept. Since our stage is a pass through, we will declare that we can accept any incoming message type. Note that production stages will often declare only a single Morpheus message class such as `MessageMeta` or `MultiMessage` (see the message classes defined in `morpheus.pipeline.messages` for a complete list). ```python def accepted_types(self) -> typing.Tuple: return (typing.Any,) @@ -59,9 +59,14 @@ Our `on_data` method accepts the incoming message and returns a message. The ret return message ``` -Finally, the `_build_single` method will be used at build time to wire our stage into the pipeline. `_build_single` receives an instance of the Neo pipeline segment along with a `StreamPair` instance. We will be using the segment instance to build a node from our stage and add it to the pipeline segment. The `StreamPair` argument is a tuple, the first element is our parent node, and the second is our parent node's output type. The return type of this method is also a `StreamPair`; typically, we will be returning our newly constructed node along with our output type. +Finally, the `_build_single` method will be used at build time to wire our stage into the pipeline. `_build_single` receives an instance of the Neo pipeline segment along with a `StreamPair` instance. We will be using the segment instance to build a node from our stage and add it to the pipeline segment. The `StreamPair` argument is a tuple; the first element is our parent node, and the second is our parent node's output type. The return type of this method is also a `StreamPair`. Typically, we will be returning our newly constructed node along with our output type. +```python + def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + node = seg.make_node(self.unique_name, self.on_data) + seg.make_edge(input_stream[0], node) +``` -In most cases, a Morpheus stage will define and build a single Neo node. In some advanced cases, a stage can construct more than one node. For our purposes, a Morpheus stage defines information about the type of node(s) it builds, while the node is the instance wired into the Neo pipeline. To build the node, we will call the `make_node` method of the segment instance, passing to it our name and our `on_data` method. We used the `unique_name` property, which will take the name property which we already defined and append a unique id to it. +In most cases, a Morpheus stage will define and build a single Neo node. In some advanced cases, a stage can construct more than one node. For our purposes, a Morpheus _stage_ defines information about the type of node(s) it builds, while the _node_ is the instance of the stage that is wired into the Neo pipeline. To build the node, we will call the `make_node` method of the segment instance, passing to it our name and our `on_data` method. We used the `unique_name` property, which will take the name property which we already defined and append a unique id to it. ```python node = seg.make_node(self.unique_name, self.on_data) ``` @@ -105,9 +110,12 @@ class PassThruStage(SinglePortStage): ``` ## Testing our new Stage -To start testing our new pass through stage, we are going to construct a simple pipeline and add our new stage to it. This pipeline will do the minimum work necessary to verify our pass through stage: define a source stage, which will produce data and inject it into the pipeline; this data will be read and processed by our pass through stage, and then forwarded on to a monitoring stage which will record the messages it receives and terminate the pipeline. +To start testing our new pass through stage, we are going to construct a simple pipeline and add our new stage to it. This pipeline will do the minimum work necessary to verify our pass through stage. Data will flow through our simple pipeline as follows: +1. A source stage will produce data and inject it into the pipeline. +1. This data will be read and processed by our pass through stage, in this case simply forwarding on the data. +1. A monitoring stage will record the messages from our pass through stage and terminate the pipeline. -Imports are needed for this example. This assumes we saved the code for the PassThruStage in a file named "pass_thru.py" in the same directory as this script which we will name "run_passthru.py". +First we will need to import a few things from Morpheus for this example to work. Note that this test script, which we will name "run_passthru.py", assumes that we saved the code for the PassThruStage in a file named "pass_thru.py" in the same directory. ```python import logging import os @@ -126,17 +134,17 @@ Before constructing the pipeline, we need to do a bit of environment configurati configure_logging(log_level=logging.DEBUG) ``` -Next, we will build a Morpheus config object. In the next example, we will cover setting some common configuration parameters. For now, it is important to know that we will always need to build a config object. +Next, we will build a Morpheus `Config` object. We will cover setting some common configuration parameters in the next guide. For now, it is important to know that we will always need to build a `Config` object: ```python config = Config() ``` -For our test, we will use the `FileSourceStage` to read in a large file containing lines of JSON corresponding to email messages and package them as Morpheus message objects for our pass through stage to consume. +In this example, we will use the `FileSourceStage` class to read a large file in which each line is a JSON object that represents an email message. The stage will take these lines and package them as Morpheus message objects for our pass through stage to consume. Let's setup our source stage: ```python pipeline.set_source(FileSourceStage(config, filename=input_file, iterative=False)) ``` -Next, we will add our new stage to the pipeline and then add a MonitorStage which will measure the throughput of our pass through stage. +Next, we will add our new stage to the pipeline as well as a `MonitorStage` which will measure the throughput of our pass through stage: ```python pipeline.add_stage(PassThruStage(config)) @@ -168,7 +176,7 @@ Progress[Complete]: 25229messages [00:00, 57695.02messages/s] ``` ## Putting the Pipeline Together -Note this code assumes that the `MORPHEUS_ROOT` environment variable is set to the root of the Morpheus project repository: +Note that this code assumes the `MORPHEUS_ROOT` environment variable is set to the root of the Morpheus project repository: ```python import logging import os @@ -188,7 +196,7 @@ def run_pipeline(): root_dir = os.environ['MORPHEUS_ROOT'] input_file = os.path.join(root_dir, 'examples/data/email.jsonlines') - config = Config() + config = Config() # Create a linear pipeline object pipeline = LinearPipeline(config) diff --git a/docs/source/developer_guide/guides/2_real_world_phishing.md b/docs/source/developer_guide/guides/2_real_world_phishing.md index 777ea75f94..33efa69424 100644 --- a/docs/source/developer_guide/guides/2_real_world_phishing.md +++ b/docs/source/developer_guide/guides/2_real_world_phishing.md @@ -23,17 +23,20 @@ Now that we've seen a basic example of how to create a stage and use it in the c As part of this process, we might want to use a classification model trained on various pieces of metadata, such as recipient count, in addition to the raw content of each email. If we suppose this is true for our example, we need to build and connect a pre-processing stage to attach this information to each record before applying our classifier. -For this task, we'll need to define a new stage, which we will call our `RecipientFeaturesStage`, which will receive an input corresponding to an email, count the number of recipients in the email's metadata, and construct a Morpheus `MessageMeta` object that will contain the record content along with the augmented metadata. +For this task, we'll need to define a new stage, which we will call our `RecipientFeaturesStage`, that will: +1. Receive an input corresponding to an email. +1. Count the number of recipients in the email's metadata. +1. Construct a Morpheus `MessageMeta` object that will contain the record content along with the augmented metadata. -For this stage, the code will look very similar to the previous example with a few notable changes. We will be working with the `MessageMeta` class. This is a Morpheus message containing a [cuDF](https://docs.rapids.ai/api/cudf/stable/) [DataFrame](https://docs.rapids.ai/api/cudf/stable/api_docs/dataframe.html); since we will expect our new stage to operate on {py:obj}`~morpheus.pipeline.messages.MultiMessage` types our new accepted_types method now looks like: +For this stage, the code will look very similar to the previous example with a few notable changes. We will be working with the `MessageMeta` class. This is a Morpheus message containing a [cuDF](https://docs.rapids.ai/api/cudf/stable/) [DataFrame](https://docs.rapids.ai/api/cudf/stable/api_docs/dataframe.html). Since we will expect our new stage to operate on {py:obj}`~morpheus.pipeline.messages.MessageMeta` types, our new `accepted_types` method now looks like: ```python def accepted_types(self) -> typing.Tuple: return (MessageMeta,) ``` -Next, we will update our on_data method to perform the actual work. -We grab a reference to the incoming message's `df` attribute. It is important to note that this is a reference, and any changes made to this will be performed in place on the existing message instance. +Next, we will update our `on_data` method to perform the actual work. +We grab a reference to the incoming message's `df` attribute. It is important to note that `message` is a reference, and any changes made to it or its members (such as `df`) will be performed in place on the existing message instance. ```python def on_data(self, message: MessageMeta): @@ -56,7 +59,7 @@ def on_data(self, message: MessageMeta): return message ``` -If mutating the data frame is undesirable, we could make a call to the data frame's [copy](https://docs.rapids.ai/api/cudf/stable/api_docs/api/cudf.DataFrame.copy.html#cudf.DataFrame.copy) method, and return a new message, note that this would come at the cost of performance and increased memory. Our updated `on_data` method would look like this (changing the first & last lines of the method): +If mutating the data frame is undesirable, we could make a call to the data frame's [copy](https://docs.rapids.ai/api/cudf/stable/api_docs/api/cudf.DataFrame.copy.html#cudf.DataFrame.copy) method and return a new `MessageMeta`. Note however that this would come at the cost of performance and increased memory usage. Our updated `on_data` method would look like this (changing the first and last lines of the method): ```python def on_data(self, message: MessageMeta): @@ -70,7 +73,7 @@ def on_data(self, message: MessageMeta): Our `_build_single` method remains unchanged; even though we are modifying the incoming messages, our input and output types remain the same. -## The Completed Preprocessing Stage +### The Completed Preprocessing Stage ```python import typing @@ -116,11 +119,10 @@ class RecipientFeaturesStage(SinglePortStage): return node, input_stream[1] ``` -## Testing our new Stage +### Testing the Preprocessing Stage -To ensure our new stage is working, we will use the pipeline from the previous example and insert our new stage where the pass through stage was previously, between the `FileSource` and `MonitorStage` stages. - -Update these lines: +To test our new stage, we will modify the pipeline from the previous guide by replacing the pass through stage with our new one. +To do this, just update these lines from the previous guide: ```python # Add our own stage @@ -133,55 +135,54 @@ pipeline.add_stage(MonitorStage(config)) To: ```python -# Add our own stages -pipeline.add_stage(PassThruStage(config)) +# Add our own stage pipeline.add_stage(RecipientFeaturesStage(config)) # Add monitor to record the performance of our new stage pipeline.add_stage(MonitorStage(config)) ``` -## Predicting Fraudulent Emails with Accelerated Machine Learning. +## Predicting Fraudulent Emails with Accelerated Machine Learning -For this example, we'll be using the `RecipientFeaturesStage` from the previous example in a real-world pipeline to detect fraudulent emails. The pipeline we will be building makes use of the `TritonInferenceStage` which is a pre-defined Morpheus stage designed to support the execution of Natural Language Processing (NLP) models via NVIDIA's [Triton inference server framework](https://developer.nvidia.com/nvidia-triton-inference-server), which allows for GPU accelerated ML/DL and seamless co-location and execution of a wide variety of model frameworks. For our application, we will be using the `phishing-bert-onnx` model, which is included with Morpheus in the `models/triton-model-repo/` directory. +Now we'll use the `RecipientFeaturesStage` that we just made in a real-world pipeline to detect fraudulent emails. The pipeline we will be building makes use of the `TritonInferenceStage` which is a pre-defined Morpheus stage designed to support the execution of Natural Language Processing (NLP) models via NVIDIA's [Triton Inference Server framework](https://developer.nvidia.com/nvidia-triton-inference-server). NVIDIA Triton Inference Server allows for GPU accelerated ML/DL and seamless co-location and execution of a wide variety of model frameworks. For our application, we will be using the `phishing-bert-onnx` model, which is included with Morpheus in the `models/triton-model-repo/` directory. -The important thing to note is that the Triton server lives outside of the execution of the Morpheus pipeline and cannot be running on the same machine(s) that the pipeline is executing on. Instead, Triton is a service that we are communicating with via HTTP & [gRPC](https://grpc.io/) network protocols to interact with machine learning models hosted by Triton. +It's important to note here that Triton is a service that is external to the Morpheus pipeline and often will not reside on the same machine(s) as the rest of the pipeline. The `TritonInferenceStage` will use HTTP and [gRPC](https://grpc.io/) network protocols to allow us to interact with the machine learning models that are hosted by the Triton server. -## Launching Triton +### Launching Triton Triton will need to be running while we execute our pipeline. For simplicity, we will launch it locally inside of a Docker container. -Note: This step assumes you have both [Docker](https://docs.docker.com/engine/install/) and the [Nvidia container toolkit](https://docs.docker.com/engine/install/) installed. +Note: This step assumes you have both [Docker](https://docs.docker.com/engine/install/) and the [Nvidia container toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#installation-guide) installed. -From the root of the Morpheus project we will launch a Triton Docker container mounting the models directory in the container. +From the root of the Morpheus project we will launch a Triton Docker container with the `models` directory mounted into the container: ```shell docker run --rm -ti --gpus=all -p8000:8000 -p8001:8001 -p8002:8002 -v $PWD/models:/models nvcr.io/nvidia/tritonserver:22.02-py3 tritonserver --model-repository=/models/triton-model-repo --exit-on-error=false --log-info=true ``` -Once we have Triton running, we can verify that it is healthy using [curl](https://curl.se/); the `/v2/health/live` endpoint should return a 200 status code: +Once we have Triton running, we can verify that it is healthy using [curl](https://curl.se/). The `/v2/health/live` endpoint should return a 200 status code: ```shell curl -v "localhost:8000/v2/health/live" ``` -We can also query Triton for available models: +We can also query Triton for the available models: ```shell curl -X POST "localhost:8000/v2/repository/index" ``` -Along information about the `phishing-bert-onnx` model which we are going to be using: +Let's ask Triton for some information about the `phishing-bert-onnx` model which we are going to be using: ```shell curl "localhost:8000/v2/models/phishing-bert-onnx/config" {"name":"phishing-bert-onnx","versions":["1"],"platform":"onnxruntime_onnx","inputs":[{"name":"input_ids","datatype":"INT64","shape":[-1,128]},{"name":"attention_mask","datatype":"INT64","shape":[-1,128]}],"outputs":[{"name":"output","datatype":"FP32","shape":[-1,2]}]} ``` -Here is the expected length of the model inputs indicated by `"shape":[-1,128]}`. +From this information, we can see that the expected shape of the model inputs is `"shape":[-1,128]}`. -## Defining our Pipeline -Set up our file paths for our input and output files. For simplicity, we assume that the `MORPHEUS_ROOT` environment variable is set to the root of the Morpheus project repository. In a production deployment, it may be more prudent to replace our usage of environment variables with command-line flags. +### Defining our Pipeline +Let's set up the paths for our input and output files. For simplicity, we assume that the `MORPHEUS_ROOT` environment variable is set to the root of the Morpheus project repository. In a production deployment, it may be more prudent to replace our usage of environment variables with command-line flags or a dedicated configuration management library. ```python root_dir = os.environ['MORPHEUS_ROOT'] @@ -195,11 +196,12 @@ input_file = os.path.join(root_dir, 'examples/data/email.jsonlines') results_file = os.path.join(out_dir, 'detections.jsonlines') ``` -To start, we will need to set a few parameters on the config object, these are parameters which are global to the pipeline as a whole, while individual stages receive their own parameters.. +To start, we will need to instantiate and set a few members of the `Config` class. This object is used for configuration options that are global to the pipeline as a whole. We will provide this object to each stage along with stage-specific configuration parameters. ```python config = Config() config.mode = PipelineModes.NLP + config.num_threads = psutil.cpu_count() config.feature_length = 128 @@ -207,13 +209,17 @@ with open(labels_file) as fh: config.class_labels = [x.strip() for x in fh] ``` -We set our pipeline mode to NLP. Next, we use the third-party [psutils](https://psutil.readthedocs.io/en/stable/) library to set the `num_threads` property to match the number of cores in our system. +First we set our pipeline mode to NLP. Next, we use the third-party [psutils](https://psutil.readthedocs.io/en/stable/) library to set the `num_threads` property to match the number of cores in our system. -The `feature_length` property needs to match the length of the model inputs, which we queried from the model's config endpoint in the previous section. +The `feature_length` property needs to match the length of the model inputs, which we got from Triton in the previous section using the model's `/config` endpoint. Ground truth classification labels are read from the `data/labels_phishing.txt` file included in Morpheus. -Now that our config object is populated we move on to the pipeline itself. We are using the same input file from the previous examples, and to tokenize the input data we add Morpheus' `PreprocessNLPStage` with the `data/bert-base-uncased-hash.txt` vocabulary file. +Now that our config object is populated, we move on to the pipeline itself. We will be using the same input file from the previous examples, and to tokenize the input data we will use Morpheus' `PreprocessNLPStage`. + +This stage uses the [cudf subword tokenizer](https://docs.rapids.ai/api/cudf/stable/api_docs/api/cudf.core.subword_tokenizer.SubwordTokenizer.__call__.html) to transform strings into a tensor of numbers to be fed into the neural network model. Rather than split the string by characters or whitespaces, we split them into meaningful subwords based upon the occurrence of the subwords in a large training corpus. You can find more details here: [https://arxiv.org/abs/1810.04805v2](https://arxiv.org/abs/1810.04805v2). All we need to know for now is that the text will be converted to subword token ids based on the vocabulary file that we provide (`vocab_hash_file=vocab file`). + +Let's go ahead and instantiate our `PreprocessNLPStage` and add it to the pipeline: ```python pipeline.add_stage( @@ -225,13 +231,19 @@ pipeline.add_stage( add_special_tokens=False)) ``` -This stage uses the [cudf subword tokenizer](https://docs.rapids.ai/api/cudf/stable/api_docs/api/cudf.core.subword_tokenizer.SubwordTokenizer.__call__.html) to transform strings into a tensor of numbers to be fed into the neural network model. Rather than split the string by characters or whitespaces, we split them into meaningful subwords based upon the occurrence of the subwords in a large training corpus. You can find more details here: [https://arxiv.org/abs/1810.04805v2](https://arxiv.org/abs/1810.04805v2). Briefly, the text is converted to subword token ids based on the vocabulary file from a pretrained tokenizer. This stage contains the parameters to truncate the length of the text to a max number of tokens (`truncation=True`), change the casing to all lowercase (`do_lower_case=True`), and the choice to add the default BERT special tokens like `[SEP]` for separation between two sentences and `[CLS]` at the start of the text (not used here but enabled with: `add_special_tokens=True`). The tokenizer parameters and vocabulary hash file should exactly match what was used for tokenization during the training of the NLP model. +In addition to providing the `Config` object that we defined above, we also configure this stage to: +* Use the `data/bert-base-uncased-hash.txt` vocabulary file for its subword token ids (`vocab_hash_file=vocab_file`). +* Truncate the length of the text to a max number of tokens (`truncation=True`). +* Change the casing to all lowercase (`do_lower_case=True`). +* Refrain from adding the default BERT special tokens like `[SEP]` for separation between two sentences and `[CLS]` at the start of the text (`add_special_tokens=False`). -At this point, we have a pipeline that reads in a set of records and preprocesses them with the required metadata for our classifier to predict on. Our next step is to define a stage that applies a machine learning model to our `MessageMeta` object. To accomplish this, we will be using Morpheus' `TritonInferenceStage` class which will communicate with the `phishing-bert-onnx` model, which we already loaded into Triton. +Note that the tokenizer parameters and vocabulary hash file should exactly match what was used for tokenization during the training of the NLP model. -Next, we will add a monitor stage to measure the inference rate, and a filter stage to filter out any results below a probability threshold of `0.9`. +At this point, we have a pipeline that reads in a set of records and preprocesses them with the metadata required for our classifier to make predictions. Our next step is to define a stage that applies a machine learning model to our `MessageMeta` object. To accomplish this, we will be using Morpheus' `TritonInferenceStage` class. This class will handle communication with the `phishing-bert-onnx` model, which we provided to the Triton Docker container via the `models` directory mount. + +Next we will add a monitor stage to measure the inference rate as well as a filter stage to filter out any results below a probability threshold of `0.9`. ```python -# Add a inference stage +# Add an inference stage pipeline.add_stage( TritonInferenceStage( config, @@ -246,7 +258,11 @@ pipeline.add_stage(MonitorStage(config, description="Inference Rate", smoothing= pipeline.add_stage(FilterDetectionsStage(config, threshold=0.9)) ``` -Lastly, we will save our results to disk. For this purpose, we are using two stages often used in conjunction with each other, the `SerializeStage` and the `WriteToFileStage`. `SerializeStage` is used to include and exclude columns desired in the output in addition to this converting from the `MultiMessage` class used by the previous stages to the `MessageMeta` class expected by the `WriteToFileStage`. The `WriteToFileStage` will append message data of the output file as messages are received; however, for performance, the `WriteToFileStage` does not flush contents out to disk for each message received, allowing the underlying [buffered output stream to flush as needed](https://gcc.gnu.org/onlinedocs/libstdc++/manual/streambufs.html), and closing the file handle on shutdown. +Lastly, we will save our results to disk. For this purpose, we are using two stages that are often used in conjunction with each other: `SerializeStage` and `WriteToFileStage`. + +The `SerializeStage` is used to include and exclude columns as desired in the output. Importantly, it also handles conversion from the `MultiMessage`-derived output type that is used by the `FilterDetectionsStage` to the `MessageMeta` class that is expected as input by the `WriteToFileStage`. + +The `WriteToFileStage` will append message data to the output file as messages are received. Note however that for performance reasons the `WriteToFileStage` does not flush its contents out to disk every time a message is received. Instead, it relies on the underlying [buffered output stream](https://gcc.gnu.org/onlinedocs/libstdc++/manual/streambufs.html) to flush as needed, and then will close the file handle on shutdown. ```python # Write the file to the output @@ -261,7 +277,7 @@ To explicitly set the output format we could specify the `file_type` argument to * `FileTypes.JSON` * `FileTypes.CSV` -## The Completed Pipeline +### The Completed Pipeline ```python import logging @@ -299,8 +315,7 @@ def run_pipeline(): input_file = os.path.join(root_dir, 'examples/data/email.jsonlines') results_file = os.path.join(out_dir, 'detections.jsonlines') - - # Its necessary to configure the pipeline for NLP mode + # It's necessary to configure the pipeline for NLP mode config = Config() config.mode = PipelineModes.NLP @@ -358,11 +373,13 @@ if __name__ == "__main__": run_pipeline() ``` -## Stage constructors +## Stage Constructors + +In our previous examples, we didn't define a constructor for the Python classes that we were building for our stages. However, there are many cases where we will need to receive configuration parameters. Every stage constructor must receive an instance of a `morpheus.config.Config` object as its first argument and is then free to define additional stage-specific arguments after that. The Morpheus config object will contain configuration parameters needed by multiple stages in the pipeline, and the constructor in each Morpheus stage is free to inspect these. In contrast, parameters specific to a single stage are typically defined as constructor arguments. -In our previous examples, we didn't define a constructor for the Python classes we were building for our stages. However, there are many cases where we will need to receive configuration parameters. Every stage constructor must receive an instance of a `morpheus.config.Config` object as its first argument and is then free to define additional stage-specific arguments after that. The Morpheus config object will contain configuration parameters needed by multiple stages in the pipeline, and the constructor in each Morpheus stage is free to inspect these. In contrast, parameters specific to a single stage are typically defined as constructor arguments. +Note that it is a best practice to perform any necessary validation checks in the constructor. This allows us to fail early rather than after the pipeline has started. -It is also important to perform necessary validation checks in the constructor, allowing us to fail early rather than after the pipeline has started. In our `RecipientFeaturesStage` example, we hard-coded the Bert separator token; we could refactor the code a bit to receive that as a constructor argument, we could also use that opportunity to verify that the pipeline mode is set to `morpheus.config.PipelineModes.NLP` our new refactored class definition now looks like: +In our `RecipientFeaturesStage` example, we hard-coded the Bert separator token. Let's instead refactor the code to receive that as a constructor argument. Let's also take the opportunity to verify that the pipeline mode is set to `morpheus.config.PipelineModes.NLP`. Our refactored class definition now looks like: ```python class RecipientFeaturesStage(SinglePortStage): @@ -379,13 +396,13 @@ class RecipientFeaturesStage(SinglePortStage): raise ValueError("sep_token cannot be an empty string") ``` -## Defining A New Source Stage +## Defining a New Source Stage Creating a new source stage is similar to defining any other stage with a few differences. First, we will be subclassing `SingleOutputSource`. Second, the required methods are just the `name` property method and the `_build_source` method. -In this example, we will create a source that reads messages from a [RabbitMQ](https://www.rabbitmq.com/) queue using the [pika](https://pika.readthedocs.io/en/stable/#) client for Python. For simplicity, we will assume that authentication is not required for our RabbitMQ exchange. The body of the RabbitMQ messages will be JSON formatted; however, both authentication and support for other formats could be easily added later. +In this example, we will create a source that reads messages from a [RabbitMQ](https://www.rabbitmq.com/) queue using the [pika](https://pika.readthedocs.io/en/stable/#) client for Python. For simplicity, we will assume that authentication is not required for our RabbitMQ exchange and that the body of the RabbitMQ messages will be JSON formatted. Both authentication and support for other formats could be easily added later. -The `_build_source` method is similar to the `_build_single` method. It receives an instance of the pipeline segment; however, unlike in the previous examples, source stages don't have parent stages. As such, `_build_source` doesn't receive a `StreamPair`; however, it does return a `StreamPair`. In this case, we will define a node method `source_generator`, rather than calling `make_node` in our previous examples for a source stage; we will instead call `make_source`. +The `_build_source` method is similar to the `_build_single` method; it receives an instance of the pipeline segment and returns a `StreamPair`. However, unlike in the previous examples, source stages do not have parent stages and therefore do not receive a `StreamPair` as input. We also will no longer build our node by calling `make_node`. Instead, we will call `make_source` with the parameter `self.source_generator`, which is a method that we will define next. ```python def _build_source(self, seg: neo.Segment) -> StreamPair: @@ -393,7 +410,7 @@ def _build_source(self, seg: neo.Segment) -> StreamPair: return node, MessageMeta ``` -The `source_generator` method is where most of the RabbitMQ specific code exists. Node methods receive an instance of `neo.Subscriber` as their first argument, when we have a message we wish to emit we call the `neo.Subscriber.on_next` method. +The `source_generator` method is where most of the RabbitMQ-specific code exists. Source node methods receive an instance of `neo.Subscriber` as their first argument. When we have a message that we wish to emit into the pipeline, we call the `neo.Subscriber.on_next` method. ```python def source_generator(self, subscriber: neo.Subscriber): @@ -417,11 +434,11 @@ def source_generator(self, subscriber: neo.Subscriber): self._connection.close() ``` -Note that when we read messages as quickly as we can from the queue; when the queue is empty, we call `time.sleep`, allowing for a context switch to occur if needed. +Note that we read messages as quickly as we can from the queue. When the queue is empty we call `time.sleep`, allowing for a context switch to occur if needed. -We only acknowledge the message by calling `basic_ack` once we have successfully emitted the message or failed to deserialize the message. If the pipeline shuts down after we have received a message but prior to us being able to call `on_next` . This means that we are avoiding the potential of a lost message at the risk of a potentially duplicate message if the pipeline is shut down after we have called `on_next` but before calling `basic_ack`. +Note also that we acknowledge the message (by calling `basic_ack`) only once we have successfully emitted the message (via `on_next`) or failed to deserialize the message. This means that if the pipeline shuts down while consuming the queue, we will not lose any messages. However, in that situation we may end up with a duplicate message (i.e., if the pipeline is shut down after we have called `on_next` but before calling `basic_ack`). -## The Completed Source Stage +### The Completed Source Stage ```python import logging @@ -518,11 +535,11 @@ class RabbitMQSourceStage(SingleOutputSource): self._connection.close() ``` -## Defining A New Sink Stage +## Defining a New Sink Stage -In Morpheus, we define sink stages as those stages output the results of a pipeline to a destination external to the pipeline. Morpheus includes two sink stages, a `WriteToFileStage` and a `WriteToKafkaStage`. +In Morpheus, we define a stage to be a sink if it outputs the results of a pipeline to a destination external to the pipeline. Morpheus currently provides two sink stages: `WriteToFileStage` and `WriteToKafkaStage`. -In the previous example, we wrote a `RabbitMQSourceStage`; we will complement that by writing a sink stage that can write Morpheus data into RabbitMQ. For this example, we are again using the [pika](https://pika.readthedocs.io/en/stable/#) client for Python. +Recall that in the previous section we wrote a `RabbitMQSourceStage`. We will now complement that by writing a sink stage that can output Morpheus data into RabbitMQ. For this example, we are again using the [pika](https://pika.readthedocs.io/en/stable/#) client for Python. The code for our sink will look similar to other stages with a few changes. First, we will subclass `SinglePortStage`: @@ -566,7 +583,7 @@ def on_complete(self): self._connection.close() ``` -## The Completed Sink Stage +### The Completed Sink Stage ```python import logging diff --git a/docs/source/developer_guide/guides/3_simple_cpp_stage.md b/docs/source/developer_guide/guides/3_simple_cpp_stage.md index 24e0b8eeca..42317089d4 100644 --- a/docs/source/developer_guide/guides/3_simple_cpp_stage.md +++ b/docs/source/developer_guide/guides/3_simple_cpp_stage.md @@ -17,20 +17,20 @@ limitations under the License. # 3. A Simple C++ Stage -Morpheus offers the choice of writing pipeline stages in either Python or C++. For many use cases, a Python stage can work out well but can become a bottleneck for the pipeline, at which point writing a C++ implementation for the stage becomes advantageous. The C++ implementations of Morpheus stages and messages utilize the [pybind11](https://pybind11.readthedocs.io/en/stable/index.html) library to provide Python bindings. +Morpheus offers the choice of writing pipeline stages in either Python or C++. For many use cases, a Python stage is perfectly fine. However, in the event that a Python stage becomes a bottleneck for the pipeline, then writing a C++ implementation for the stage becomes advantageous. The C++ implementations of Morpheus stages and messages utilize the [pybind11](https://pybind11.readthedocs.io/en/stable/index.html) library to provide Python bindings. -So far we have been defining our pipelines in Python. Most of the stages included with Morpheus have both a Python and C++ implementation, by default the C++ implementations will be used; use of C++ stage implementations can be explicitly disabled by configuring the `morpheus.config.CppConfig` singleton to `False` by calling `morpheus.config.CppConfig.set_should_use_cpp(False)`. +So far we have been defining our pipelines in Python. Most of the stages included with Morpheus have both a Python and a C++ implementation, and Morpheus will use the C++ implementations by default. You can explicitly disable the use of C++ stage implementations by calling `morpheus.config.CppConfig.set_should_use_cpp(False)`: ```python from morpheus.config import CppConfig -CppConfig.should_use_cpp = False +CppConfig.set_should_use_cpp(False) ``` -In the case of stages for which no C++ implementation exists, Morpheus will fall back to the Python implementation without any additional configuration and operate in a hybrid execution mode. +If a stage does not have a C++ implementation, Morpheus will fall back to the Python implementation without any additional configuration and operate in a hybrid execution mode. In addition to C++ accelerated stage implementations, Morpheus also provides a C++ implementation for message primitives. When C++ execution is enabled, constructing one of the Python message classes defined in the `morpheus.pipeline.messages` module will return a Python object with bindings to the underlying C++ implementation. -Since we are defining our pipelines in Python, it becomes the responsibility of the Python implementation to build a C++ accelerated node; this happens in the `_build_source` and `_build_single` methods. Ultimately it is the decision of a Python stage to build a Python node or a C++ node. It is perfectly acceptable to build a Python node when `morpheus.config.CppConfig.get_should_use_cpp()` is configured to `True`; however it is not acceptable to build a C++ node when `morpheus.config.CppConfig.get_should_use_cpp()==False`. The reason is the C++ implementations of Morpheus' messages can be consumed by Python and C++ stage implementations alike. However when `morpheus.config.CppConfig.get_should_use_cpp()==False` the Python implementations will be used which cannot be consumed by the C++ implementations of stages. +Since we are defining our pipelines in Python, it becomes the responsibility of the Python implementation to build a C++ accelerated node. This happens in the `_build_source` and `_build_single` methods. Ultimately it is the decision of a Python stage to build a Python node or a C++ node. It is perfectly acceptable to build a Python node when `morpheus.config.CppConfig.get_should_use_cpp()` is configured to `True`. It is not acceptable, however, to build a C++ node when `morpheus.config.CppConfig.get_should_use_cpp() == False`. The reason is the C++ implementations of Morpheus' messages can be consumed by Python and C++ stage implementations alike. However when `morpheus.config.CppConfig.get_should_use_cpp() == False`, the Python implementations will be used which cannot be consumed by the C++ implementations of stages. Python stages which have a C++ implementation must advertise this functionality by implementing the `supports_cpp_node` [classmethod](https://docs.python.org/3.8/library/functions.html?highlight=classmethod#classmethod): @@ -40,7 +40,7 @@ def supports_cpp_node(cls): return True ``` -C++ message object declarations can be found in their respective headers, located in the `morpheus/_lib/include/morpheus/messages` directory; for example, the `MessageMeta` class would be located in `morpheus/_lib/include/morpheus/messages/meta.hpp`. In code this would be included as: +C++ message object declarations can be found in the header files that are located in the `morpheus/_lib/include/morpheus/messages` directory. For example, the `MessageMeta` class declaration is located in `morpheus/_lib/include/morpheus/messages/meta.hpp`. In code this would be included as: ```cpp #include @@ -53,14 +53,16 @@ template class PythonSource : ... ``` -The `SourceT` type will be the datatype emitted by this stage, which is not required to be a `shared_ptr` to a Morpheus message. In contrast, general stages and sinks must inherit from the `PythonNode` class: +The `SourceT` type will be the datatype emitted by this stage. In contrast, general stages and sinks must inherit from the `PythonNode` class, which specifies both receive and emit types: ```cpp -template +template // by default, emit type == receive type class PythonNode : ... ``` -Which specifies both receive and emit types. Both the `PythonSource` & `PythonNode` classes are defined in the `pyneo/node.hpp` header. +Both the `PythonSource` and `PythonNode` classes are defined in the `pyneo/node.hpp` header. + +Note: `SourceT` and `SinkT` types are typically `shared_ptr`s to a Morpheus message type. For example, `std::shared_ptr`. Note: The C++ implementation of a stage must receive and emit the same message types as the Python implementation. @@ -68,11 +70,11 @@ Note: The "Python" in the `PythonSource` & `PythonNode` class names refers to th ## A Simple Pass Through Stage -As in our Python example, we will start with a simple pass through stage which can be used as a starting point for future development of other stages. By convention, in Morpheus, C++ classes have the same name as the Python class and are located under a directory named `_lib`. We will be following that convention. To start, we will create a `_lib` directory and a new empty `__init__.py` file. +As in our Python guide, we will start with a simple pass through stage which can be used as a starting point for future development of other stages. Note that by convention, C++ classes in Morpheus have the same name as their corresponding Python classes and are located under a directory named `_lib`. We will be following that convention. To start, we will create a `_lib` directory and a new empty `__init__.py` file. -While our Python implementation accepts messages of any type, in the form of Python objects, on the C++ side, we don't have that flexibility as our node is subject to C++ static typing rules. In practice, this isn't a limitation as we usually know which specific message types we need to work with. +While our Python implementation accepts messages of any type (in the form of Python objects), on the C++ side we don't have that flexibility since our node is subject to C++ static typing rules. In practice, this isn't a limitation as we usually know which specific message types we need to work with. -To start with we have our Morpheus & Neo specific includes: +To start with, we have our Morpheus and Neo-specific includes: ```cpp #include // for MultiMessage @@ -80,7 +82,7 @@ To start with we have our Morpheus & Neo specific includes: #include // for PythonNode ``` -We'll want to define our stage in its own namespace. In this case, we will name it `morpheus_example`, giving us a namespace and class definition that looks like this: +We'll want to define our stage in its own namespace. In this case, we will name it `morpheus_example`, giving us a namespace and class definition that look like this: ```cpp namespace morpheus_example { @@ -103,20 +105,19 @@ operator_fn_t build_operator(); }; ``` -We explicitly set the visibility for the stage object in the namespace to default. This is due to a pybind11 requirement for module implementations to default symbol visibility to hidden (`-fvisibility=hidden`). More details about this can be found at: -[https://pybind11.readthedocs.io/en/stable/faq.html#someclass-declared-with-greater-visibility-than-the-type-of-its-field-someclass-member-wattributes](https://pybind11.readthedocs.io/en/stable/faq.html#someclass-declared-with-greater-visibility-than-the-type-of-its-field-someclass-member-wattributes) +We explicitly set the visibility for the stage object in the namespace to default. This is due to a pybind11 requirement for module implementations to default symbol visibility to hidden (`-fvisibility=hidden`). More details about this can be found in the [pybind11 documentation](https://pybind11.readthedocs.io/en/stable/faq.html#someclass-declared-with-greater-visibility-than-the-type-of-its-field-someclass-member-wattributes). -For simplicity we defined `base_t` as an alias for our base class type as the definition can be quite long. Our base class type also defines a few additional type aliases for us: `operator_fn_t`, `reader_type_t` and `writer_type_t`. The `reader_type_t` and `writer_type_t` aliases are shortcuts for specifying that we are a reader and writer of `std::shared_ptr` respectively. `operator_fn_t` (read as "operator function type") is an alias for: +For simplicity, we defined `base_t` as an alias for our base class type because the definition can be quite long. Our base class type also defines a few additional type aliases for us: `operator_fn_t`, `reader_type_t` and `writer_type_t`. The `reader_type_t` and `writer_type_t` aliases are shortcuts for specifying that we are a reader and writer of `std::shared_ptr`, respectively. `operator_fn_t` (read as "operator function type") is an alias for: ```cpp std::function(const Observable& source)> ``` -This means that a Neo operator function accepts an observable of type T and returns an observable of type R. In our case, both T & R are `std::shared_ptr`. +This means that a Neo operator function accepts an `Observable` of type `T` and returns an observable of type `R`. In our case, both `T` and `R` are `std::shared_ptr`. -All Morpheus C++ stages receive an instance of a Neo Segment and a name. Typically this is the Python class' `unique_name` property. Since C++ segments don't receive an instance of the Morpheus config if there are any attributes in the config needed by the C++ class, it is the responsibility of the Python class to extract them and pass them in as parameters to the C++ class. +All Morpheus C++ stages receive an instance of a Neo Segment and a name. Typically this is the Python class' `unique_name` property. Note that C++ segments don't receive an instance of the Morpheus config. Therefore, if there are any attributes in the config needed by the C++ class, it is the responsibility of the Python class to extract them and pass them in as parameters to the C++ class. -We will also define an interface proxy object to keep the class definition separated from the Python interface. This isn't strictly required, but it is a convention used internally by Morpheus. Our proxy object will define a static method named `init`, which is responsible for constructing a `PassThruStage` instance and returning it wrapped in a `shared_ptr`. There are many common Python types that [pybind11 automatically converts](https://pybind11.readthedocs.io/en/latest/advanced/cast/overview.html#conversion-table) to their associated C++ types, the Neo Segment is a C++ object with Python bindings. The proxy interface object is used to help insulate Python bindings from internal implementation details. +We will also define an interface proxy object to keep the class definition separated from the Python interface. This isn't strictly required, but it is a convention used internally by Morpheus. Our proxy object will define a static method named `init` which is responsible for constructing a `PassThruStage` instance and returning it wrapped in a `shared_ptr`. There are many common Python types that pybind11 [automatically converts](https://pybind11.readthedocs.io/en/latest/advanced/cast/overview.html#conversion-table) to their associated C++ types. The Neo `Segment` is a C++ object with Python bindings. The proxy interface object is used to help insulate Python bindings from internal implementation details. ```cpp struct PassThruStageInterfaceProxy @@ -180,7 +181,7 @@ Our includes section looks like: #include ``` -The constructor for our class is responsible for passing the output of build_operator to our base class, as well as calling the constructor for `neo::SegmentObject`: +The constructor for our class is responsible for passing the output of `build_operator` to our base class, as well as calling the constructor for `neo::SegmentObject`: ```cpp PassThruStage::PassThruStage(const neo::Segment& seg, const std::string& name) : @@ -189,7 +190,7 @@ PassThruStage::PassThruStage(const neo::Segment& seg, const std::string& name) : {} ``` -The `build_operator` method defines an observer who is subscribed to our input observable. The observer consists of three functions, typically lambdas, an `on_next`, `on_error`, and `on_completed`. Typically, these three functions call the associated methods on the output subscriber. +The `build_operator` method defines an observer who is subscribed to our input `Observable`. The observer consists of three functions that are typically lambdas: `on_next`, `on_error`, and `on_completed`. Typically, these three functions call the associated methods on the output subscriber. ```cpp PassThruStage::operator_fn_t PassThruStage::build_operator() @@ -204,9 +205,9 @@ PassThruStage::operator_fn_t PassThruStage::build_operator() } ``` -Note the usage of `std::move` in the `on_next` function. In Morpheus, our messages often contain both large payloads as well as Python objects where performing a copy necessitates acquiring the [Python Global Interpreter Lock (GIL)](https://docs.python.org/3/glossary.html#term-global-interpreter-lock). In either case, unnecessary copies can become a performance bottleneck; much care is taken to limit the number of copies required for data to move through the pipeline. +Note the use of `std::move` in the `on_next` function. In Morpheus, our messages often contain both large payloads as well as Python objects where performing a copy necessitates acquiring the Python [Global Interpreter Lock (GIL)](https://docs.python.org/3/glossary.html#term-global-interpreter-lock). In either case, unnecessary copies can become a performance bottleneck, and much care is taken to limit the number of copies required for data to move through the pipeline. -There are situations where a C++ stage does need to interact with Python, and acquiring the GIL is a requirement. In these situations, it is important to ensure that the GIL is released before calling the `on_next` method. This is typically accomplished using [pybind11's gil_scoped_acquire](https://pybind11.readthedocs.io/en/stable/advanced/misc.html#global-interpreter-lock-gil) RAII class inside of a code block. Consider the following `on_next` lambda function from Morpheus' `SerializeStage`: +There are situations in which a C++ stage does need to interact with Python, and therefore acquiring the GIL is a requirement. In these situations, it is important to ensure that the GIL is released before calling the `on_next` method. This is typically accomplished using pybind11's [gil_scoped_acquire](https://pybind11.readthedocs.io/en/stable/advanced/misc.html#global-interpreter-lock-gil) RAII class inside of a code block. Consider the following `on_next` lambda function from Morpheus' `SerializeStage`: ```cpp [this, &output](reader_type_t &&msg) { @@ -222,9 +223,9 @@ There are situations where a C++ stage does need to interact with Python, and ac We scoped the acquisition of the GIL such that it is held only for the parts of the code where it is strictly necessary. In the above example, when we exit the code block, the `gil` variable will go out of scope and release the global interpreter lock. -## Python Proxy & Interface +## Python Proxy and Interface -The three things all proxy interfaces need to do are: +The three things that all proxy interfaces need to do are: 1. Construct the stage wrapped in a `shared_ptr` 1. Register the stage with the Neo segment 1. Return a `shared_ptr` to the stage diff --git a/docs/source/developer_guide/guides/4_source_cpp_stage.md b/docs/source/developer_guide/guides/4_source_cpp_stage.md index d7a18b4417..c9fa8b77df 100644 --- a/docs/source/developer_guide/guides/4_source_cpp_stage.md +++ b/docs/source/developer_guide/guides/4_source_cpp_stage.md @@ -80,11 +80,11 @@ cudf::io::table_with_metadata from_json(const std::string &body) const; void close(); ``` -The `build_observable` method is responsible for constructing a Neo `Observable` for our source type, the result of which will be passed into our base's constructor. A Neo `Observable` is constructed by passing it a reference to a function (typically a lambda) which receives a reference to a Neo `Subscriber`. Typically, this function is the center of a source stage, making calls to the `Subscriber`'s `on_next`, `on_error` and `on_completed` methods. For this example, the RabbitMQ specific logic was broken out into the `source_generator` method, which should be analogous to the `source_generator` method from the Python class, and will emit new messages into the pipeline by calling `subscriber.on_next(message)`. +The `build_observable` method is responsible for constructing a Neo `Observable` for our source type, the result of which will be passed into our base's constructor. A Neo `Observable` is constructed by passing it a reference to a function (typically a lambda) which receives a reference to a Neo `Subscriber`. Typically, this function is the center of a source stage, making calls to the `Subscriber`'s `on_next`, `on_error`, and `on_completed` methods. For this example, the RabbitMQ-specific logic was broken out into the `source_generator` method, which should be analogous to the `source_generator` method from the Python class, and will emit new messages into the pipeline by calling `subscriber.on_next(message)`. The `from_json` method parses a JSON string to a cuDF [table_with_metadata](https://docs.rapids.ai/api/libcudf/stable/structcudf_1_1io_1_1table__with__metadata.html). Lastly, the `close` method disconnects from the RabbitMQ exchange. -We will also need three private attributes specific to our interactions with RabbitMQ, our polling interval, the name of the queue we are listening to, and a pointer to our channel object. +We will also need three private attributes specific to our interactions with RabbitMQ: our polling interval, the name of the queue we are listening to, and a pointer to our channel object. ```cpp std::chrono::milliseconds m_poll_interval; @@ -92,7 +92,7 @@ std::string m_queue_name; AmqpClient::Channel::ptr_t m_channel; ``` -Wrapping it all together our header file should look like this: +Wrapping it all together, our header file should look like this: `examples/rabbitmq/_lib/rabbitmq_source.hpp` ```cpp @@ -189,12 +189,12 @@ Our includes section looks like: #include ``` -The two Neo includes bringing in the actual definitions for Neo `Segment` and `SegmentObject`. The [Google Logging Library](https://github.com/google/glog) (glog) is used by Morpheus for logging; however, the choice of a logger is up to the individual developer. +The two Neo includes bring in the actual definitions for Neo `Segment` and `SegmentObject`. The [Google Logging Library](https://github.com/google/glog) (glog) is used by Morpheus for logging; however, the choice of a logger is up to the individual developer. Neo uses the [Boost.Fiber](https://www.boost.org/doc/libs/1_77_0/libs/fiber/doc/html/fiber/overview.html) library to perform task scheduling. In the future, Neo will likely expose a configuration option to choose between fibers or `std::thread`. For now, all Morpheus stages, both Python and C++, are executed within a fiber. In general, authors of a stage don't need to be too concerned about this detail, with two notable exceptions: -1. Rather than yielding or sleeping a thread, stage authors should instead call [boost::this_fiber::yield](https://www.boost.org/doc/libs/master/libs/fiber/doc/html/fiber/fiber_mgmt/this_fiber.html#this_fiber_yield) and [boost::this_fiber::sleep_for](https://www.boost.org/doc/libs/master/libs/fiber/doc/html/fiber/fiber_mgmt/this_fiber.html#this_fiber_sleep_for) respectively. -1. In cases where thread-local-storage is desired, [fiber local storage](https://www.boost.org/doc/libs/1_77_0/libs/fiber/doc/html/fiber/fls.html) should be used instead. +1. Rather than yielding or sleeping a thread, stage authors should instead call [boost::this_fiber::yield](https://www.boost.org/doc/libs/master/libs/fiber/doc/html/fiber/fiber_mgmt/this_fiber.html#this_fiber_yield) and [boost::this_fiber::sleep_for](https://www.boost.org/doc/libs/master/libs/fiber/doc/html/fiber/fiber_mgmt/this_fiber.html#this_fiber_sleep_for), respectively. +1. In cases where thread-local storage is desired, [fiber local storage](https://www.boost.org/doc/libs/1_77_0/libs/fiber/doc/html/fiber/fls.html) should be used instead. Authors of stages that require concurrency are free to choose their own concurrency models. Launching new processes, threads, or fibers from within a stage is permissible as long as the management of those resources is contained within the stage. Newly launched threads are also free to use thread-local storage so long as it doesn't occur within the thread the stage is executed from. @@ -219,13 +219,13 @@ RabbitMQSourceStage::RabbitMQSourceStage(const neo::Segment &segment, } ``` -The key thing to note is the third argument in the invocation of our base's constructor is our observable: +The key thing to note is that the third argument in the invocation of our base's constructor is our observable: ```cpp base_t(segment, name, build_observable()) ``` -The observable argument to the constructor contains an empty default value, allowing stage authors to later define the observable by calling the `set_source_observable` method; the constructor could instead be written as: +The observable argument to the constructor contains an empty default value, allowing stage authors to later define the observable by calling the `set_source_observable` method. The constructor could instead be written as: ```cpp base_t(segment, name) @@ -238,7 +238,7 @@ Our `build_observable` method returns an observable, which needs to do three thi 1. Emit data into the pipeline by calling `Subscriber`'s `on_next` method. In our example, this occurs in the `source_generator` method. 1. When an error occurs, call the `Subscriber`'s `on_error` method. 1. When we are done, call the `Subscriber`'s `on_complete` method. -Note: Some source stages, such as ones that read input data from a file, there is a clear point where the stage is complete. Others such as this one are intended to continue running until it is shut down. For these situations, the stage can poll the `Subscriber`'s `is_subscribed` method, which will return a value of `false` on shut-down. +Note: For some source stages, such as ones that read input data from a file, there is a clear point where the stage is complete. Others such as this one are intended to continue running until it is shut down. For the latter situation, the stage can poll the `Subscriber`'s `is_subscribed` method, which will return a value of `false` on shut down. ```cpp neo::Observable RabbitMQSourceStage::build_observable() @@ -294,9 +294,9 @@ void RabbitMQSourceStage::source_generator(neo::Subscriber StreamPair: From 38428c34f5c7c7d5543bc8a897dbf5165648fec2 Mon Sep 17 00:00:00 2001 From: David Gardner <96306125+dagardner-nv@users.noreply.github.com> Date: Fri, 27 May 2022 16:25:02 -0700 Subject: [PATCH 28/73] Ensure default path values in morpheus.cli are no longer relative (#62) Moves the `data` dir under the morpheus dir. This allows it to be easily installable via setuptools & discoverable relative to `morpheus.__file__` and sets a new attribute `morpheus.DATA_DIR`. This change also fixes a few random bugs related to non-inplace morpheus builds. Allows morphues cli to be run are outside of the root of the repo fixes #60 Authors: - David Gardner (https://github.com/dagardner-nv) - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - Christopher Harris (https://github.com/cwharris) - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/62 --- .gitattributes | 2 +- CMakeLists.txt | 2 + MANIFEST.in | 4 +- docs/source/basics/examples.rst | 10 ++-- .../guides/2_real_world_phishing.md | 23 ++++----- docs/source/morpheus_quickstart_guide.md | 28 +++++------ examples/abp_nvsmi_detection/README.md | 6 +-- examples/abp_pcap_detection/README.md | 4 +- .../abp_pcap_preprocessing.py | 2 +- .../gnn_fraud_detection_pipeline/README.md | 2 +- examples/gnn_fraud_detection_pipeline/run.py | 4 +- examples/log_parsing/messages.py | 12 ++--- examples/log_parsing/preprocessing.py | 2 +- examples/log_parsing/run.py | 2 +- examples/nlp_si_detection/README.md | 6 +-- morpheus/__init__.py | 2 + morpheus/cli.py | 9 ++-- .../cmake/utils/python_module_tools.cmake | 19 ++++---- .../data}/abp_pcap_dump.jsonlines | 0 .../data}/bert-base-cased-hash.txt | 0 .../data}/bert-base-uncased-hash.txt | 0 {data => morpheus/data}/columns_ae.txt | 0 {data => morpheus/data}/columns_fil.txt | 0 {data => morpheus/data}/email.jsonlines | 0 {data => morpheus/data}/labels_ae.txt | 0 {data => morpheus/data}/labels_nlp.txt | 0 {data => morpheus/data}/labels_phishing.txt | 0 {data => morpheus/data}/nvsmi.jsonlines | 0 {data => morpheus/data}/pcap_dump.jsonlines | 0 .../data}/sid_training_data_truth.csv | 0 setup.py | 3 -- tests/test_cli.py | 47 ++++++++++++++++++- tests/utils.py | 3 +- 33 files changed, 123 insertions(+), 69 deletions(-) rename {data => morpheus/data}/abp_pcap_dump.jsonlines (100%) rename {data => morpheus/data}/bert-base-cased-hash.txt (100%) rename {data => morpheus/data}/bert-base-uncased-hash.txt (100%) rename {data => morpheus/data}/columns_ae.txt (100%) rename {data => morpheus/data}/columns_fil.txt (100%) rename {data => morpheus/data}/email.jsonlines (100%) rename {data => morpheus/data}/labels_ae.txt (100%) rename {data => morpheus/data}/labels_nlp.txt (100%) rename {data => morpheus/data}/labels_phishing.txt (100%) rename {data => morpheus/data}/nvsmi.jsonlines (100%) rename {data => morpheus/data}/pcap_dump.jsonlines (100%) rename {data => morpheus/data}/sid_training_data_truth.csv (100%) diff --git a/.gitattributes b/.gitattributes index 325c1bfad8..c9e36e9a1e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,4 @@ morpheus/_version.py export-subst -data/* filter=lfs diff=lfs merge=lfs -text +morpheus/data/* filter=lfs diff=lfs merge=lfs -text tests/expected_data/* filter=lfs diff=lfs merge=lfs -text tests/mock_triton_server/payloads/** filter=lfs diff=lfs merge=lfs -text diff --git a/CMakeLists.txt b/CMakeLists.txt index de73768d02..847ada9307 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -93,6 +93,7 @@ set(MORPHEUS_ROOT_PYTHON_FILES "setup.cfg" "setup.py" "versioneer.py" + "MANIFEST.in" ) # Add the root python files to the list @@ -134,6 +135,7 @@ install( FILES_MATCHING PATTERN "*.py" PATTERN "py.typed" + PATTERN "data/*" ) diff --git a/MANIFEST.in b/MANIFEST.in index d1eee2cca4..c8c2c6df7a 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,2 +1,4 @@ include versioneer.py -include morpheus/_version.py \ No newline at end of file +include morpheus/_version.py +recursive-include morpheus/data * +recursive-include morpheus *.so py.typed *.pyi diff --git a/docs/source/basics/examples.rst b/docs/source/basics/examples.rst index 78950e7d7f..7502bb5c51 100644 --- a/docs/source/basics/examples.rst +++ b/docs/source/basics/examples.rst @@ -35,7 +35,7 @@ This example will copy the values from Kafka into ``out.jsonlines``. Remove Fields from JSON Objects ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -This example will only copy the fiels 'timestamp', 'src_ip' and 'dest_ip' from ``data/pcap_dump.jsonlines`` to +This example will only copy the fields 'timestamp', 'src_ip' and 'dest_ip' from ``morpheus/data/pcap_dump.jsonlines`` to ``out.jsonlines``. .. image:: img/remove_fields_from_json_objects.png @@ -43,7 +43,7 @@ This example will only copy the fiels 'timestamp', 'src_ip' and 'dest_ip' from ` .. code-block:: bash morpheus run pipeline-nlp --viz_file=basic_usage_img/remove_fields_from_json_objects.png \ - from-file --filename data/pcap_dump.jsonlines \ + from-file --filename morpheus/data/pcap_dump.jsonlines \ deserialize \ serialize --include 'timestamp' --include 'src_ip' --include 'dest_ip' \ to-file --filename out.jsonlines @@ -58,7 +58,7 @@ This example will report the throughput on the command line. .. code-block:: console $ morpheus run pipeline-nlp --viz_file=basic_usage_img/monitor_throughput.png \ - from-file --filename data/pcap_dump.jsonlines \ + from-file --filename morpheus/data/pcap_dump.jsonlines \ deserialize \ monitor --description "Lines Throughput" --smoothing 0.1 --unit "lines" \ serialize \ @@ -79,7 +79,7 @@ decouple one stage from the next. Without the buffers, all montioring would show .. code-block:: console $ morpheus run pipeline-nlp --viz_file=basic_usage_img/multi_monitor_throughput.png \ - from-file --filename data/pcap_dump.jsonlines \ + from-file --filename morpheus/data/pcap_dump.jsonlines \ monitor --description "From File Throughput" \ buffer \ deserialize \ @@ -107,7 +107,7 @@ This example shows an NLP Pipeline which uses most stages available in Morpheus. $ morpheus run --num_threads=8 --pipeline_batch_size=1024 --model_max_batch_size=32 \ pipeline-nlp --viz_file=basic_usage_img/nlp_kitchen_sink.png \ - from-file --filename data/pcap_dump.jsonlines \ + from-file --filename morpheus/data/pcap_dump.jsonlines \ buffer --count=500 \ deserialize \ preprocess \ diff --git a/docs/source/developer_guide/guides/2_real_world_phishing.md b/docs/source/developer_guide/guides/2_real_world_phishing.md index 33efa69424..07c1f9ef5f 100644 --- a/docs/source/developer_guide/guides/2_real_world_phishing.md +++ b/docs/source/developer_guide/guides/2_real_world_phishing.md @@ -185,12 +185,13 @@ From this information, we can see that the expected shape of the model inputs is Let's set up the paths for our input and output files. For simplicity, we assume that the `MORPHEUS_ROOT` environment variable is set to the root of the Morpheus project repository. In a production deployment, it may be more prudent to replace our usage of environment variables with command-line flags or a dedicated configuration management library. ```python +import morpheus + root_dir = os.environ['MORPHEUS_ROOT'] out_dir = os.environ.get('OUT_DIR', '/tmp') -data_dir = os.path.join(root_dir, 'data') -labels_file = os.path.join(data_dir, 'labels_phishing.txt') -vocab_file = os.path.join(data_dir, 'bert-base-uncased-hash.txt') +labels_file = os.path.join(morpheus.DATA_DIR, 'labels_phishing.txt') +vocab_file = os.path.join(morpheus.DATA_DIR, 'bert-base-uncased-hash.txt') input_file = os.path.join(root_dir, 'examples/data/email.jsonlines') results_file = os.path.join(out_dir, 'detections.jsonlines') @@ -213,9 +214,9 @@ First we set our pipeline mode to NLP. Next, we use the third-party [psutils](ht The `feature_length` property needs to match the length of the model inputs, which we got from Triton in the previous section using the model's `/config` endpoint. -Ground truth classification labels are read from the `data/labels_phishing.txt` file included in Morpheus. +Ground truth classification labels are read from the `morpheus/data/labels_phishing.txt` file included in Morpheus. -Now that our config object is populated, we move on to the pipeline itself. We will be using the same input file from the previous examples, and to tokenize the input data we will use Morpheus' `PreprocessNLPStage`. +Now that our config object is populated, we move on to the pipeline itself. We will be using the same input file from the previous examples, and to tokenize the input data we will use Morpheus' `PreprocessNLPStage`. This stage uses the [cudf subword tokenizer](https://docs.rapids.ai/api/cudf/stable/api_docs/api/cudf.core.subword_tokenizer.SubwordTokenizer.__call__.html) to transform strings into a tensor of numbers to be fed into the neural network model. Rather than split the string by characters or whitespaces, we split them into meaningful subwords based upon the occurrence of the subwords in a large training corpus. You can find more details here: [https://arxiv.org/abs/1810.04805v2](https://arxiv.org/abs/1810.04805v2). All we need to know for now is that the text will be converted to subword token ids based on the vocabulary file that we provide (`vocab_hash_file=vocab file`). @@ -232,7 +233,7 @@ pipeline.add_stage( ``` In addition to providing the `Config` object that we defined above, we also configure this stage to: -* Use the `data/bert-base-uncased-hash.txt` vocabulary file for its subword token ids (`vocab_hash_file=vocab_file`). +* Use the `morpheus/data/bert-base-uncased-hash.txt` vocabulary file for its subword token ids (`vocab_hash_file=vocab_file`). * Truncate the length of the text to a max number of tokens (`truncation=True`). * Change the casing to all lowercase (`do_lower_case=True`). * Refrain from adding the default BERT special tokens like `[SEP]` for separation between two sentences and `[CLS]` at the start of the text (`add_special_tokens=False`). @@ -258,7 +259,7 @@ pipeline.add_stage(MonitorStage(config, description="Inference Rate", smoothing= pipeline.add_stage(FilterDetectionsStage(config, threshold=0.9)) ``` -Lastly, we will save our results to disk. For this purpose, we are using two stages that are often used in conjunction with each other: `SerializeStage` and `WriteToFileStage`. +Lastly, we will save our results to disk. For this purpose, we are using two stages that are often used in conjunction with each other: `SerializeStage` and `WriteToFileStage`. The `SerializeStage` is used to include and exclude columns as desired in the output. Importantly, it also handles conversion from the `MultiMessage`-derived output type that is used by the `FilterDetectionsStage` to the `MessageMeta` class that is expected as input by the `WriteToFileStage`. @@ -285,6 +286,7 @@ import os import psutil +import morpheus from morpheus.config import Config from morpheus.config import PipelineModes from morpheus.pipeline import LinearPipeline @@ -308,9 +310,8 @@ def run_pipeline(): root_dir = os.environ['MORPHEUS_ROOT'] out_dir = os.environ.get('OUT_DIR', '/tmp') - data_dir = os.path.join(root_dir, 'data') - labels_file = os.path.join(data_dir, 'labels_phishing.txt') - vocab_file = os.path.join(data_dir, 'bert-base-uncased-hash.txt') + labels_file = os.path.join(morpheus.DATA_DIR, 'labels_phishing.txt') + vocab_file = os.path.join(morpheus.DATA_DIR, 'bert-base-uncased-hash.txt') input_file = os.path.join(root_dir, 'examples/data/email.jsonlines') results_file = os.path.join(out_dir, 'detections.jsonlines') @@ -377,7 +378,7 @@ if __name__ == "__main__": In our previous examples, we didn't define a constructor for the Python classes that we were building for our stages. However, there are many cases where we will need to receive configuration parameters. Every stage constructor must receive an instance of a `morpheus.config.Config` object as its first argument and is then free to define additional stage-specific arguments after that. The Morpheus config object will contain configuration parameters needed by multiple stages in the pipeline, and the constructor in each Morpheus stage is free to inspect these. In contrast, parameters specific to a single stage are typically defined as constructor arguments. -Note that it is a best practice to perform any necessary validation checks in the constructor. This allows us to fail early rather than after the pipeline has started. +Note that it is a best practice to perform any necessary validation checks in the constructor. This allows us to fail early rather than after the pipeline has started. In our `RecipientFeaturesStage` example, we hard-coded the Bert separator token. Let's instead refactor the code to receive that as a constructor argument. Let's also take the opportunity to verify that the pipeline mode is set to `morpheus.config.PipelineModes.NLP`. Our refactored class definition now looks like: diff --git a/docs/source/morpheus_quickstart_guide.md b/docs/source/morpheus_quickstart_guide.md index c8f7a41d68..4f433aaf89 100644 --- a/docs/source/morpheus_quickstart_guide.md +++ b/docs/source/morpheus_quickstart_guide.md @@ -558,11 +558,11 @@ $ helm install --set ngc.apiKey="$API_KEY" \ --use_cpp=True \ pipeline-nlp \ --model_seq_length=128 \ - --labels_file=./data/labels_phishing.txt \ - from-file --filename=./data/email.jsonlines \ + --labels_file=./morpheus/data/labels_phishing.txt \ + from-file --filename=./morpheus/data/email.jsonlines \ monitor --description 'FromFile Rate' --smoothing=0.001 \ deserialize \ - preprocess --vocab_hash_file=./data/bert-base-uncased-hash.txt --truncation=True --do_lower_case=True --add_special_tokens=False \ + preprocess --vocab_hash_file=./morpheus/data/bert-base-uncased-hash.txt --truncation=True --do_lower_case=True --add_special_tokens=False \ monitor --description 'Preprocess Rate' \ inf-triton --model_name=phishing-bert-onnx --server_url=ai-engine:8001 --force_convert_inputs=True \ monitor --description 'Inference Rate' --smoothing=0.001 --unit inf \ @@ -588,11 +588,11 @@ $ helm install --set ngc.apiKey="$API_KEY" \ --use_cpp=True \ pipeline-nlp \ --model_seq_length=128 \ - --labels_file=./data/labels_phishing.txt \ + --labels_file=./morpheus/data/labels_phishing.txt \ from-kafka --input_topic --bootstrap_servers broker:9092 \ monitor --description 'FromKafka Rate' --smoothing=0.001 \ deserialize \ - preprocess --vocab_hash_file=./data/bert-base-uncased-hash.txt --truncation=True --do_lower_case=True --add_special_tokens=False \ + preprocess --vocab_hash_file=./morpheus/data/bert-base-uncased-hash.txt --truncation=True --do_lower_case=True --add_special_tokens=False \ monitor --description 'Preprocess Rate' \ inf-triton --force_convert_inputs=True --model_name=phishing-bert-onnx --server_url=ai-engine:8001 \ monitor --description='Inference Rate' --smoothing=0.001 --unit inf \ @@ -635,10 +635,10 @@ $ helm install --set ngc.apiKey="$API_KEY" \ --model_max_batch_size=32 \ pipeline-nlp \ --model_seq_length=256 \ - from-file --filename=./data/pcap_dump.jsonlines \ + from-file --filename=./morpheus/data/pcap_dump.jsonlines \ monitor --description 'FromFile Rate' --smoothing=0.001 \ deserialize \ - preprocess --vocab_hash_file=./data/bert-base-uncased-hash.txt --truncation=True --do_lower_case=True --add_special_tokens=False \ + preprocess --vocab_hash_file=./morpheus/data/bert-base-uncased-hash.txt --truncation=True --do_lower_case=True --add_special_tokens=False \ monitor --description='Preprocessing rate' \ inf-triton --force_convert_inputs=True --model_name=sid-minibert-onnx --server_url=ai-engine:8001 \ monitor --description='Inference rate' --smoothing=0.001 --unit inf \ @@ -667,7 +667,7 @@ $ helm install --set ngc.apiKey="$API_KEY" \ from-kafka --input_topic --bootstrap_servers broker:9092 \ monitor --description 'FromKafka Rate' --smoothing=0.001 \ deserialize \ - preprocess --vocab_hash_file=./data/bert-base-uncased-hash.txt --truncation=True --do_lower_case=True --add_special_tokens=False \ + preprocess --vocab_hash_file=./morpheus/data/bert-base-uncased-hash.txt --truncation=True --do_lower_case=True --add_special_tokens=False \ monitor --description='Preprocessing Rate' \ inf-triton --force_convert_inputs=True --model_name=sid-minibert-onnx --server_url=ai-engine:8001 \ monitor --description='Inference Rate' --smoothing=0.001 --unit inf \ @@ -685,7 +685,7 @@ Make sure you create input and output Kafka topics before you start the pipeline $ kubectl -n $NAMESPACE exec -it deploy/broker -c broker -- kafka-console-producer.sh \ --broker-list broker:9092 \ --topic < \ - + ``` **Note**: This should be used for development purposes only via this developer kit. Loading from the file into Kafka should not be used in production deployments of Morpheus. @@ -708,7 +708,7 @@ $ helm install --set ngc.apiKey="$API_KEY" \ --model_max_batch_size=64 \ --use_cpp=True \ pipeline-fil \ - from-file --filename=./data/nvsmi.jsonlines \ + from-file --filename=./morpheus/data/nvsmi.jsonlines \ monitor --description 'FromFile Rate' --smoothing=0.001 \ deserialize \ preprocess \ @@ -754,7 +754,7 @@ Make sure you create input and output Kafka topics before you start the pipeline $ kubectl -n $NAMESPACE exec -it deploy/broker -c broker -- kafka-console-producer.sh \ --broker-list broker:9092 \ --topic < \ - + ``` **Note**: This should be used for development purposes only via this developer kit. Loading from the file into Kafka should not be used in production deployments of Morpheus. @@ -937,7 +937,7 @@ Options: order to convert class IDs into labels. A label file is a simple text file where each line corresponds to a label [default: - data/labels_nlp.txt] + morpheus/data/labels_nlp.txt] --viz_file FILE Save a visualization of the pipeline at the specified location --help Show this message and exit. @@ -1000,7 +1000,7 @@ Options: only a single output label is created for FIL --columns_file FILE Specifies a file to read column features. - [default: data/columns_fil.txt] + [default: morpheus/data/columns_fil.txt] --viz_file FILE Save a visualization of the pipeline at the specified location --help Show this message and exit. @@ -1052,7 +1052,7 @@ Usage: morpheus run pipeline-ae [OPTIONS] COMMAND1 [ARGS]... [COMMAND2 4. The following stages must come after an inference stage: `add-class`, `filter`, `gen-viz` Options: - --columns_file FILE [default: data/columns_ae.txt] + --columns_file FILE [default: morpheus/data/columns_ae.txt] --labels_file FILE Specifies a file to read labels from in order to convert class IDs into labels. A label file is a simple text file where each line corresponds to a diff --git a/examples/abp_nvsmi_detection/README.md b/examples/abp_nvsmi_detection/README.md index a0f8e40c71..7a52fad963 100644 --- a/examples/abp_nvsmi_detection/README.md +++ b/examples/abp_nvsmi_detection/README.md @@ -46,7 +46,7 @@ $ nvidia-smi dmon Each line in the output represents the GPU metrics at a single point in time. As the tool progresses the GPU begins to be utilized and you can see the SM% and Mem% increase as memory is loaded into the GPU and computations are performed. The model we will be using can ingest this information and determine whether or not the GPU is mining cryptocurriences without needing additional information from the host machine. -In this example we will be using the `data/nvsmi.jsonlines` dataset that is known to contain mining behavior profiles. The dataset is in the `.jsonlines` format which means each new line represents an new JSON object. In order to parse this data, it must be ingested, split by lines into individual JSON objects, and parsed into cuDF dataframes. This will all be handled by Morpheus. +In this example we will be using the `morpheus/data/nvsmi.jsonlines` dataset that is known to contain mining behavior profiles. The dataset is in the `.jsonlines` format which means each new line represents an new JSON object. In order to parse this data, it must be ingested, split by lines into individual JSON objects, and parsed into cuDF dataframes. This will all be handled by Morpheus. ## Pipeline Architecture @@ -100,9 +100,9 @@ morpheus --log_level=DEBUG \ `# Run a pipeline with 8 threads and a model batch size of 32 (Must be equal or less than Triton config)` \ run --num_threads=8 --pipeline_batch_size=1024 --model_max_batch_size=1024 \ `# Specify a NLP pipeline with 256 sequence length (Must match Triton config)` \ - pipeline-fil --columns_file=$MORPHEUS_ROOT/data/columns_fil.txt \ + pipeline-fil \ `# 1st Stage: Read from file` \ - from-file --filename=$MORPHEUS_ROOT/data/nvsmi.jsonlines \ + from-file --filename=$MORPHEUS_ROOT/morpheus/data/nvsmi.jsonlines \ `# 2nd Stage: Deserialize from JSON strings to objects` \ deserialize \ `# 3rd Stage: Preprocessing converts the input data into BERT tokens` \ diff --git a/examples/abp_pcap_detection/README.md b/examples/abp_pcap_detection/README.md index be2ecd1d0d..7c478afd0e 100644 --- a/examples/abp_pcap_detection/README.md +++ b/examples/abp_pcap_detection/README.md @@ -83,11 +83,11 @@ Options: --help Show this message and exit. ``` -To launch the configured Morpheus pipeline with the sample data that is provided at `/data`, run the following: +To launch the configured Morpheus pipeline with the sample data that is provided at `/morpheus/data`, run the following: ```bash python run.py \ - --input_file ../../data/abp_pcap_dump.jsonlines \ + --input_file ../../morpheus/data/abp_pcap_dump.jsonlines \ --output_file ./pcap_out.jsonlines \ --model_name 'abp-pcap-xgb' \ --server_url localhost:8001 diff --git a/examples/abp_pcap_detection/abp_pcap_preprocessing.py b/examples/abp_pcap_detection/abp_pcap_preprocessing.py index a11da78ef7..19458642a3 100644 --- a/examples/abp_pcap_detection/abp_pcap_preprocessing.py +++ b/examples/abp_pcap_detection/abp_pcap_preprocessing.py @@ -27,7 +27,7 @@ from morpheus.messages import MultiInferenceFILMessage from morpheus.messages import MultiInferenceMessage from morpheus.messages import MultiMessage -from morpheus.stages.preprocess.preprocessing import PreprocessBaseStage +from morpheus.stages.preprocess.preprocess_base_stage import PreprocessBaseStage class AbpPcapPreprocessingStage(PreprocessBaseStage): diff --git a/examples/gnn_fraud_detection_pipeline/README.md b/examples/gnn_fraud_detection_pipeline/README.md index 44961b173f..6bb3d3e4ba 100644 --- a/examples/gnn_fraud_detection_pipeline/README.md +++ b/examples/gnn_fraud_detection_pipeline/README.md @@ -57,7 +57,7 @@ To launch the configured Morpheus pipeline with the sample data that is provided ```bash -python run.py +python run.py ====Building Pipeline==== Added source: └─> morpheus.MessageMeta diff --git a/examples/gnn_fraud_detection_pipeline/run.py b/examples/gnn_fraud_detection_pipeline/run.py index 1f17ed88e6..3e9b915aa5 100644 --- a/examples/gnn_fraud_detection_pipeline/run.py +++ b/examples/gnn_fraud_detection_pipeline/run.py @@ -13,9 +13,9 @@ # limitations under the License. import logging +import os import click -import psutil from morpheus.config import Config from morpheus.config import CppConfig @@ -35,7 +35,7 @@ @click.command() @click.option( "--num_threads", - default=psutil.cpu_count(), + default=os.cpu_count(), type=click.IntRange(min=1), help="Number of internal pipeline threads to use", ) diff --git a/examples/log_parsing/messages.py b/examples/log_parsing/messages.py index 796e1f84d4..00cf406976 100644 --- a/examples/log_parsing/messages.py +++ b/examples/log_parsing/messages.py @@ -16,15 +16,15 @@ import cupy as cp -from morpheus.messages import DataClassProp -from morpheus.messages import InferenceMemory from morpheus.messages import MultiInferenceMessage from morpheus.messages import MultiResponseMessage from morpheus.messages import ResponseMemory -from morpheus.messages import get_input -from morpheus.messages import get_output -from morpheus.messages import set_input -from morpheus.messages import set_output +from morpheus.messages.data_class_prop import DataClassProp +from morpheus.messages.multi_inference_message import InferenceMemory +from morpheus.messages.multi_inference_message import get_input +from morpheus.messages.multi_inference_message import set_input +from morpheus.messages.multi_response_message import get_output +from morpheus.messages.multi_response_message import set_output @dataclasses.dataclass diff --git a/examples/log_parsing/preprocessing.py b/examples/log_parsing/preprocessing.py index b8fe674872..e6be76f051 100644 --- a/examples/log_parsing/preprocessing.py +++ b/examples/log_parsing/preprocessing.py @@ -26,7 +26,7 @@ from morpheus.messages import MultiInferenceMessage from morpheus.messages import MultiInferenceNLPMessage from morpheus.messages import MultiMessage -from morpheus.stages.preprocess.preprocessing import PreprocessBaseStage +from morpheus.stages.preprocess.preprocess_base_stage import PreprocessBaseStage from morpheus.utils.cudf_subword_helper import tokenize_text_series diff --git a/examples/log_parsing/run.py b/examples/log_parsing/run.py index d145ece2bd..a944b3e91c 100644 --- a/examples/log_parsing/run.py +++ b/examples/log_parsing/run.py @@ -23,7 +23,7 @@ from morpheus.config import CppConfig from morpheus.config import PipelineModes from morpheus.pipeline import LinearPipeline -from morpheus.stages.general.general_stages import BufferStage +from morpheus.stages.general.buffer_stage import BufferStage from morpheus.stages.general.monitor_stage import MonitorStage from morpheus.stages.input.file_source_stage import FileSourceStage from morpheus.stages.output.write_to_file_stage import WriteToFileStage diff --git a/examples/nlp_si_detection/README.md b/examples/nlp_si_detection/README.md index 5fe1eca108..9bab4cb433 100644 --- a/examples/nlp_si_detection/README.md +++ b/examples/nlp_si_detection/README.md @@ -108,13 +108,13 @@ morpheus --debug --log_level=DEBUG \ `# Run a pipeline with 8 threads and a model batch size of 32 (Must match Triton config)` \ run --num_threads=8 --pipeline_batch_size=1024 --model_max_batch_size=32 \ `# Specify a NLP pipeline with 256 sequence length (Must match Triton config)` \ - pipeline-nlp --model_seq_length=256 --labels_file=$MORPHEUS_ROOT/data/labels_nlp.txt \ + pipeline-nlp --model_seq_length=256 \ `# 1st Stage: Read from file` \ - from-file --filename=$MORPHEUS_ROOT/data/pcap_dump.jsonlines \ + from-file --filename=$MORPHEUS_ROOT/morpheus/data/pcap_dump.jsonlines \ `# 2nd Stage: Deserialize from JSON strings to objects` \ deserialize \ `# 3rd Stage: Preprocessing converts the input data into BERT tokens` \ - preprocess --vocab_hash_file=$MORPHEUS_ROOT/data/bert-base-uncased-hash.txt --do_lower_case=True --truncation=True \ + preprocess --vocab_hash_file=$MORPHEUS_ROOT/morpheus/data/bert-base-uncased-hash.txt --do_lower_case=True --truncation=True \ `# 4th Stage: Send messages to Triton for inference. Specify the model loaded in Setup` \ inf-triton --model_name=sid-minibert-onnx --server_url=localhost:8001 --force_convert_inputs=True \ `# 5th Stage: Monitor stage prints throughput information to the console` \ diff --git a/morpheus/__init__.py b/morpheus/__init__.py index 6ccb842156..e0bc8c6b6c 100644 --- a/morpheus/__init__.py +++ b/morpheus/__init__.py @@ -15,6 +15,7 @@ """ import logging +import os # Create a default null logger to prevent log messages from being propagated to users of this library unless otherwise # configured. Use the `utils.logging` module to configure Morpheus logging @@ -22,4 +23,5 @@ from . import _version +DATA_DIR = os.path.join(os.path.dirname(__file__), "data") __version__ = _version.get_versions()['version'] diff --git a/morpheus/cli.py b/morpheus/cli.py index 6cdf4c0902..c6ce7d3dfc 100644 --- a/morpheus/cli.py +++ b/morpheus/cli.py @@ -20,6 +20,7 @@ import click from click.globals import get_current_context +import morpheus from morpheus.config import Config from morpheus.config import ConfigAutoEncoder from morpheus.config import ConfigBase @@ -324,7 +325,7 @@ def run(ctx: click.Context, **kwargs): "do_truncate == False, there will be multiple returned sequences containing the " "overflowing token-ids. Default value is 256")) @click.option('--labels_file', - default="data/labels_nlp.txt", + default=os.path.join(morpheus.DATA_DIR, "labels_nlp.txt"), type=click.Path(dir_okay=False, exists=True, file_okay=True), help=("Specifies a file to read labels from in order to convert class IDs into labels. " "A label file is a simple text file where each line corresponds to a label")) @@ -386,7 +387,7 @@ def pipeline_nlp(ctx: click.Context, **kwargs): "A label file is a simple text file where each line corresponds to a label. " "If unspecified, only a single output label is created for FIL")) @click.option('--columns_file', - default="data/columns_fil.txt", + default=os.path.join(morpheus.DATA_DIR, "columns_fil.txt"), type=click.Path(dir_okay=False, exists=True, file_okay=True), help=("Specifies a file to read column features.")) @click.option('--viz_file', @@ -449,7 +450,7 @@ def pipeline_fil(ctx: click.Context, **kwargs): cls=AliasedGroup, **command_kwargs) @click.option('--columns_file', - default="data/columns_ae.txt", + default=os.path.join(morpheus.DATA_DIR, "columns_ae.txt"), type=click.Path(dir_okay=False, exists=True, file_okay=True), help=("")) @click.option('--labels_file', @@ -827,7 +828,7 @@ def train_ae(ctx: click.Context, **kwargs): @click.command(name="preprocess", short_help="Convert messages to tokens", **command_kwargs) @click.option('--vocab_hash_file', - default="data/bert-base-cased-hash.txt", + default=os.path.join(morpheus.DATA_DIR, "bert-base-cased-hash.txt"), type=click.Path(exists=True, dir_okay=False), help=("Path to hash file containing vocabulary of words with token-ids. " "This can be created from the raw vocabulary using the cudf.utils.hash_vocab_utils.hash_vocab " diff --git a/morpheus/cmake/utils/python_module_tools.cmake b/morpheus/cmake/utils/python_module_tools.cmake index 86cbf5c623..99dfddc094 100644 --- a/morpheus/cmake/utils/python_module_tools.cmake +++ b/morpheus/cmake/utils/python_module_tools.cmake @@ -35,13 +35,16 @@ function(inplace_build_copy TARGET_NAME INPLACE_DIR) # Create the copy command for each resource foreach(resource ${target_resources}) + # Get the relative path to the build directory + file(RELATIVE_PATH relative_resource ${target_build_dir} ${resource}) + add_custom_command( - OUTPUT ${INPLACE_DIR}/${resource} - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${target_build_dir}/${resource} ${INPLACE_DIR}/${resource} - DEPENDS ${target_build_dir}/${resource} - COMMENT "Copying stub ${target_build_dir}/${resource} to ${INPLACE_DIR}/${resource}" + OUTPUT ${INPLACE_DIR}/${relative_resource} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${resource} ${INPLACE_DIR}/${relative_resource} + DEPENDS ${resource} + COMMENT "Copying stub ${resource} to ${INPLACE_DIR}/${relative_resource}" ) - list(APPEND resource_outputs ${INPLACE_DIR}/${resource}) + list(APPEND resource_outputs ${INPLACE_DIR}/${relative_resource}) endforeach() # Final target to depend on the copied files @@ -197,10 +200,10 @@ macro(add_python_module MODULE_NAME) add_dependencies(all_python_targets ${TARGET_NAME}) # Before installing, create the custom command to generate the stubs - set(pybind11_stub_file "${MODULE_NAME}/__init__.pyi") + set(pybind11_stub_file "${CMAKE_CURRENT_BINARY_DIR}/${MODULE_NAME}/__init__.pyi") add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${pybind11_stub_file} + OUTPUT ${pybind11_stub_file} COMMAND ${Python3_EXECUTABLE} -m pybind11_stubgen ${TARGET_NAME} --no-setup-py --log-level WARN -o ./ --root-module-suffix \"\" DEPENDS ${TARGET_NAME} all_python_targets COMMENT "Building stub for python module ${TARGET_NAME}..." @@ -209,7 +212,7 @@ macro(add_python_module MODULE_NAME) # Add a custom target to ensure the stub generation runs add_custom_target(${TARGET_NAME}-stubs ALL - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${pybind11_stub_file} + DEPENDS ${pybind11_stub_file} ) # Save the output as a target property diff --git a/data/abp_pcap_dump.jsonlines b/morpheus/data/abp_pcap_dump.jsonlines similarity index 100% rename from data/abp_pcap_dump.jsonlines rename to morpheus/data/abp_pcap_dump.jsonlines diff --git a/data/bert-base-cased-hash.txt b/morpheus/data/bert-base-cased-hash.txt similarity index 100% rename from data/bert-base-cased-hash.txt rename to morpheus/data/bert-base-cased-hash.txt diff --git a/data/bert-base-uncased-hash.txt b/morpheus/data/bert-base-uncased-hash.txt similarity index 100% rename from data/bert-base-uncased-hash.txt rename to morpheus/data/bert-base-uncased-hash.txt diff --git a/data/columns_ae.txt b/morpheus/data/columns_ae.txt similarity index 100% rename from data/columns_ae.txt rename to morpheus/data/columns_ae.txt diff --git a/data/columns_fil.txt b/morpheus/data/columns_fil.txt similarity index 100% rename from data/columns_fil.txt rename to morpheus/data/columns_fil.txt diff --git a/data/email.jsonlines b/morpheus/data/email.jsonlines similarity index 100% rename from data/email.jsonlines rename to morpheus/data/email.jsonlines diff --git a/data/labels_ae.txt b/morpheus/data/labels_ae.txt similarity index 100% rename from data/labels_ae.txt rename to morpheus/data/labels_ae.txt diff --git a/data/labels_nlp.txt b/morpheus/data/labels_nlp.txt similarity index 100% rename from data/labels_nlp.txt rename to morpheus/data/labels_nlp.txt diff --git a/data/labels_phishing.txt b/morpheus/data/labels_phishing.txt similarity index 100% rename from data/labels_phishing.txt rename to morpheus/data/labels_phishing.txt diff --git a/data/nvsmi.jsonlines b/morpheus/data/nvsmi.jsonlines similarity index 100% rename from data/nvsmi.jsonlines rename to morpheus/data/nvsmi.jsonlines diff --git a/data/pcap_dump.jsonlines b/morpheus/data/pcap_dump.jsonlines similarity index 100% rename from data/pcap_dump.jsonlines rename to morpheus/data/pcap_dump.jsonlines diff --git a/data/sid_training_data_truth.csv b/morpheus/data/sid_training_data_truth.csv similarity index 100% rename from data/sid_training_data_truth.csv rename to morpheus/data/sid_training_data_truth.csv diff --git a/setup.py b/setup.py index 61f9d9eb2d..f339083d94 100644 --- a/setup.py +++ b/setup.py @@ -39,9 +39,6 @@ author="NVIDIA Corporation", include_package_data=True, packages=find_packages(include=["morpheus", "morpheus.*"], exclude=['tests']), - package_data={ - "morpheus": ["*.so", "**/*.so", "py.typed", "*.pyi", "**/*.pyi", "**/**/*.pyi"], - }, install_requires=[ "click>=8", "datacompy", diff --git a/tests/test_cli.py b/tests/test_cli.py index a16812240f..718b167485 100755 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -122,6 +122,13 @@ def mlflow_uri(tmp_path): @pytest.mark.use_python class TestCLI: + def _read_data_file(self, data_file): + """ + Used to read in labels and columns files + """ + with open(data_file) as fh: + return [line.strip() for line in fh] + def test_help(self): runner = CliRunner() result = runner.invoke(cli.cli, ['--help']) @@ -146,6 +153,7 @@ def test_autocomplete(self, tmp_path): env={'HOME': str(tmp_path)}) assert result.exit_code == 0, result.output + @pytest.mark.usefixtures("chdir_tmpdir") @pytest.mark.replace_callback('pipeline_ae') def test_pipeline_ae(self, config, callback_values): """ @@ -189,6 +197,9 @@ def test_pipeline_ae(self, config, callback_values): config.ae.userid_column_name = "user_col" config.ae.userid_filter = "user321" + expected_columns = self._read_data_file(os.path.join(TEST_DIRS.data_dir, 'columns_ae.txt')) + assert config.ae.feature_columns == expected_columns + pipe = callback_values['pipe'] assert pipe is not None @@ -329,6 +340,7 @@ def test_pipeline_ae_all(self, config, callback_values, tmp_path): assert to_kafka._kafka_conf['bootstrap.servers'] == 'kserv1:123,kserv2:321' assert to_kafka._output_topic == 'test_topic' + @pytest.mark.usefixtures("chdir_tmpdir") @pytest.mark.replace_callback('pipeline_fil') def test_pipeline_fil(self, config, callback_values, tmp_path): """ @@ -347,6 +359,9 @@ def test_pipeline_fil(self, config, callback_values, tmp_path): assert config.mode == PipelineModes.FIL assert config.class_labels == ["mining"] + expected_columns = self._read_data_file(os.path.join(TEST_DIRS.data_dir, 'columns_fil.txt')) + assert config.fil.feature_columns == expected_columns + assert config.ae is None pipe = callback_values['pipe'] @@ -516,7 +531,7 @@ def test_pipeline_fil_all(self, config, callback_values, tmp_path, mlflow_uri): assert to_kafka._output_topic == 'test_topic' @pytest.mark.replace_callback('pipeline_nlp') - def test_pipeline_nlp(selff, config, callback_values, tmp_path): + def test_pipeline_nlp(self, config, callback_values, tmp_path): """ Build a pipeline roughly ressembles the phishing validation script """ @@ -745,3 +760,33 @@ def test_pipeline_alias(self, config, callback_values, tmp_path): config = obj["config"] # Ensure our config is populated correctly assert config.mode == PipelineModes.NLP + + @pytest.mark.usefixtures("chdir_tmpdir") + @pytest.mark.replace_callback('pipeline_nlp') + def test_pipeline_nlp_relative_paths(self, config, callback_values, tmp_path): + """ + Ensure that the default paths in the nlp pipeline are valid when run from outside the morpheus repo + """ + + vocab_file_name = os.path.join(TEST_DIRS.data_dir, 'bert-base-cased-hash.txt') + args = (GENERAL_ARGS + ['pipeline-nlp'] + FILE_SRC_ARGS + [ + 'deserialize', + 'preprocess', + ] + INF_TRITON_ARGS + MONITOR_ARGS + ['add-class'] + VALIDATE_ARGS + ['serialize'] + TO_FILE_ARGS) + + obj = {} + runner = CliRunner() + result = runner.invoke(cli.cli, args, obj=obj) + assert result.exit_code == 47, result.output + + expected_labels = self._read_data_file(os.path.join(TEST_DIRS.data_dir, 'labels_nlp.txt')) + + # Ensure our config is populated correctly + config = obj["config"] + assert config.class_labels == expected_labels + + stages = callback_values['stages'] + # Verify the stages are as we expect them, if there is a size-mismatch python will raise a Value error + [file_source, deserialize, process_nlp, triton_inf, monitor, add_class, validation, serialize, to_file] = stages + + assert process_nlp._vocab_hash_file == vocab_file_name diff --git a/tests/utils.py b/tests/utils.py index 1f770e57cd..188c9acedb 100755 --- a/tests/utils.py +++ b/tests/utils.py @@ -17,6 +17,7 @@ import json import os +import morpheus from morpheus._lib.file_types import FileTypes from morpheus.config import Config from morpheus.io.deserializers import read_file_to_df @@ -32,7 +33,7 @@ class TestDirectories(object): def __init__(self, cur_file=__file__) -> None: self.tests_dir = os.path.dirname(cur_file) self.morpheus_root = os.environ.get('MORPHEUS_ROOT', os.path.dirname(self.tests_dir)) - self.data_dir = os.path.join(self.morpheus_root, 'data') + self.data_dir = morpheus.DATA_DIR self.models_dir = os.path.join(self.morpheus_root, 'models') self.datasets_dir = os.path.join(self.models_dir, 'datasets') self.training_data_dir = os.path.join(self.datasets_dir, 'training-data') From 2710f93d2b15427b61695e87bb2b4dcc3dce4586 Mon Sep 17 00:00:00 2001 From: Pete MacKinnon Date: Fri, 27 May 2022 19:26:32 -0400 Subject: [PATCH 29/73] Add script to capture triton config (#116) Utility script to render a "starter" Triton config from onnx, tf or trt "bare" models. Mix of bash, jq, sed, and awk. Over time could be replaced by python with proper json and protobuf libraries. Best effort attempt to preserve gpu, cpu accelerator and optional parameters fields if the model in fact has its own config.pbtxt. From the help: ``` This script retrieves a computed model configuration from NVIDIA Triton. The Triton Inference Server can be launched with "--strict-model-config=false" which means it will create a minimal Triton configuration (config.pbtxt) from the required elements of a model if one has not been provided. This only applies to TensorRT, TensorFlow saved-model, and ONNX models. Once the initial configuration file is derived, it is expected that optional and advanced settings will be applied by hand. By default, the script will take the JSON output from Triton and reformat it to stdout for usage as a new configuration (i.e., save stdout to config.pbtxt). Developed and tested with the 22.04 release of Triton using Morpheus ONNX and FIL sample models only. For more information on Triton model configuration, please refer to the online docs: https://github.com/triton-inference-server/server/blob/main/docs/model_configuration.md https://github.com/triton-inference-server/common/blob/main/protobuf/model_config.proto This script is intended for initial bootstrapping of a basic Triton model configuration. Consult the Triton Model Navigator for advanced model optimization tooling. https://github.com/triton-inference-server/model_navigator/blob/main/docs/optimize_for_triton.md ``` Authors: - Pete MacKinnon (https://github.com/pdmack) Approvers: - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/116 --- scripts/get-triton-config.sh | 241 +++++++++++++++++++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100755 scripts/get-triton-config.sh diff --git a/scripts/get-triton-config.sh b/scripts/get-triton-config.sh new file mode 100755 index 0000000000..4143809e8d --- /dev/null +++ b/scripts/get-triton-config.sh @@ -0,0 +1,241 @@ +#!/bin/bash +# SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -Eeuo pipefail +trap cleanup SIGINT SIGTERM ERR EXIT + +script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P) + +usage() { + cat < + +This script retrieves a computed model configuration from NVIDIA Triton. The Triton +Inference Server can be launched with "--strict-model-config=false" which means it +will create a minimal Triton configuration (config.pbtxt) from the required +elements of a model if one has not been provided. + +This only applies to TensorRT, TensorFlow saved-model, and ONNX models. Once the +initial configuration file is derived, it is expected that optional and advanced +settings will be applied by hand. + +By default, the script will take the JSON output from Triton and reformat it +to stdout for usage as a new configuration (i.e., save stdout to config.pbtxt). + +Developed and tested with the 22.04 release of Triton using Morpheus ONNX and FIL +sample models only. + +For more information on Triton model configuration, please refer to the online docs: +https://github.com/triton-inference-server/server/blob/main/docs/model_configuration.md +https://github.com/triton-inference-server/common/blob/main/protobuf/model_config.proto + +This script is intended for initial bootstrapping of a basic Triton model configuration. +Consult the Triton Model Navigator for advanced model optimization tooling. +https://github.com/triton-inference-server/model_navigator/blob/main/docs/optimize_for_triton.md + +Available options: + +-h, --help Print this help and exit +-v, --verbose Print debug info +-j, --json Render the config directly in JSON without reformatting; + useful for advanced jq manipulations +-t, --host Triton hostname or service endpoint name (default: localhost) +-p, --port Triton REST API port (default: 8000) +EOF + exit +} + +cleanup() { + trap - SIGINT SIGTERM ERR EXIT + # script cleanup here +} + +setup_colors() { + if [[ -t 2 ]] && [[ -z "${NO_COLOR-}" ]] && [[ "${TERM-}" != "dumb" ]]; then + NOFORMAT='\033[0m' RED='\033[0;31m' GREEN='\033[0;32m' ORANGE='\033[0;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' YELLOW='\033[1;33m' + else + NOFORMAT='' RED='' GREEN='' ORANGE='' BLUE='' PURPLE='' CYAN='' YELLOW='' + fi +} + +msg() { + echo >&2 -e "${1-}" +} + +die() { + local msg=$1 + local code=${2-1} # default exit status 1 + msg "$msg" + exit "$code" +} + +parse_params() { + json=0 + model='' + host='localhost' + port='8000' + + while :; do + case "${1-}" in + -h | --help) usage ;; + -v | --verbose) set -x ;; + --no-color) NO_COLOR=1 ;; + -j | --json) json=true ;; + -t | --host) shift + host="$1" + ;; + -p | --port) shift + port="$1" + ;; + -?*) die "Unknown option: $1" ;; + *) break ;; + esac + shift + done + + model=("$@") + + # check required params and arguments + [[ ${#model[@]} -eq 0 ]] && die "Missing model argument" + + return 0 +} + +parse_params "$@" +setup_colors + +which curl &>/dev/null || die "Please install curl" +which jq &>/dev/null || die "Please install jq" + +# TODO: it may be possible to have one function to reformat +# both types of accelerators but it gets messy + +# GPU accelerator parameters have a specific encoding +reformat_gpu_accelerator() { + read jstream + if echo $jstream | jq --exit-status -r '.optimization.execution_accelerators.gpu_execution_accelerator[]?.parameters? | keys[0]!=""' > /dev/null; then + echo " gpu_execution_accelerator : [ {" + NAME=$(echo $jstream | jq -r '.optimization.execution_accelerators.gpu_execution_accelerator[]?.name') + echo " name: \"${NAME}\" " + echo $jstream | jq -r \ + '.optimization.execution_accelerators.gpu_execution_accelerator[]?.parameters | to_entries[] | .key as $k | .value as $v | "\($k) \($v)"' | \ + awk '{ printf " parameters { key: \"%s\" value: \"%s\" }\n", $1, $2 }' + echo " } ]" + fi +} + +# should be just the name like 'openvino' and no parameters +reformat_cpu_accelerator() { + read jstream + if echo $jstream | jq --exit-status -r '.optimization.execution_accelerators.cpu_execution_accelerator[]?.name?!=""' > /dev/null; then + echo " cpu_execution_accelerator : [ {" + echo $jstream | jq -r \ + '.optimization.execution_accelerators.cpu_execution_accelerator[]?.name | values as $v | "\($v)"' | \ + awk '{ printf " { name: \"%s\" },\n", $1 }' + echo " } ]" + fi +} + +# optional parameters are freeform and encoded +# differently than accelerator parameters +reformat_optional() { + read jstream + if echo $jstream | jq --exit-status -r '.parameters? | keys[0]!=""' > /dev/null; then + echo $jstream | jq -r \ + '.parameters? | to_entries[] | .key as $k | .value as $v | "\($k) \($v)"' | \ + sed -E 's/\"(string_value)\"/\1/' | \ + awk '{ printf " { key: \"%s\" value: %s },\n", $1, $2 }' + fi +} + +chop_outer_braces() { + sed -E '1d;$d' +} + +left_indent() { + sed -E 's/^ //' +} + +unquote_keys() { + sed -E 's/(^ *)"([^"]*)":/\1\2:/' +} + +unquote_types() { + sed -E 's/: "([A-Z0-9_]+)"/: \1/' +} + +delete_empty() { + jq -r 'del(..|select(. == ""))' +} + +delete_optional() { + jq -r 'del(.parameters?)' +} + +delete_accelerators() { + jq -r 'del(.optimization.execution_accelerators[]?)' +} + +# try to retrieve the model config and die if model doesn't exist, etc. +RAW=$(mktemp) +HTTP_CODE=$(curl -sS --output ${RAW} --write-out "%{http_code}" ${host}:${port}/v2/models/${model}/config) +[[ ${HTTP_CODE} -lt 200 || ${HTTP_CODE} -gt 399 ]] && cat ${RAW} && rm ${RAW} && die "\nBad response" + +if [ "$json" = true ]; then + cat "${RAW}" | jq -r . +else + PARAMS_GPU=$(cat ${RAW} | reformat_gpu_accelerator) + PARAMS_CPU=$(cat ${RAW} | reformat_cpu_accelerator) + PARAMS_OPT=$(cat ${RAW} | reformat_optional) + # hack to tidy up last comma from jq transform + PARAMS_OPT=$(echo "${PARAMS_OPT}" | sed '$s/,$//') + STAGE_ZERO=$(cat ${RAW} | delete_empty) + STAGE_ONE=$(echo ${STAGE_ZERO} | delete_optional) + STAGE_TWO=$(echo ${STAGE_ONE} | delete_accelerators) + + # done with jq editing + STAGE_THREE=$(echo ${STAGE_TWO} | jq -r . | chop_outer_braces | left_indent | unquote_keys | unquote_types) + + # after this point, we need to insert our pb text without jq + # note the use of double-quotes for linefeeds + if [[ ${PARAMS_GPU} || ${PARAMS_CPU} ]]; then + STAGE_FOUR=$(echo "${STAGE_THREE}" | sed -E '/execution_accelerators/q' | sed -E '$d') + STAGE_FIVE=$(echo "${STAGE_THREE}" | sed -n '/execution_accelerators/,$ p' | sed -E '1d') + STAGE_LAST="${STAGE_FOUR}"$'\n execution_accelerators {' + + # lay down each layer of the split and reformatted config + if [[ ${PARAMS_GPU} ]]; then + STAGE_LAST="${STAGE_LAST}"$'\n'"${PARAMS_GPU}" + fi + if [[ ${PARAMS_CPU} ]]; then + # insert comma if needed + [[ ${PARAMS_GPU} ]] && STAGE_LAST="${STAGE_LAST}"',' + STAGE_LAST="${STAGE_LAST}"$'\n'"${PARAMS_CPU}" + fi + # done with accelerators + STAGE_LAST="${STAGE_LAST}"$'\n'' },'$'\n'"${STAGE_FIVE}" + else + # no accelerators, pivot back to stage 3 + STAGE_LAST="${STAGE_THREE}" + fi + if [[ ${PARAMS_OPT} ]]; then + STAGE_LAST="${STAGE_LAST}"','$'\n''parameters ['"${PARAMS_OPT}"' ]' + fi + echo "${STAGE_LAST}" +fi + +# cleanup +rm ${RAW} From 81bb6d15c20395aef676db04706b81d0af1e3213 Mon Sep 17 00:00:00 2001 From: David Gardner <96306125+dagardner-nv@users.noreply.github.com> Date: Fri, 27 May 2022 16:30:58 -0700 Subject: [PATCH 30/73] Set Python3_FIND_STRATEGY=Location (#131) To cover situations where the version of the Python interpreter provided by the OS is newer than the one in the Conda env. Fixes #75 Authors: - David Gardner (https://github.com/dagardner-nv) Approvers: - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/131 --- morpheus/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/morpheus/CMakeLists.txt b/morpheus/CMakeLists.txt index df994c670f..00a6184551 100644 --- a/morpheus/CMakeLists.txt +++ b/morpheus/CMakeLists.txt @@ -19,6 +19,7 @@ option(MORPHEUS_PYTHON_INPLACE_BUILD "Whether or not to copy built python modules back to the source tree for debug purposes." OFF) set(Python3_FIND_VIRTUALENV "FIRST") +set(Python3_FIND_STRATEGY "LOCATION") find_package(Python3 REQUIRED COMPONENTS Development Interpreter NumPy) # Check if SKlearn is installed From fd24e3ec6269117868f2bbbc1288d896d1ac831b Mon Sep 17 00:00:00 2001 From: David Gardner <96306125+dagardner-nv@users.noreply.github.com> Date: Tue, 31 May 2022 13:24:25 -0700 Subject: [PATCH 31/73] Migrate Neo's tensor code directly into Morpheus (#129) Copy Neo Tensor code into morpheus. Most of the changes are of the find/replace variety, however Vscode applied some formatting changes automatically. * New code went into cuda_utils.so to avoid creating a circular dependency. * `type_utils.hpp` became `type_util_detail.hpp` as morpheus already had a `type_util.hpp` which built on top of Neo's `type_utils.hpp`. * `NeoTensorObjectInterfaceProxy` is now just `TensorObjectInterfaceProxy` ``` neo/include/neo/core/tensor.hpp -> morpheus/_lib/include/morpheus/objects/tensor_object.hpp neo/src/public/core/tensor.cpp -> morpheus/_lib/src/objects/tensor_object.cpp neo/include/neo/core/tensor_utils.hpp -> morpheus/_lib/include/morpheus/utilities/tensor_util.hpp neo/src/public/core/tensor_utils.cpp -> morpheus/_lib/src/utilities/tensor_util.cpp neo/include/neo/utils/type_utils.hpp -> morpheus/_lib/include/morpheus/utilities/type_util_detail.hpp neo/src/public/utils/type_utils.cpp -> morpheus/_lib/src/utilities/type_util_detail.cpp neo/tests/test_cuda.cu -> morpheus/_lib/tests/test_cuda.cu neo/tests/test_tensor.cpp -> morpheus/_lib/tests/test_tensor.cpp neo/tests/test_type_utils.cpp -> morpheus/_lib/tests/test_type_util_detail.cpp ``` Closes #128 Authors: - David Gardner (https://github.com/dagardner-nv) Approvers: - Michael Demoret (https://github.com/mdemoret-nv) - Devin Robison (https://github.com/drobison00) URL: https://github.com/nv-morpheus/Morpheus/pull/129 --- CMakeLists.txt | 6 + morpheus/_lib/CMakeLists.txt | 4 + .../_lib/cmake/libraries/cuda_utils.cmake | 3 + morpheus/_lib/cmake/libraries/morpheus.cmake | 2 +- .../messages/memory/inference_memory.hpp | 49 +- .../messages/memory/inference_memory_fil.hpp | 145 ++-- .../messages/memory/inference_memory_nlp.hpp | 178 ++-- .../messages/memory/response_memory.hpp | 52 +- .../messages/memory/response_memory_probs.hpp | 79 +- .../_lib/include/morpheus/messages/multi.hpp | 251 +++--- .../morpheus/messages/multi_inference.hpp | 167 ++-- .../morpheus/messages/multi_inference_fil.hpp | 115 +-- .../morpheus/messages/multi_inference_nlp.hpp | 181 ++-- .../morpheus/messages/multi_response.hpp | 164 ++-- .../messages/multi_response_probs.hpp | 119 +-- .../include/morpheus/objects/dev_mem_info.hpp | 43 +- .../include/morpheus/objects/rmm_tensor.hpp | 244 +++--- .../include/morpheus/objects/table_info.hpp | 9 +- .../_lib/include/morpheus/objects/tensor.hpp | 96 +-- .../morpheus/objects/tensor_object.hpp | 771 ++++++++++++++++++ ..._wrapped_tensor.hpp => wrapped_tensor.hpp} | 28 +- .../include/morpheus/utilities/cupy_util.hpp | 45 +- .../include/morpheus/utilities/matx_util.hpp | 76 +- .../morpheus/utilities/tensor_util.hpp | 82 ++ .../include/morpheus/utilities/type_util.hpp | 55 +- .../morpheus/utilities/type_util_detail.hpp | 163 ++++ .../messages/memory/inference_memory_fil.cpp | 139 ++-- .../messages/memory/inference_memory_nlp.cpp | 181 ++-- .../src/messages/memory/response_memory.cpp | 51 +- .../messages/memory/response_memory_probs.cpp | 74 +- morpheus/_lib/src/messages/multi.cpp | 10 +- .../_lib/src/messages/multi_inference.cpp | 186 +++-- .../_lib/src/messages/multi_inference_fil.cpp | 123 +-- .../_lib/src/messages/multi_inference_nlp.cpp | 174 ++-- morpheus/_lib/src/messages/multi_response.cpp | 166 ++-- .../src/messages/multi_response_probs.cpp | 97 ++- .../_lib/src/objects/neo_wrapped_tensor.cpp | 80 -- morpheus/_lib/src/objects/rmm_tensor.cpp | 239 +++--- morpheus/_lib/src/objects/table_info.cpp | 234 +++--- morpheus/_lib/src/objects/tensor.cpp | 79 +- morpheus/_lib/src/objects/tensor_object.cpp | 110 +++ morpheus/_lib/src/objects/wrapped_tensor.cpp | 85 ++ morpheus/_lib/src/python_modules/common.cpp | 47 +- .../_lib/src/stages/add_classification.cpp | 201 ++--- morpheus/_lib/src/stages/add_scores.cpp | 173 ++-- morpheus/_lib/src/stages/filter_detection.cpp | 175 ++-- morpheus/_lib/src/stages/preprocess_fil.cpp | 28 +- morpheus/_lib/src/stages/preprocess_nlp.cpp | 235 +++--- morpheus/_lib/src/stages/triton_inference.cpp | 553 +++++++------ morpheus/_lib/src/utilities/cupy_util.cpp | 129 +-- morpheus/_lib/src/utilities/matx_util.cu | 20 +- morpheus/_lib/src/utilities/tensor_util.cpp | 90 ++ morpheus/_lib/src/utilities/type_util.cu | 102 +-- .../_lib/src/utilities/type_util_detail.cpp | 158 ++++ morpheus/_lib/tests/CMakeLists.txt | 40 + morpheus/_lib/tests/test_cuda.cu | 160 ++++ morpheus/_lib/tests/test_main.cpp | 31 + morpheus/_lib/tests/test_morpheus.hpp | 25 + morpheus/_lib/tests/test_tensor.cpp | 60 ++ morpheus/_lib/tests/test_type_util_detail.cpp | 55 ++ 60 files changed, 4710 insertions(+), 2727 deletions(-) create mode 100644 morpheus/_lib/include/morpheus/objects/tensor_object.hpp rename morpheus/_lib/include/morpheus/objects/{neo_wrapped_tensor.hpp => wrapped_tensor.hpp} (61%) create mode 100644 morpheus/_lib/include/morpheus/utilities/tensor_util.hpp create mode 100644 morpheus/_lib/include/morpheus/utilities/type_util_detail.hpp delete mode 100644 morpheus/_lib/src/objects/neo_wrapped_tensor.cpp create mode 100644 morpheus/_lib/src/objects/tensor_object.cpp create mode 100644 morpheus/_lib/src/objects/wrapped_tensor.cpp create mode 100644 morpheus/_lib/src/utilities/tensor_util.cpp create mode 100644 morpheus/_lib/src/utilities/type_util_detail.cpp create mode 100644 morpheus/_lib/tests/CMakeLists.txt create mode 100644 morpheus/_lib/tests/test_cuda.cu create mode 100644 morpheus/_lib/tests/test_main.cpp create mode 100644 morpheus/_lib/tests/test_morpheus.hpp create mode 100644 morpheus/_lib/tests/test_tensor.cpp create mode 100644 morpheus/_lib/tests/test_type_util_detail.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 847ada9307..43f79d387b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,6 +71,12 @@ include(cmake/dependencies.cmake) # - Post dependencies setup -------- include(cmake/setup_compiler.cmake) +# To make it easier for CI to find output files, set the default executable suffix to .x if not set +if("${CMAKE_EXECUTABLE_SUFFIX}" STREQUAL "") + set(CMAKE_EXECUTABLE_SUFFIX ".x") +endif() + + ################################## ##### Morpheus Python Setup ###### ################################## diff --git a/morpheus/_lib/CMakeLists.txt b/morpheus/_lib/CMakeLists.txt index 6694d152cc..a8ce133c79 100644 --- a/morpheus/_lib/CMakeLists.txt +++ b/morpheus/_lib/CMakeLists.txt @@ -54,4 +54,8 @@ include(cmake/python_modules/common.cmake) #----------morpheus._lib.file_types--------- include(cmake/python_modules/file_types.cmake) +if (MORPHEUS_BUILD_TESTS) + add_subdirectory(tests) +endif() + list(POP_BACK CMAKE_MESSAGE_CONTEXT) diff --git a/morpheus/_lib/cmake/libraries/cuda_utils.cmake b/morpheus/_lib/cmake/libraries/cuda_utils.cmake index 4c36db3b03..71a9e1e0bb 100644 --- a/morpheus/_lib/cmake/libraries/cuda_utils.cmake +++ b/morpheus/_lib/cmake/libraries/cuda_utils.cmake @@ -16,7 +16,10 @@ add_library(cuda_utils SHARED ${MORPHEUS_LIB_ROOT}/src/objects/dev_mem_info.cpp ${MORPHEUS_LIB_ROOT}/src/objects/table_info.cpp + ${MORPHEUS_LIB_ROOT}/src/objects/tensor_object.cpp ${MORPHEUS_LIB_ROOT}/src/utilities/matx_util.cu + ${MORPHEUS_LIB_ROOT}/src/utilities/tensor_util.cpp + ${MORPHEUS_LIB_ROOT}/src/utilities/type_util_detail.cpp ${MORPHEUS_LIB_ROOT}/src/utilities/type_util.cu ) diff --git a/morpheus/_lib/cmake/libraries/morpheus.cmake b/morpheus/_lib/cmake/libraries/morpheus.cmake index 26cd106628..92c92b0dbe 100644 --- a/morpheus/_lib/cmake/libraries/morpheus.cmake +++ b/morpheus/_lib/cmake/libraries/morpheus.cmake @@ -31,7 +31,7 @@ add_library(morpheus ${MORPHEUS_LIB_ROOT}/src/messages/multi_response_probs.cpp ${MORPHEUS_LIB_ROOT}/src/objects/fiber_queue.cpp ${MORPHEUS_LIB_ROOT}/src/objects/file_types.cpp - ${MORPHEUS_LIB_ROOT}/src/objects/neo_wrapped_tensor.cpp + ${MORPHEUS_LIB_ROOT}/src/objects/wrapped_tensor.cpp ${MORPHEUS_LIB_ROOT}/src/objects/python_data_table.cpp ${MORPHEUS_LIB_ROOT}/src/objects/rmm_tensor.cpp ${MORPHEUS_LIB_ROOT}/src/objects/table_info.cpp diff --git a/morpheus/_lib/include/morpheus/messages/memory/inference_memory.hpp b/morpheus/_lib/include/morpheus/messages/memory/inference_memory.hpp index 6e04694375..c1be524e73 100644 --- a/morpheus/_lib/include/morpheus/messages/memory/inference_memory.hpp +++ b/morpheus/_lib/include/morpheus/messages/memory/inference_memory.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,8 +18,7 @@ #pragma once #include - -#include +#include #include #include @@ -27,32 +26,34 @@ namespace morpheus { +/** + * TODO(Documentation) + */ +class InferenceMemory +{ + public: + InferenceMemory(size_t count); + + std::size_t count{0}; + std::map inputs; + /** * TODO(Documentation) */ - class InferenceMemory { - public: - InferenceMemory(size_t count); + bool has_input(const std::string& name) const; +}; - std::size_t count{0}; - std::map inputs; - - /** - * TODO(Documentation) - */ - bool has_input(const std::string &name) const; - }; - - /****** InferenceMemoryInterfaceProxy *************************/ +/****** InferenceMemoryInterfaceProxy *************************/ #pragma GCC visibility push(default) +/** + * @brief Interface proxy, used to insulate python bindings. + */ +struct InferenceMemoryInterfaceProxy +{ /** - * @brief Interface proxy, used to insulate python bindings. + * TODO(Documentation) */ - struct InferenceMemoryInterfaceProxy { - /** - * TODO(Documentation) - */ - static std::size_t get_count(InferenceMemory& self); - }; + static std::size_t get_count(InferenceMemory& self); +}; #pragma GCC visibility pop -} \ No newline at end of file +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/messages/memory/inference_memory_fil.hpp b/morpheus/_lib/include/morpheus/messages/memory/inference_memory_fil.hpp index adefafc8b3..c7cf6f3833 100644 --- a/morpheus/_lib/include/morpheus/messages/memory/inference_memory_fil.hpp +++ b/morpheus/_lib/include/morpheus/messages/memory/inference_memory_fil.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,9 +17,10 @@ #pragma once -#include -#include #include +#include +#include +#include #include @@ -30,76 +31,78 @@ #include #include - namespace morpheus { - /****** Component public implementations *******************/ - /****** InferenceMemoryFIL****************************************/ - class InferenceMemoryFIL : public InferenceMemory { - public: - InferenceMemoryFIL(size_t count, neo::TensorObject input__0, neo::TensorObject seq_ids); - - /** - * TODO(Documentation) - */ - const neo::TensorObject &get_input__0() const; - - /** - * TODO(Documentation) - */ - const neo::TensorObject &get_seq_ids() const; - - /** - * TODO(Documentation) - */ - void set_input__0(neo::TensorObject input_ids); - - /** - * TODO(Documentation) - */ - void set_seq_ids(neo::TensorObject input_mask); - }; - - /****** InferenceMemoryFILInterfaceProxy *************************/ +/****** Component public implementations *******************/ +/****** InferenceMemoryFIL****************************************/ +class InferenceMemoryFIL : public InferenceMemory +{ + public: + InferenceMemoryFIL(size_t count, TensorObject input__0, TensorObject seq_ids); + + /** + * TODO(Documentation) + */ + const TensorObject& get_input__0() const; + + /** + * TODO(Documentation) + */ + const TensorObject& get_seq_ids() const; + + /** + * TODO(Documentation) + */ + void set_input__0(TensorObject input_ids); + + /** + * TODO(Documentation) + */ + void set_seq_ids(TensorObject input_mask); +}; + +/****** InferenceMemoryFILInterfaceProxy *************************/ #pragma GCC visibility push(default) +/** + * @brief Interface proxy, used to insulate python bindings. + */ +struct InferenceMemoryFILInterfaceProxy +{ + /** + * @brief Create and initialize an InferenceMemoryFIL object, and return a shared pointer to the result. + */ + static std::shared_ptr init(cudf::size_type count, + pybind11::object input__0, + pybind11::object seq_ids); + + /** + * TODO(Documentation) + */ + static std::size_t count(InferenceMemoryFIL& self); + + /** + * TODO(Documentation) + */ + static TensorObject get_tensor(InferenceMemoryFIL& self, const std::string& name); + + /** + * TODO(Documentation) + */ + static pybind11::object get_input__0(InferenceMemoryFIL& self); + + /** + * TODO(Documentation) + */ + static void set_input__0(InferenceMemoryFIL& self, pybind11::object cupy_values); + + /** + * TODO(Documentation) + */ + static pybind11::object get_seq_ids(InferenceMemoryFIL& self); + /** - * @brief Interface proxy, used to insulate python bindings. + * TODO(Documentation) */ - struct InferenceMemoryFILInterfaceProxy { - /** - * @brief Create and initialize an InferenceMemoryFIL object, and return a shared pointer to the result. - */ - static std::shared_ptr - init(cudf::size_type count, pybind11::object input__0, pybind11::object seq_ids); - - /** - * TODO(Documentation) - */ - static std::size_t count(InferenceMemoryFIL& self); - - /** - * TODO(Documentation) - */ - static neo::TensorObject get_tensor(InferenceMemoryFIL& self, const std::string& name); - - /** - * TODO(Documentation) - */ - static pybind11::object get_input__0(InferenceMemoryFIL& self); - - /** - * TODO(Documentation) - */ - static void set_input__0(InferenceMemoryFIL& self, pybind11::object cupy_values); - - /** - * TODO(Documentation) - */ - static pybind11::object get_seq_ids(InferenceMemoryFIL& self); - - /** - * TODO(Documentation) - */ - static void set_seq_ids(InferenceMemoryFIL& self, pybind11::object cupy_values); - }; + static void set_seq_ids(InferenceMemoryFIL& self, pybind11::object cupy_values); +}; #pragma GCC visibility pop -} +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/messages/memory/inference_memory_nlp.hpp b/morpheus/_lib/include/morpheus/messages/memory/inference_memory_nlp.hpp index 3d956767d5..282b0c2c91 100644 --- a/morpheus/_lib/include/morpheus/messages/memory/inference_memory_nlp.hpp +++ b/morpheus/_lib/include/morpheus/messages/memory/inference_memory_nlp.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,104 +19,104 @@ #include #include +#include #include -#include #include +#include namespace morpheus { - /****** Component public implementations *******************/ - /****** InferenceMemoryNLP**********************************/ +/****** Component public implementations *******************/ +/****** InferenceMemoryNLP**********************************/ +/** + * TODO(Documentation) + */ +class InferenceMemoryNLP : public InferenceMemory +{ + public: + InferenceMemoryNLP(std::size_t count, TensorObject input_ids, TensorObject input_mask, TensorObject seq_ids); + + /** + * TODO(Documentation) + */ + const TensorObject& get_input_ids() const; + + /** + * TODO(Documentation) + */ + const TensorObject& get_input_mask() const; + + /** + * TODO(Documentation) + */ + const TensorObject& get_seq_ids() const; + + /** + * TODO(Documentation) + */ + void set_input_ids(TensorObject input_ids); + /** * TODO(Documentation) */ - class InferenceMemoryNLP : public InferenceMemory { - public: - InferenceMemoryNLP(std::size_t count, - neo::TensorObject input_ids, - neo::TensorObject input_mask, - neo::TensorObject seq_ids); - - /** - * TODO(Documentation) - */ - const neo::TensorObject &get_input_ids() const; - - /** - * TODO(Documentation) - */ - const neo::TensorObject &get_input_mask() const; - - /** - * TODO(Documentation) - */ - const neo::TensorObject &get_seq_ids() const; - - /** - * TODO(Documentation) - */ - void set_input_ids(neo::TensorObject input_ids); - - /** - * TODO(Documentation) - */ - void set_input_mask(neo::TensorObject input_mask); - - /** - * TODO(Documentation) - */ - void set_seq_ids(neo::TensorObject seq_ids); - }; - - /****** InferenceMemoryNLPInterfaceProxy********************/ + void set_input_mask(TensorObject input_mask); + + /** + * TODO(Documentation) + */ + void set_seq_ids(TensorObject seq_ids); +}; + +/****** InferenceMemoryNLPInterfaceProxy********************/ #pragma GCC visibility push(default) +/** + * @brief Interface proxy, used to insulate python bindings. + */ +struct InferenceMemoryNLPInterfaceProxy +{ /** - * @brief Interface proxy, used to insulate python bindings. + * @brief Create and initialize an InferenceMemoryNLP object, and return a shared pointer to the result. + */ + static std::shared_ptr init(cudf::size_type count, + pybind11::object input_ids, + pybind11::object input_mask, + pybind11::object seq_ids); + + /** + * TODO(Documentation) + */ + static std::size_t count(InferenceMemoryNLP& self); + + /** + * TODO(Documentation) + */ + static pybind11::object get_input_ids(InferenceMemoryNLP& self); + + /** + * TODO(Documentation) + */ + static void set_input_ids(InferenceMemoryNLP& self, pybind11::object cupy_values); + + /** + * TODO(Documentation) + */ + static pybind11::object get_input_mask(InferenceMemoryNLP& self); + + /** + * TODO(Documentation) + */ + static void set_input_mask(InferenceMemoryNLP& self, pybind11::object cupy_values); + + /** + * TODO(Documentation) + */ + static pybind11::object get_seq_ids(InferenceMemoryNLP& self); + + /** + * TODO(Documentation) */ - struct InferenceMemoryNLPInterfaceProxy { - /** - * @brief Create and initialize an InferenceMemoryNLP object, and return a shared pointer to the result. - */ - static std::shared_ptr - init(cudf::size_type count, pybind11::object input_ids, pybind11::object input_mask, pybind11::object seq_ids); - - /** - * TODO(Documentation) - */ - static std::size_t count(InferenceMemoryNLP& self); - - /** - * TODO(Documentation) - */ - static pybind11::object get_input_ids(InferenceMemoryNLP& self); - - /** - * TODO(Documentation) - */ - static void set_input_ids(InferenceMemoryNLP& self, pybind11::object cupy_values); - - /** - * TODO(Documentation) - */ - static pybind11::object get_input_mask(InferenceMemoryNLP& self); - - - /** - * TODO(Documentation) - */ - static void set_input_mask(InferenceMemoryNLP& self, pybind11::object cupy_values); - - - /** - * TODO(Documentation) - */ - static pybind11::object get_seq_ids(InferenceMemoryNLP& self); - - /** - * TODO(Documentation) - */ - static void set_seq_ids(InferenceMemoryNLP& self, pybind11::object cupy_values); - }; + static void set_seq_ids(InferenceMemoryNLP& self, pybind11::object cupy_values); +}; #pragma GCC visibility pop -} \ No newline at end of file +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/messages/memory/response_memory.hpp b/morpheus/_lib/include/morpheus/messages/memory/response_memory.hpp index 20f03e6b63..f4736b7017 100644 --- a/morpheus/_lib/include/morpheus/messages/memory/response_memory.hpp +++ b/morpheus/_lib/include/morpheus/messages/memory/response_memory.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,40 +19,42 @@ #include -#include #include +#include #include #include namespace morpheus { - /****** Component public implementations *******************/ - /****** ResponseMemory****************************************/ +/****** Component public implementations *******************/ +/****** ResponseMemory****************************************/ +/** + * TODO(Documentation) + */ +class ResponseMemory +{ + public: + ResponseMemory(size_t count); + + size_t count{0}; + std::map outputs; + /** * TODO(Documentation) */ - class ResponseMemory { - public: - ResponseMemory(size_t count); + bool has_output(const std::string &name) const; +}; - size_t count{0}; - std::map outputs; - - /** - * TODO(Documentation) - */ - bool has_output(const std::string &name) const; - }; - - /****** ResponseMemoryInterfaceProxy *************************/ +/****** ResponseMemoryInterfaceProxy *************************/ #pragma GCC visibility push(default) - /** - * @brief Interface proxy, used to insulate python bindings. - */ - struct ResponseMemoryInterfaceProxy { - static pybind11::object get_output(ResponseMemory &self, const std::string &name); +/** + * @brief Interface proxy, used to insulate python bindings. + */ +struct ResponseMemoryInterfaceProxy +{ + static pybind11::object get_output(ResponseMemory &self, const std::string &name); - static neo::TensorObject get_output_tensor(ResponseMemory &self, const std::string &name); - }; + static TensorObject get_output_tensor(ResponseMemory &self, const std::string &name); +}; #pragma GCC visibility pop -} \ No newline at end of file +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/messages/memory/response_memory_probs.hpp b/morpheus/_lib/include/morpheus/messages/memory/response_memory_probs.hpp index b160e236d8..c726888695 100644 --- a/morpheus/_lib/include/morpheus/messages/memory/response_memory_probs.hpp +++ b/morpheus/_lib/include/morpheus/messages/memory/response_memory_probs.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,62 +19,65 @@ #include #include +#include #include #include #include +#include #include #include -#include namespace morpheus { - /****** Component public implementations *******************/ - /****** ResponseMemoryProbs*********************************/ +/****** Component public implementations *******************/ +/****** ResponseMemoryProbs*********************************/ +/** + * TODO(Documentation) + */ +class ResponseMemoryProbs : public ResponseMemory +{ + public: + ResponseMemoryProbs(size_t count, TensorObject probs); + /** * TODO(Documentation) */ - class ResponseMemoryProbs : public ResponseMemory { - public: - ResponseMemoryProbs(size_t count, neo::TensorObject probs); + const TensorObject &get_probs() const; - /** - * TODO(Documentation) - */ - const neo::TensorObject &get_probs() const; - - /** - * TODO(Documentation) - */ - void set_probs(neo::TensorObject probs); - }; + /** + * TODO(Documentation) + */ + void set_probs(TensorObject probs); +}; - /****** ResponseMemoryProbsInterfaceProxy*******************/ +/****** ResponseMemoryProbsInterfaceProxy*******************/ #pragma GCC visibility push(default) +/** + * @brief Interface proxy, used to insulate python bindings. + */ +struct ResponseMemoryProbsInterfaceProxy +{ /** - * @brief Interface proxy, used to insulate python bindings. + * @brief Create and initialize a ResponseMemoryProbs object, and return a shared pointer to the result. */ - struct ResponseMemoryProbsInterfaceProxy { - /** - * @brief Create and initialize a ResponseMemoryProbs object, and return a shared pointer to the result. - */ - static std::shared_ptr init(cudf::size_type count, pybind11::object probs); + static std::shared_ptr init(cudf::size_type count, pybind11::object probs); - /** - * TODO(Documentation) - */ - static std::size_t count(ResponseMemoryProbs &self); + /** + * TODO(Documentation) + */ + static std::size_t count(ResponseMemoryProbs &self); - /** - * TODO(Documentation) - */ - static pybind11::object get_probs(ResponseMemoryProbs &self); + /** + * TODO(Documentation) + */ + static pybind11::object get_probs(ResponseMemoryProbs &self); - /** - * TODO(Documentation) - */ - static void set_probs(ResponseMemoryProbs &self, pybind11::object cupy_values); - }; + /** + * TODO(Documentation) + */ + static void set_probs(ResponseMemoryProbs &self, pybind11::object cupy_values); +}; #pragma GCC visibility pop -} +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/messages/multi.hpp b/morpheus/_lib/include/morpheus/messages/multi.hpp index 4970edbccb..341aaad19d 100644 --- a/morpheus/_lib/include/morpheus/messages/multi.hpp +++ b/morpheus/_lib/include/morpheus/messages/multi.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -37,132 +38,134 @@ #include namespace morpheus { - /****** Component public implementations *******************/ - /****** MultiMessage****************************************/ +/****** Component public implementations *******************/ +/****** MultiMessage****************************************/ +/** + * TODO(Documentation) + */ +#pragma GCC visibility push(default) +class MultiMessage +{ + public: + MultiMessage(std::shared_ptr m, size_t o, size_t c); + + std::shared_ptr meta; + size_t mess_offset{0}; + size_t mess_count{0}; + /** * TODO(Documentation) */ -#pragma GCC visibility push(default) - class MultiMessage { - public: - MultiMessage(std::shared_ptr m, size_t o, size_t c); - - std::shared_ptr meta; - size_t mess_offset{0}; - size_t mess_count{0}; - - /** - * TODO(Documentation) - */ - TableInfo get_meta(); - - /** - * TODO(Documentation) - */ - TableInfo get_meta(const std::string &col_name); - - /** - * TODO(Documentation) - */ - TableInfo get_meta(const std::vector &column_names); - - /** - * TODO(Documentation) - */ - void set_meta(const std::string &col_name, neo::TensorObject tensor); - - /** - * TODO(Documentation) - */ - void set_meta(const std::vector &column_names, const std::vector &tensors); - - /** - * TODO(Documentation) - */ - std::shared_ptr get_slice(size_t start, size_t stop) const; - - protected: - // This internal function is used to allow virtual overriding while `get_slice` allows for hiding of base class. - // This allows users to avoid casting every class after calling get_slice but still supports calling `get_slice` - // from a base class. For example, the following all works: - // std::shared_ptr derived_message = std::make_shared(); - // - // // No cast is necessary here - // std::shared_ptr other_derived = derived_message->get_slice(0, 10); - // - // // Conversion to base class - // std::shared_ptr base_message = derived_message; - // - // // This also works - // std::shared_ptr other_base = base_message->get_slice(0, 10); - // - // These will be logically equivalent - // assert(std::dynamic_ptr_cast(other_base) == other_derived); - - /** - * TODO(Documentation) - */ - virtual std::shared_ptr internal_get_slice(size_t start, size_t stop) const; - }; - - /****** MultiMessageInterfaceProxy**************************/ - /** - * @brief Interface proxy, used to insulate python bindings. - */ - struct MultiMessageInterfaceProxy { - /** - * TODO(Documentation) - */ - static std::shared_ptr init(std::shared_ptr meta, - cudf::size_type mess_offset, - cudf::size_type mess_count); - - /** - * TODO(Documentation) - */ - static std::shared_ptr meta(const MultiMessage &self); - - /** - * TODO(Documentation) - */ - static std::size_t mess_offset(const MultiMessage &self); - - /** - * TODO(Documentation) - */ - static std::size_t mess_count(const MultiMessage &self); - - /** - * TODO(Documentation) - */ - static pybind11::object get_meta(MultiMessage &self); - - /** - * TODO(Documentation) - */ - static pybind11::object get_meta(MultiMessage &self, std::string col_name); - - /** - * TODO(Documentation) - */ - static pybind11::object get_meta(MultiMessage &self, std::vector columns); - - /** - * TODO(Documentation) - * @note I think this was a bug, we have two overloads with the same function signatures - */ - static pybind11::object get_meta_by_col(MultiMessage &self, pybind11::object columns); - - /** - * TODO(Documentation) - */ - static void set_meta(MultiMessage &self, pybind11::object columns, pybind11::object value); - - /** - * TODO(Documentation) - */ - static std::shared_ptr get_slice(MultiMessage &self, std::size_t start, std::size_t stop); - }; + TableInfo get_meta(); + + /** + * TODO(Documentation) + */ + TableInfo get_meta(const std::string &col_name); + + /** + * TODO(Documentation) + */ + TableInfo get_meta(const std::vector &column_names); + + /** + * TODO(Documentation) + */ + void set_meta(const std::string &col_name, TensorObject tensor); + + /** + * TODO(Documentation) + */ + void set_meta(const std::vector &column_names, const std::vector &tensors); + + /** + * TODO(Documentation) + */ + std::shared_ptr get_slice(size_t start, size_t stop) const; + + protected: + // This internal function is used to allow virtual overriding while `get_slice` allows for hiding of base class. + // This allows users to avoid casting every class after calling get_slice but still supports calling `get_slice` + // from a base class. For example, the following all works: + // std::shared_ptr derived_message = std::make_shared(); + // + // // No cast is necessary here + // std::shared_ptr other_derived = derived_message->get_slice(0, 10); + // + // // Conversion to base class + // std::shared_ptr base_message = derived_message; + // + // // This also works + // std::shared_ptr other_base = base_message->get_slice(0, 10); + // + // These will be logically equivalent + // assert(std::dynamic_ptr_cast(other_base) == other_derived); + + /** + * TODO(Documentation) + */ + virtual std::shared_ptr internal_get_slice(size_t start, size_t stop) const; +}; + +/****** MultiMessageInterfaceProxy**************************/ +/** + * @brief Interface proxy, used to insulate python bindings. + */ +struct MultiMessageInterfaceProxy +{ + /** + * TODO(Documentation) + */ + static std::shared_ptr init(std::shared_ptr meta, + cudf::size_type mess_offset, + cudf::size_type mess_count); + + /** + * TODO(Documentation) + */ + static std::shared_ptr meta(const MultiMessage &self); + + /** + * TODO(Documentation) + */ + static std::size_t mess_offset(const MultiMessage &self); + + /** + * TODO(Documentation) + */ + static std::size_t mess_count(const MultiMessage &self); + + /** + * TODO(Documentation) + */ + static pybind11::object get_meta(MultiMessage &self); + + /** + * TODO(Documentation) + */ + static pybind11::object get_meta(MultiMessage &self, std::string col_name); + + /** + * TODO(Documentation) + */ + static pybind11::object get_meta(MultiMessage &self, std::vector columns); + + /** + * TODO(Documentation) + * @note I think this was a bug, we have two overloads with the same function signatures + */ + static pybind11::object get_meta_by_col(MultiMessage &self, pybind11::object columns); + + /** + * TODO(Documentation) + */ + static void set_meta(MultiMessage &self, pybind11::object columns, pybind11::object value); + + /** + * TODO(Documentation) + */ + static std::shared_ptr get_slice(MultiMessage &self, std::size_t start, std::size_t stop); +}; #pragma GCC visibility pop } // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/messages/multi_inference.hpp b/morpheus/_lib/include/morpheus/messages/multi_inference.hpp index f4639eeff3..eee29f3108 100644 --- a/morpheus/_lib/include/morpheus/messages/multi_inference.hpp +++ b/morpheus/_lib/include/morpheus/messages/multi_inference.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,97 +21,100 @@ #include #include #include +#include -#include #include +#include +#include #include #include -#include - namespace morpheus { - /****** Component public implementations********************/ - /****** MultiInferenceMessage*******************************/ +/****** Component public implementations********************/ +/****** MultiInferenceMessage*******************************/ +/** + * TODO(Documentation) + */ +#pragma GCC visibility push(default) +class MultiInferenceMessage : public MultiMessage +{ + public: + MultiInferenceMessage(std::shared_ptr meta, + std::size_t mess_offset, + std::size_t mess_count, + std::shared_ptr memory, + std::size_t offset, + std::size_t count); + + std::shared_ptr memory; + std::size_t offset{0}; + std::size_t count{0}; + /** * TODO(Documentation) */ -#pragma GCC visibility push(default) - class MultiInferenceMessage : public MultiMessage { - public: - MultiInferenceMessage(std::shared_ptr meta, - std::size_t mess_offset, - std::size_t mess_count, - std::shared_ptr memory, - std::size_t offset, - std::size_t count); - - std::shared_ptr memory; - std::size_t offset{0}; - std::size_t count{0}; - - /** - * TODO(Documentation) - */ - const neo::TensorObject get_input(const std::string &name) const; - - /** - * TODO(Documentation) - */ - const void set_input(const std::string &name, const neo::TensorObject &value); - - /** - * TODO(Documentation) - */ - std::shared_ptr get_slice(std::size_t start, std::size_t stop) const; - - protected: - /** - * TODO(Documentation) - */ - std::shared_ptr internal_get_slice(std::size_t start, std::size_t stop) const override; - }; - - /****** MultiInferenceMessageInterfaceProxy****************/ + const TensorObject get_input(const std::string &name) const; + /** - * @brief Interface proxy, used to insulate python bindings. + * TODO(Documentation) + */ + const void set_input(const std::string &name, const TensorObject &value); + + /** + * TODO(Documentation) + */ + std::shared_ptr get_slice(std::size_t start, std::size_t stop) const; + + protected: + /** + * TODO(Documentation) + */ + std::shared_ptr internal_get_slice(std::size_t start, std::size_t stop) const override; +}; + +/****** MultiInferenceMessageInterfaceProxy****************/ +/** + * @brief Interface proxy, used to insulate python bindings. + */ +struct MultiInferenceMessageInterfaceProxy +{ + /** + * @brief Create and initialize a MultiInferenceMessage object, and return a shared pointer to the result. + */ + static std::shared_ptr init(std::shared_ptr meta, + cudf::size_type mess_offset, + cudf::size_type mess_count, + std::shared_ptr memory, + cudf::size_type offset, + cudf::size_type count); + + /** + * TODO(Documentation) + */ + static std::shared_ptr memory(MultiInferenceMessage &self); + + /** + * TODO(Documentation) + */ + static std::size_t offset(MultiInferenceMessage &self); + + /** + * TODO(Documentation) + */ + static std::size_t count(MultiInferenceMessage &self); + + /** + * TODO(Documentation) + */ + static pybind11::object get_input(MultiInferenceMessage &self, const std::string &name); + + /** + * TODO(Documentation) */ - struct MultiInferenceMessageInterfaceProxy { - /** - * @brief Create and initialize a MultiInferenceMessage object, and return a shared pointer to the result. - */ - static std::shared_ptr init(std::shared_ptr meta, - cudf::size_type mess_offset, - cudf::size_type mess_count, - std::shared_ptr memory, - cudf::size_type offset, - cudf::size_type count); - - /** - * TODO(Documentation) - */ - static std::shared_ptr memory(MultiInferenceMessage &self); - - /** - * TODO(Documentation) - */ - static std::size_t offset(MultiInferenceMessage &self); - - /** - * TODO(Documentation) - */ - static std::size_t count(MultiInferenceMessage &self); - - /** - * TODO(Documentation) - */ - static pybind11::object get_input(MultiInferenceMessage &self, const std::string &name); - - /** - * TODO(Documentation) - */ - static std::shared_ptr - get_slice(MultiInferenceMessage &self, std::size_t start, std::size_t stop); - }; + static std::shared_ptr get_slice(MultiInferenceMessage &self, + std::size_t start, + std::size_t stop); +}; #pragma GCC visibility pop -} +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/messages/multi_inference_fil.hpp b/morpheus/_lib/include/morpheus/messages/multi_inference_fil.hpp index 8f719314e5..7fe7507bbc 100644 --- a/morpheus/_lib/include/morpheus/messages/multi_inference_fil.hpp +++ b/morpheus/_lib/include/morpheus/messages/multi_inference_fil.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,6 +19,7 @@ #include #include +#include #include #include @@ -26,71 +27,73 @@ #include namespace morpheus { - /****** Component public implementations *******************/ - /****** MultiInferenceFILMessage****************************************/ +/****** Component public implementations *******************/ +/****** MultiInferenceFILMessage****************************************/ +/** + * TODO(Documentation) + */ +#pragma GCC visibility push(default) +class MultiInferenceFILMessage : public MultiInferenceMessage +{ + public: + MultiInferenceFILMessage(std::shared_ptr meta, + size_t mess_offset, + size_t mess_count, + std::shared_ptr memory, + size_t offset, + size_t count); + /** * TODO(Documentation) */ -#pragma GCC visibility push(default) - class MultiInferenceFILMessage : public MultiInferenceMessage { - public: - MultiInferenceFILMessage(std::shared_ptr meta, - size_t mess_offset, - size_t mess_count, - std::shared_ptr memory, - size_t offset, - size_t count); - - /** - * TODO(Documentation) - */ - const neo::TensorObject get_input__0() const; + const TensorObject get_input__0() const; - /** - * TODO(Documentation) - */ - void set_input__0(const neo::TensorObject &input__0); + /** + * TODO(Documentation) + */ + void set_input__0(const TensorObject& input__0); - /** - * TODO(Documentation) - */ - const neo::TensorObject get_seq_ids() const; + /** + * TODO(Documentation) + */ + const TensorObject get_seq_ids() const; - /** - * TODO(Documentation) - */ - void set_seq_ids(const neo::TensorObject &seq_ids); - }; + /** + * TODO(Documentation) + */ + void set_seq_ids(const TensorObject& seq_ids); +}; - /****** MultiInferenceFILMessageInterfaceProxy *************************/ +/****** MultiInferenceFILMessageInterfaceProxy *************************/ +/** + * @brief Interface proxy, used to insulate python bindings. + */ +struct MultiInferenceFILMessageInterfaceProxy +{ /** - * @brief Interface proxy, used to insulate python bindings. + * @brief Create and initialize a MultiInferenceFILMessage, and return a shared pointer to the result. */ - struct MultiInferenceFILMessageInterfaceProxy { - /** - * @brief Create and initialize a MultiInferenceFILMessage, and return a shared pointer to the result. - */ - static std::shared_ptr init(std::shared_ptr meta, - cudf::size_type mess_offset, - cudf::size_type mess_count, - std::shared_ptr memory, - cudf::size_type offset, - cudf::size_type count); + static std::shared_ptr init(std::shared_ptr meta, + cudf::size_type mess_offset, + cudf::size_type mess_count, + std::shared_ptr memory, + cudf::size_type offset, + cudf::size_type count); - /** - * TODO(Documentation) - */ - static std::shared_ptr memory(MultiInferenceFILMessage& self); + /** + * TODO(Documentation) + */ + static std::shared_ptr memory(MultiInferenceFILMessage& self); - /** - * TODO(Documentation) - */ - static std::size_t offset(MultiInferenceFILMessage& self); + /** + * TODO(Documentation) + */ + static std::size_t offset(MultiInferenceFILMessage& self); - /** - * TODO(Documentation) - */ - static std::size_t count(MultiInferenceFILMessage& self); - }; + /** + * TODO(Documentation) + */ + static std::size_t count(MultiInferenceFILMessage& self); +}; #pragma GCC visibility pop -} +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/messages/multi_inference_nlp.hpp b/morpheus/_lib/include/morpheus/messages/multi_inference_nlp.hpp index 82aa7c1900..fa3649bb60 100644 --- a/morpheus/_lib/include/morpheus/messages/multi_inference_nlp.hpp +++ b/morpheus/_lib/include/morpheus/messages/multi_inference_nlp.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,106 +19,109 @@ #include #include +#include #include #include +#include #include #include -#include namespace morpheus { - /****** Component public implementations *******************/ - /****** MultiInferenceNLPMessage****************************************/ +/****** Component public implementations *******************/ +/****** MultiInferenceNLPMessage****************************************/ +/** + * TODO(Documentation) + */ +#pragma GCC visibility push(default) +class MultiInferenceNLPMessage : public MultiInferenceMessage +{ + public: + MultiInferenceNLPMessage(std::shared_ptr meta, + std::size_t mess_offset, + std::size_t mess_count, + std::shared_ptr memory, + std::size_t offset, + std::size_t count); + /** * TODO(Documentation) */ -#pragma GCC visibility push(default) - class MultiInferenceNLPMessage : public MultiInferenceMessage { - public: - MultiInferenceNLPMessage(std::shared_ptr meta, - std::size_t mess_offset, - std::size_t mess_count, - std::shared_ptr memory, - std::size_t offset, - std::size_t count); - - /** - * TODO(Documentation) - */ - const neo::TensorObject get_input_ids() const; - - /** - * TODO(Documentation) - */ - void set_input_ids(const neo::TensorObject &input_ids); - - /** - * TODO(Documentation) - */ - const neo::TensorObject get_input_mask() const; - - /** - * TODO(Documentation) - */ - void set_input_mask(const neo::TensorObject &input_mask); - - /** - * TODO(Documentation) - */ - const neo::TensorObject get_seq_ids() const; - - /** - * TODO(Documentation) - */ - void set_seq_ids(const neo::TensorObject &seq_ids); - }; - - /****** MultiInferenceNLPMessageInterfaceProxy *************************/ + const TensorObject get_input_ids() const; + + /** + * TODO(Documentation) + */ + void set_input_ids(const TensorObject& input_ids); + + /** + * TODO(Documentation) + */ + const TensorObject get_input_mask() const; + + /** + * TODO(Documentation) + */ + void set_input_mask(const TensorObject& input_mask); + + /** + * TODO(Documentation) + */ + const TensorObject get_seq_ids() const; + + /** + * TODO(Documentation) + */ + void set_seq_ids(const TensorObject& seq_ids); +}; + +/****** MultiInferenceNLPMessageInterfaceProxy *************************/ +/** + * @brief Interface proxy, used to insulate python bindings. + */ +struct MultiInferenceNLPMessageInterfaceProxy +{ + /** + * @brief Create and initialize a MultiInferenceNLPMessage, and return a shared pointer to the result. + */ + static std::shared_ptr init(std::shared_ptr meta, + cudf::size_type mess_offset, + cudf::size_type mess_count, + std::shared_ptr memory, + cudf::size_type offset, + cudf::size_type count); + + /** + * TODO(Documentation) + */ + static std::shared_ptr memory(MultiInferenceNLPMessage& self); + + /** + * TODO(Documentation) + */ + static std::size_t offset(MultiInferenceNLPMessage& self); + /** - * @brief Interface proxy, used to insulate python bindings. + * TODO(Documentation) + */ + static std::size_t count(MultiInferenceNLPMessage& self); + + /** + * TODO(Documentation) + */ + static pybind11::object input_ids(MultiInferenceNLPMessage& self); + + /** + * TODO(Documentation) + */ + static pybind11::object input_mask(MultiInferenceNLPMessage& self); + + /** + * TODO(Documentation) */ - struct MultiInferenceNLPMessageInterfaceProxy { - /** - * @brief Create and initialize a MultiInferenceNLPMessage, and return a shared pointer to the result. - */ - static std::shared_ptr init(std::shared_ptr meta, - cudf::size_type mess_offset, - cudf::size_type mess_count, - std::shared_ptr memory, - cudf::size_type offset, - cudf::size_type count); - - /** - * TODO(Documentation) - */ - static std::shared_ptr memory(MultiInferenceNLPMessage& self); - - /** - * TODO(Documentation) - */ - static std::size_t offset(MultiInferenceNLPMessage& self); - - /** - * TODO(Documentation) - */ - static std::size_t count(MultiInferenceNLPMessage& self); - - /** - * TODO(Documentation) - */ - static pybind11::object input_ids(MultiInferenceNLPMessage& self); - - /** - * TODO(Documentation) - */ - static pybind11::object input_mask(MultiInferenceNLPMessage& self); - - /** - * TODO(Documentation) - */ - static pybind11::object seq_ids(MultiInferenceNLPMessage& self); - }; + static pybind11::object seq_ids(MultiInferenceNLPMessage& self); +}; #pragma GCC visibility pop -} +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/messages/multi_response.hpp b/morpheus/_lib/include/morpheus/messages/multi_response.hpp index ae916ce692..41ad40b078 100644 --- a/morpheus/_lib/include/morpheus/messages/multi_response.hpp +++ b/morpheus/_lib/include/morpheus/messages/multi_response.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,12 +17,12 @@ #pragma once - #include #include #include #include #include +#include #include #include @@ -34,89 +34,89 @@ #include namespace morpheus { - /****** Component public implementations *******************/ - /****** MultiResponseMessage****************************************/ +/****** Component public implementations *******************/ +/****** MultiResponseMessage****************************************/ +/** + * TODO(Documentation) + */ +#pragma GCC visibility push(default) +class MultiResponseMessage : public MultiMessage +{ + public: + MultiResponseMessage(std::shared_ptr meta, + std::size_t mess_offset, + std::size_t mess_count, + std::shared_ptr memory, + std::size_t offset, + std::size_t count); + + std::shared_ptr memory; + std::size_t offset{0}; + std::size_t count{0}; + /** * TODO(Documentation) */ -#pragma GCC visibility push(default) - class MultiResponseMessage : public MultiMessage { - public: - MultiResponseMessage(std::shared_ptr meta, - std::size_t mess_offset, - std::size_t mess_count, - std::shared_ptr memory, - std::size_t offset, - std::size_t count); - - std::shared_ptr memory; - std::size_t offset{0}; - std::size_t count{0}; - - /** - * TODO(Documentation) - */ - neo::TensorObject get_output(const std::string &name); - - /** - * TODO(Documentation) - */ - const neo::TensorObject get_output(const std::string &name) const; - - /** - * TODO(Documentation) - */ - const void set_output(const std::string &name, const neo::TensorObject &value); - - /** - * TODO(Documentation) - * TODO(Devin) Should we be shadowing MultiMessage::get_slice? - */ - std::shared_ptr get_slice(std::size_t start, std::size_t stop) const; - - protected: - /** - * TODO(Documentation) - */ - std::shared_ptr internal_get_slice(std::size_t start, std::size_t stop) const override; - }; - - - /****** MultiResponseMessageInterfaceProxy *************************/ + TensorObject get_output(const std::string &name); + + /** + * TODO(Documentation) + */ + const TensorObject get_output(const std::string &name) const; + /** - * @brief Interface proxy, used to insulate python bindings. + * TODO(Documentation) + */ + const void set_output(const std::string &name, const TensorObject &value); + + /** + * TODO(Documentation) + * TODO(Devin) Should we be shadowing MultiMessage::get_slice? + */ + std::shared_ptr get_slice(std::size_t start, std::size_t stop) const; + + protected: + /** + * TODO(Documentation) + */ + std::shared_ptr internal_get_slice(std::size_t start, std::size_t stop) const override; +}; + +/****** MultiResponseMessageInterfaceProxy *************************/ +/** + * @brief Interface proxy, used to insulate python bindings. + */ +struct MultiResponseMessageInterfaceProxy +{ + /** + * @brief Create and initialize a MultiResponseMessage, and return a shared pointer to the result. + */ + static std::shared_ptr init(std::shared_ptr meta, + cudf::size_type mess_offset, + cudf::size_type mess_count, + std::shared_ptr memory, + cudf::size_type offset, + cudf::size_type count); + + /** + * TODO(Documentation) + */ + static std::shared_ptr memory(MultiResponseMessage &self); + + /** + * TODO(Documentation) + */ + static std::size_t offset(MultiResponseMessage &self); + + /** + * TODO(Documentation) + */ + static std::size_t count(MultiResponseMessage &self); + + /** + * TODO(Documentation) */ - struct MultiResponseMessageInterfaceProxy { - /** - * @brief Create and initialize a MultiResponseMessage, and return a shared pointer to the result. - */ - static std::shared_ptr init(std::shared_ptr meta, - cudf::size_type mess_offset, - cudf::size_type mess_count, - std::shared_ptr memory, - cudf::size_type offset, - cudf::size_type count); - - - /** - * TODO(Documentation) - */ - static std::shared_ptr memory(MultiResponseMessage &self); - - /** - * TODO(Documentation) - */ - static std::size_t offset(MultiResponseMessage &self); - - /** - * TODO(Documentation) - */ - static std::size_t count(MultiResponseMessage &self); - - /** - * TODO(Documentation) - */ - static pybind11::object get_output(MultiResponseMessage &self, const std::string &name); - }; + static pybind11::object get_output(MultiResponseMessage &self, const std::string &name); +}; #pragma GCC visibility pop -} +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/messages/multi_response_probs.hpp b/morpheus/_lib/include/morpheus/messages/multi_response_probs.hpp index b6c5570f40..7c64dae511 100644 --- a/morpheus/_lib/include/morpheus/messages/multi_response_probs.hpp +++ b/morpheus/_lib/include/morpheus/messages/multi_response_probs.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,79 +22,82 @@ #include #include #include +#include -#include #include +#include #include namespace morpheus { - /****** Component public implementations *******************/ - /****** MultiResponseProbsMessage****************************************/ +/****** Component public implementations *******************/ +/****** MultiResponseProbsMessage****************************************/ +/** + * TODO(Documentation) + */ +#pragma GCC visibility push(default) +class MultiResponseProbsMessage : public MultiResponseMessage +{ + public: + MultiResponseProbsMessage(std::shared_ptr meta, + size_t mess_offset, + size_t mess_count, + std::shared_ptr memory, + size_t offset, + size_t count); + /** * TODO(Documentation) */ -#pragma GCC visibility push(default) - class MultiResponseProbsMessage : public MultiResponseMessage { - public: - MultiResponseProbsMessage(std::shared_ptr meta, - size_t mess_offset, - size_t mess_count, - std::shared_ptr memory, - size_t offset, - size_t count); + const TensorObject get_probs() const; - /** - * TODO(Documentation) - */ - const neo::TensorObject get_probs() const; + /** + * TODO(Documentation) + */ + void set_probs(const TensorObject &probs); - /** - * TODO(Documentation) - */ - void set_probs(const neo::TensorObject &probs); + /** + * TODO(Documentation) + */ + std::shared_ptr get_slice(size_t start, size_t stop) const + { + // This can only cast down + return std::static_pointer_cast(this->internal_get_slice(start, stop)); + } +}; - /** - * TODO(Documentation) - */ - std::shared_ptr get_slice(size_t start, size_t stop) const - { - // This can only cast down - return std::static_pointer_cast(this->internal_get_slice(start, stop)); - } - }; +/****** MultiResponseProbsMessageInterfaceProxy *************************/ +/** + * @brief Interface proxy, used to insulate python bindings. + */ +struct MultiResponseProbsMessageInterfaceProxy +{ + static std::shared_ptr init(std::shared_ptr meta, + cudf::size_type mess_offset, + cudf::size_type mess_count, + std::shared_ptr memory, + cudf::size_type offset, + cudf::size_type count); - /****** MultiResponseProbsMessageInterfaceProxy *************************/ /** - * @brief Interface proxy, used to insulate python bindings. + * TODO(Documentation) */ - struct MultiResponseProbsMessageInterfaceProxy { - static std::shared_ptr init(std::shared_ptr meta, - cudf::size_type mess_offset, - cudf::size_type mess_count, - std::shared_ptr memory, - cudf::size_type offset, - cudf::size_type count); - - /** - * TODO(Documentation) - */ - static std::shared_ptr memory(MultiResponseProbsMessage &self); + static std::shared_ptr memory(MultiResponseProbsMessage &self); - /** - * TODO(Documentation) - */ - static std::size_t offset(MultiResponseProbsMessage &self); + /** + * TODO(Documentation) + */ + static std::size_t offset(MultiResponseProbsMessage &self); - /** - * TODO(Documentation) - */ - static std::size_t count(MultiResponseProbsMessage &self); + /** + * TODO(Documentation) + */ + static std::size_t count(MultiResponseProbsMessage &self); - /** - * TODO(Documentation) - */ - static pybind11::object probs(MultiResponseProbsMessage &self); - }; + /** + * TODO(Documentation) + */ + static pybind11::object probs(MultiResponseProbsMessage &self); +}; #pragma GCC visibility pop -} +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/objects/dev_mem_info.hpp b/morpheus/_lib/include/morpheus/objects/dev_mem_info.hpp index 1e3efd3948..9b37e95d33 100644 --- a/morpheus/_lib/include/morpheus/objects/dev_mem_info.hpp +++ b/morpheus/_lib/include/morpheus/objects/dev_mem_info.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,7 +17,7 @@ #pragma once -#include +#include #include @@ -25,25 +25,26 @@ #include namespace morpheus { - /****** Component public implementations *******************/ - /****** DevMemInfo******************************************/ +/****** Component public implementations *******************/ +/****** DevMemInfo******************************************/ +/** + * @brief Simple object that just holds 4 things: element count, element dtype, device_buffer, and bytes_offset + */ +struct DevMemInfo +{ + // Number of elements in the buffer + size_t element_count; + // Type of elements in the buffer + TypeId type_id; + // Buffer of data + std::shared_ptr buffer; + // Offset from head of data in bytes + size_t offset; + /** - * @brief Simple object that just holds 4 things: element count, element dtype, device_buffer, and bytes_offset + * TODO(Documentation) */ - struct DevMemInfo { - // Number of elements in the buffer - size_t element_count; - // Type of elements in the buffer - neo::TypeId type_id; - // Buffer of data - std::shared_ptr buffer; - // Offset from head of data in bytes - size_t offset; - - /** - * TODO(Documentation) - */ - void *data() const; - }; + void *data() const; +}; -} // namespace morpheus \ No newline at end of file +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/objects/rmm_tensor.hpp b/morpheus/_lib/include/morpheus/objects/rmm_tensor.hpp index 0cf350b414..24d0549c62 100644 --- a/morpheus/_lib/include/morpheus/objects/rmm_tensor.hpp +++ b/morpheus/_lib/include/morpheus/objects/rmm_tensor.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,16 +17,16 @@ #pragma once +#include #include #include -#include #include #include -#include #include +#include #include #include @@ -36,123 +36,123 @@ #include #include - namespace morpheus { - /****** Component public implementations *******************/ - /****** RMMTensor****************************************/ - /** - * TODO(Documentation) - */ - class RMMTensor : public neo::ITensor { - public: - RMMTensor(std::shared_ptr device_buffer, - size_t offset, - DType dtype, - std::vector shape, - std::vector stride = {}); - - ~RMMTensor() = default; - - /** - * TODO(Documentation) - */ - bool is_compact() const final; - - /** - * TODO(Documentation) - */ - neo::DataType dtype() const override; - - /** - * TODO(Documentation) - */ - neo::RankType rank() const final; - - /** - * TODO(Documentation) - */ - std::shared_ptr deep_copy() const override; - - /** - * TODO(Documentation) - */ - std::shared_ptr reshape(const std::vector &dims) const override; - - /** - * TODO(Documentation) - */ - std::shared_ptr slice(const std::vector &min_dims, - const std::vector &max_dims) const override; - - /** - * TODO(Documentation) - */ - std::shared_ptr get_memory() const override; - - /** - * TODO(Documentation) - */ - std::size_t bytes() const final; - - /** - * TODO(Documentation) - */ - std::size_t count() const final; - - /** - * TODO(Documentation) - */ - std::size_t shape(std::size_t idx) const final; - - /** - * TODO(Documentation) - */ - std::size_t stride(std::size_t idx) const final; - - /** - * TODO(Documentation) - */ - void *data() const override; - - /** - * TODO(Documentation) - */ - void get_shape(std::vector &s) const; - - /** - * TODO(Documentation) - */ - void get_stride(std::vector &s) const; - - // Tensor reshape(std::vector shape) - // { - // CHECK(is_compact()); - // return Tensor(descriptor_shared(), dtype_size(), shape); - // } - - /** - * TODO(Documentation) - */ - std::shared_ptr as_type(neo::DataType dtype) const override; - - protected: - private: - /** - * TODO(Documentation) - */ - size_t offset_bytes() const; - - // Memory info - std::shared_ptr m_md; - size_t m_offset; - - // // Type info - // std::string m_typestr; - // std::size_t m_dtype_size; - DType m_dtype; - - // Shape info - std::vector m_shape; - std::vector m_stride; - }; -} \ No newline at end of file +/****** Component public implementations *******************/ +/****** RMMTensor****************************************/ +/** + * TODO(Documentation) + */ +class RMMTensor : public ITensor +{ + public: + RMMTensor(std::shared_ptr device_buffer, + size_t offset, + DType dtype, + std::vector shape, + std::vector stride = {}); + + ~RMMTensor() = default; + + /** + * TODO(Documentation) + */ + bool is_compact() const final; + + /** + * TODO(Documentation) + */ + DataType dtype() const override; + + /** + * TODO(Documentation) + */ + RankType rank() const final; + + /** + * TODO(Documentation) + */ + std::shared_ptr deep_copy() const override; + + /** + * TODO(Documentation) + */ + std::shared_ptr reshape(const std::vector &dims) const override; + + /** + * TODO(Documentation) + */ + std::shared_ptr slice(const std::vector &min_dims, + const std::vector &max_dims) const override; + + /** + * TODO(Documentation) + */ + std::shared_ptr get_memory() const override; + + /** + * TODO(Documentation) + */ + std::size_t bytes() const final; + + /** + * TODO(Documentation) + */ + std::size_t count() const final; + + /** + * TODO(Documentation) + */ + std::size_t shape(std::size_t idx) const final; + + /** + * TODO(Documentation) + */ + std::size_t stride(std::size_t idx) const final; + + /** + * TODO(Documentation) + */ + void *data() const override; + + /** + * TODO(Documentation) + */ + void get_shape(std::vector &s) const; + + /** + * TODO(Documentation) + */ + void get_stride(std::vector &s) const; + + // Tensor reshape(std::vector shape) + // { + // CHECK(is_compact()); + // return Tensor(descriptor_shared(), dtype_size(), shape); + // } + + /** + * TODO(Documentation) + */ + std::shared_ptr as_type(DataType dtype) const override; + + protected: + private: + /** + * TODO(Documentation) + */ + size_t offset_bytes() const; + + // Memory info + std::shared_ptr m_md; + size_t m_offset; + + // // Type info + // std::string m_typestr; + // std::size_t m_dtype_size; + DType m_dtype; + + // Shape info + std::vector m_shape; + std::vector m_stride; +}; +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/objects/table_info.hpp b/morpheus/_lib/include/morpheus/objects/table_info.hpp index c85b3aa0a3..627a9ba98d 100644 --- a/morpheus/_lib/include/morpheus/objects/table_info.hpp +++ b/morpheus/_lib/include/morpheus/objects/table_info.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,9 +18,9 @@ #pragma once #include +#include #include -#include #include #include @@ -81,13 +81,12 @@ struct TableInfo /** * TODO(Documentation) */ - void insert_columns(const std::vector &column_names, const std::vector &column_types); + void insert_columns(const std::vector &column_names, const std::vector &column_types); /** * TODO(Documentation) */ - void insert_missing_columns(const std::vector &column_names, - const std::vector &column_types); + void insert_missing_columns(const std::vector &column_names, const std::vector &column_types); /** * TODO(Documentation) diff --git a/morpheus/_lib/include/morpheus/objects/tensor.hpp b/morpheus/_lib/include/morpheus/objects/tensor.hpp index f0b82787fe..628671235f 100644 --- a/morpheus/_lib/include/morpheus/objects/tensor.hpp +++ b/morpheus/_lib/include/morpheus/objects/tensor.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,18 +17,17 @@ #pragma once - #include +#include #include #include -#include #include #include -#include #include +#include #include #include @@ -39,54 +38,55 @@ #include namespace morpheus { - /****** Component public implementations *******************/ - /****** Tensor****************************************/ +/****** Component public implementations *******************/ +/****** Tensor****************************************/ +/** + * TODO(Documentation) + */ +class Tensor +{ + public: + Tensor(std::shared_ptr buffer, + std::string init_typestr, + std::vector init_shape, + std::vector init_strides, + size_t init_offset = 0); + + std::vector shape; + std::vector strides; + std::string typestr; + /** * TODO(Documentation) */ - class Tensor { - public: - Tensor(std::shared_ptr buffer, - std::string init_typestr, - std::vector init_shape, - std::vector init_strides, - size_t init_offset = 0); + void *data() const; - std::vector shape; - std::vector strides; - std::string typestr; - - /** - * TODO(Documentation) - */ - void *data() const; - - /** - * TODO(Documentation) - */ - size_t bytes_count() const; - - /** - * TODO(Documentation) - */ - std::vector get_host_data() const; + /** + * TODO(Documentation) + */ + size_t bytes_count() const; - /** - * TODO(Documentation) - */ - auto get_stream() const; + /** + * TODO(Documentation) + */ + std::vector get_host_data() const; - /** - * TODO(Documentation) - */ - static neo::TensorObject create(std::shared_ptr buffer, - DType dtype, - std::vector shape, - std::vector strides, - size_t offset = 0); + /** + * TODO(Documentation) + */ + auto get_stream() const; - private: - size_t m_offset; - std::shared_ptr m_device_buffer; - }; -} \ No newline at end of file + /** + * TODO(Documentation) + */ + static TensorObject create(std::shared_ptr buffer, + DType dtype, + std::vector shape, + std::vector strides, + size_t offset = 0); + + private: + size_t m_offset; + std::shared_ptr m_device_buffer; +}; +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/objects/tensor_object.hpp b/morpheus/_lib/include/morpheus/objects/tensor_object.hpp new file mode 100644 index 0000000000..71aa642e67 --- /dev/null +++ b/morpheus/_lib/include/morpheus/objects/tensor_object.hpp @@ -0,0 +1,771 @@ +/** + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include + +#include +#include +#include +#include +#include // for memory_kind_type +#include + +#include // for cudaMemcpyDeviceToHost & cudaMemcpy + +#include // for CHECK + +#include + +#include +#include +#include +#include + +#include +#include +#include // for size_t, byte +#include +#include +#include +#include +#include +#include +#include // for runtime_error +#include +#include // for exchange, move +#include +// IWYU is confusing std::size_t with __gnu_cxx::size_t for some reason +// when we define vector +// IWYU pragma: no_include + +namespace morpheus { + +using TensorIndex = long long; // NOLINT +using RankType = int; // NOLINT + +namespace detail { + +template +std::string join(IterT begin, IterT end, std::string const& separator) +{ + std::ostringstream result; + if (begin != end) + result << *begin++; + while (begin != end) + result << separator << *begin++; + return result.str(); +} + +template +std::string array_to_str(IterT begin, IterT end) +{ + return CONCAT_STR("[" << join(begin, end, ", ") << "]"); +} + +template +void set_contiguous_stride(const std::array& shape, std::array& stride) +{ + TensorIndex ttl = 1; + auto rank = shape.size(); + for (int i = rank - 1; i >= 0; i--) + { + stride[i] = ttl; + ttl *= shape.at(i); + } +} + +template +void validate_stride(const std::vector& shape, std::vector& stride) +{ + CHECK(stride.empty() || shape.size() == stride.size()) + << "Stride dimension should match shape dimension. Otherwise leave empty to auto calculate stride for " + "contiguous tensor"; + + IndexT ttl = 1; + auto rank = shape.size(); + + // Fill with -1 + stride.resize(rank, -1); + + for (int i = rank - 1; i >= 0; i--) + { + // Only fill -1 values + if (stride[i] < 0) + { + stride[i] = ttl; + } + ttl *= shape.at(i); + } +} + +} // namespace detail + +enum class TensorStorageType +{ + Host, + Device +}; + +template +using HostContainer = std::vector>; + +template +using DeviceContainer = rmm::device_uvector; + +template +using HostArray = xt::xarray_container>; + +template +using HostTensor = xt::xtensor_container, R>; + +struct ITensorStorage +{ + virtual ~ITensorStorage() = default; + virtual void* data() const = 0; + // virtual const void* data() const = 0; + virtual std::size_t bytes() const = 0; + virtual std::shared_ptr get_memory() const = 0; + // virtual TensorStorageType storage_type() const = 0; +}; + +struct ITensor; + +struct ITensorOperations +{ + virtual std::shared_ptr slice(const std::vector& min_dims, + const std::vector& max_dims) const = 0; + + virtual std::shared_ptr reshape(const std::vector& dims) const = 0; + + virtual std::shared_ptr deep_copy() const = 0; + + virtual std::shared_ptr as_type(DataType dtype) const = 0; +}; + +struct ITensor : public ITensorStorage, public ITensorOperations +{ + ~ITensor() override = default; + + virtual RankType rank() const = 0; + virtual std::size_t count() const = 0; + virtual DataType dtype() const = 0; + + virtual std::size_t shape(std::size_t) const = 0; + virtual std::size_t stride(std::size_t) const = 0; + + virtual bool is_compact() const = 0; + + std::vector get_shape() const + { + std::vector v(this->rank()); + for (int i = 0; i < this->rank(); ++i) + v[i] = this->shape(i); + return v; + } + + std::vector get_stride() const + { + std::vector v(this->rank()); + for (int i = 0; i < this->rank(); ++i) + v[i] = this->stride(i); + return v; + } +}; + +struct IHostTensor : public ITensor +{ + ~IHostTensor() override = default; + + // todo: test for column major - this only works with row major + auto bytes_view() + { + using byte_t = std::byte; + xt::xarray::shape_type shape(this->rank() + 1); + xt::xarray::shape_type stride(this->rank() + 1); + for (int i = 0; i < this->rank(); ++i) + { + shape[i] = this->shape(i); + } + shape[this->rank()] = this->dtype().item_size(); + stride[this->rank()] = 1; + for (int i = this->rank() - 1; i < 0; --i) + { + stride[i] = this->stride(i) * this->dtype().item_size(); + } + return xt::adapt(static_cast(this->data()), this->bytes(), xt::no_ownership(), shape, stride); + } +}; + +#if 0 +template +class TensorDescriptor +{}; + +template +class TensorDescriptor> : public IHostTensor +{ + public: + TensorDescriptor(HostArray&& wrapped) : m_wrapped(std::move(wrapped)) {} + ~TensorDescriptor() override = default; + + // itensor interface + void* data() final + { + return m_wrapped.data(); + }; + const void* data() const final + { + return m_wrapped.data(); + } + + std::size_t count() const final + { + return m_wrapped.size(); + } + std::size_t bytes() const final + { + return m_wrapped.size() * sizeof(T); + }; + + RankType rank() const final + { + return m_wrapped.dimension(); + } + DataType dtype() const final + { + return DataType::create(); + } + + TensorStorageType storage_type() const final + { + return TensorStorageType::Host; + } + + [[nodiscard]] HostArray unwrap() + { + return std::move(m_wrapped); + } + + std::size_t shape(std::size_t idx) const final + { + return m_wrapped.shape()[idx]; + } + + std::size_t stride(std::size_t idx) const final + { + return m_wrapped.strides()[idx]; + } + + private: + HostArray m_wrapped; +}; + +template +class TensorDescriptor> : public IHostTensor +{ + public: + TensorDescriptor(HostTensor&& wrapped) : m_wrapped(std::move(wrapped)) {} + ~TensorDescriptor() override = default; + + // itensor interface + void* data() final + { + return m_wrapped.data(); + }; + const void* data() const final + { + return m_wrapped.data(); + } + + std::size_t count() const final + { + return m_wrapped.size(); + } + std::size_t bytes() const final + { + return m_wrapped.size() * sizeof(T); + }; + + RankType rank() const final + { + return m_wrapped.dimension(); + } + DataType dtype() const final + { + return DataType::create(); + } + + TensorStorageType storage_type() const final + { + return TensorStorageType::Host; + } + + [[nodiscard]] HostTensor unwrap() + { + return std::move(m_wrapped); + } + + std::size_t shape(std::size_t idx) const final + { + return m_wrapped.shape()[idx]; + } + + std::size_t stride(std::size_t idx) const final + { + return m_wrapped.strides()[idx]; + } + + protected: + private: + HostTensor m_wrapped; +}; + +template +std::unique_ptr to_generic(HostArray&& array) +{ + return std::make_unique>>(std::move(array)); +} + +template +std::unique_ptr to_generic(HostTensor&& array) +{ + return std::make_unique>>(std::move(array)); +} + +template +[[nodiscard]] HostArray to_host_array(std::unique_ptr generic) +{ + CHECK(generic->storage_type() == TensorStorageType::Host); + auto d = dynamic_cast>*>(generic.get()); + CHECK(d) << "error dynamically casting to descriptor; possible type mismatch"; + return d->unwrap(); +} + +template +[[nodiscard]] HostTensor to_host_tensor(std::unique_ptr generic) +{ + CHECK(generic->storage_type() == TensorStorageType::Host); + auto d = dynamic_cast>*>(generic.get()); + CHECK(d) << "error dynamically casting to descriptor; possible type mismatch"; + return d->unwrap(); +} + +#endif + +class TensorView : public neo::memory::blob +{ + public: + TensorView() = delete; + + TensorView(neo::memory::blob bv, DataType dtype, std::vector shape); + TensorView(neo::memory::blob bv, DataType dtype, std::vector shape, std::vector stride); + + const DataType& dtype() const; + + const std::vector& shape() const; + + const std::vector& stride() const; + + /** + * @brief Determines if the tensor layout is both contiguous and ordered. + * + * @note A tensor whose values are laid out in the storage starting from the rightmost + * dimension onward (that is, moving along rows for a 2D tensor) is defined as contiguous. + */ + bool is_contiguous() const; + + private: + DataType m_dtype; + std::vector m_shape; + std::vector m_stride; +}; + +struct TensorObject final +{ + TensorObject() = default; + + TensorObject(std::shared_ptr md, std::shared_ptr tensor) : + m_md(std::move(md)), + m_tensor(std::move(tensor)) + {} + TensorObject(std::shared_ptr tensor) : TensorObject(tensor->get_memory(), tensor) {} + + TensorObject(const TensorObject& other) = default; + + TensorObject(TensorObject&& other) : + m_md(std::exchange(other.m_md, nullptr)), + m_tensor(std::exchange(other.m_tensor, nullptr)) + {} + + ~TensorObject() = default; + + void* data() const + { + return m_tensor->data(); + } + + DataType dtype() const + { + return m_tensor->dtype(); + } + + std::size_t count() const + { + return m_tensor->count(); + } + std::size_t bytes() const + { + return m_tensor->bytes(); + } + + RankType rank() const + { + return m_tensor->rank(); + } + std::size_t dtype_size() const + { + return m_tensor->dtype().item_size(); + } + + std::vector get_shape() const + { + return m_tensor->get_shape(); + } + + std::vector get_stride() const + { + return m_tensor->get_stride(); + } + + TensorIndex shape(std::uint32_t idx) const + { + return m_tensor->shape(idx); + } + TensorIndex stride(std::uint32_t idx) const + { + return m_tensor->stride(idx); + } + + bool is_compact() const + { + return m_tensor->is_compact(); + } + + TensorObject slice(std::vector min_dims, std::vector max_dims) const + { + // Replace any -1 values + std::replace_if( + min_dims.begin(), min_dims.end(), [](auto x) { return x < 0; }, 0); + std::transform( + max_dims.begin(), max_dims.end(), this->get_shape().begin(), max_dims.begin(), [](auto d, auto s) { + return d < 0 ? s : d; + }); + + return TensorObject(m_md, m_tensor->slice(min_dims, max_dims)); + } + + TensorObject reshape(const std::vector& dims) const + { + return TensorObject(m_md, m_tensor->reshape(dims)); + } + + TensorObject deep_copy() const + { + std::shared_ptr copy = m_tensor->deep_copy(); + + return TensorObject(copy); + } + + std::vector get_host_data() const + { + std::vector out_data; + + out_data.resize(this->bytes()); + + NEO_CHECK_CUDA(cudaMemcpy(&out_data[0], this->data(), this->bytes(), cudaMemcpyDeviceToHost)); + + return out_data; + } + + template + T read_element(const TensorIndex (&idx)[N]) const + { + auto stride = this->get_stride(); + auto shape = this->get_shape(); + + CHECK(std::transform_reduce( + stride.begin(), stride.end(), std::begin(idx), 0, std::logical_and<>(), std::less<>())) + << "Index is outsize of the bounds of the tensor. Index=" + << detail::array_to_str(std::begin(idx), std::begin(idx) + N) + << ", Size=" << detail::array_to_str(shape.begin(), shape.end()) << ""; + + CHECK(DataType::create() == this->dtype()) + << "read_element type must match array type. read_element type: '" << DataType::create().name() + << "', array type: '" << this->dtype().name() << "'"; + + size_t offset = std::transform_reduce( + stride.begin(), stride.end(), std::begin(idx), 0, std::plus<>(), std::multiplies<>()) * + this->dtype_size(); + + T output; + + NEO_CHECK_CUDA( + cudaMemcpy(&output, static_cast(this->data()) + offset, sizeof(T), cudaMemcpyDeviceToHost)); + + return output; + } + + template + T read_element(const std::array idx) const + { + auto stride = this->get_stride(); + auto shape = this->get_shape(); + + CHECK(std::transform_reduce( + stride.begin(), stride.end(), std::begin(idx), 0, std::logical_and<>(), std::less<>())) + << "Index is outsize of the bounds of the tensor. Index=" + << detail::array_to_str(std::begin(idx), std::begin(idx) + N) + << ", Size=" << detail::array_to_str(shape.begin(), shape.end()) << ""; + + CHECK(DataType::create() == this->dtype()) + << "read_element type must match array type. read_element type: '" << DataType::create().name() + << "', array type: '" << this->dtype().name() << "'"; + + size_t offset = std::transform_reduce( + stride.begin(), stride.end(), std::begin(idx), 0, std::plus<>(), std::multiplies<>()) * + this->dtype_size(); + + T output; + + NEO_CHECK_CUDA( + cudaMemcpy(&output, static_cast(this->data()) + offset, sizeof(T), cudaMemcpyDeviceToHost)); + + return output; + } + + // move assignment + TensorObject& operator=(TensorObject&& other) noexcept + { + // Guard self assignment + if (this == &other) + return *this; + + m_md = std::exchange(other.m_md, nullptr); // leave other in valid state + m_tensor = std::exchange(other.m_tensor, nullptr); + return *this; + } + + // copy assignment + TensorObject& operator=(const TensorObject& other) + { + // Guard self assignment + if (this == &other) + return *this; + + // Check for valid assignment + if (this->get_shape() != other.get_shape()) + { + throw std::runtime_error("Left and right shapes do not match"); + } + + if (this->get_stride() != other.get_stride()) + { + throw std::runtime_error( + "Left and right strides do not match. At this time, only uniform strides are allowed"); + } + + // Inefficient but should be sufficient + if (this->get_numpy_typestr() != other.get_numpy_typestr()) + { + throw std::runtime_error("Left and right types do not match"); + } + + DCHECK(this->bytes() == other.bytes()) << "Left and right bytes should be the same if all other test passed"; + + // Perform the copy operation + NEO_CHECK_CUDA(cudaMemcpy(this->data(), other.data(), this->bytes(), cudaMemcpyDeviceToDevice)); + + return *this; + } + + std::shared_ptr get_tensor() const + { + return m_tensor; + } + + std::shared_ptr get_memory() const + { + return m_md; + } + + std::string get_numpy_typestr() const + { + return m_tensor->dtype().type_str(); + } + + TensorObject as_type(DataType dtype) const + { + if (dtype == m_tensor->dtype()) + { + // Shallow copy + return TensorObject(*this); + } + + return TensorObject(m_tensor->as_type(dtype)); + } + + protected: + void throw_on_invalid_storage(); + + private: + std::shared_ptr m_md; + std::shared_ptr m_tensor; +}; + +class GenericTensor : public ITensor +{ + public: + GenericTensor(std::shared_ptr md, + size_t offset, + DataType dtype, + const std::vector& shape, + const std::vector& stride = {}); + ~GenericTensor() = default; + + std::shared_ptr get_memory() const final + { + return m_md; + } + + void* data() const override + { + return static_cast(m_md->data()) + m_offset; + } + + DataType dtype() const override + { + return m_dtype; + } + + RankType rank() const final + { + return m_shape.size(); + } + + std::size_t count() const final + { + return std::accumulate(m_shape.begin(), m_shape.end(), 1, std::multiplies<>()); + } + + std::size_t bytes() const final + { + return count() * m_dtype.item_size(); + } + + std::size_t shape(std::size_t idx) const final + { + DCHECK_LT(idx, m_shape.size()); + return m_shape.at(idx); + } + + std::size_t stride(std::size_t idx) const final + { + DCHECK_LT(idx, m_stride.size()); + return m_stride.at(idx); + } + + bool is_compact() const final + { + TensorIndex ttl = 1; + for (int i = rank() - 1; i >= 0; i--) + { + if (stride(i) != ttl) + { + return false; + } + + ttl *= shape(i); + } + return true; + } + + std::shared_ptr slice(const std::vector& min_dims, + const std::vector& max_dims) const override + { + // Calc new offset + size_t offset = std::transform_reduce( + m_stride.begin(), m_stride.end(), min_dims.begin(), m_offset, std::plus<>(), std::multiplies<>()); + + // Calc new shape + std::vector shape; + std::transform(max_dims.begin(), max_dims.end(), min_dims.begin(), std::back_inserter(shape), std::minus<>()); + + // Stride remains the same + return std::make_shared(m_md, offset, m_dtype, shape, m_stride); + } + + std::shared_ptr reshape(const std::vector& dims) const override + { + if (is_compact()) + { + return std::make_shared(m_md, m_offset, m_dtype, dims); + } + else + { + throw std::runtime_error("Not supported non-compact reshape"); + } + } + + std::shared_ptr deep_copy() const override + { + auto copied_memory = m_md->get_allocator()->allocate_descriptor(m_md->size()).make_shared(); + + if (copied_memory->type() == neo::memory::memory_kind_type::device || + copied_memory->type() == neo::memory::memory_kind_type::managed) + { + NEO_CHECK_CUDA(cudaMemcpy(copied_memory->data(), m_md->data(), m_md->size(), cudaMemcpyDeviceToDevice)); + } + else + { + throw std::runtime_error("Not implemented"); + } + + return std::make_shared(copied_memory, m_offset, m_dtype, m_shape, m_stride); + } + + std::shared_ptr as_type(DataType dtype) const override + { + throw std::runtime_error("Not implemented"); + } + + protected: + private: + // Memory info + std::shared_ptr m_md; + size_t m_offset; + + // Type info + DataType m_dtype; + + // Shape info + std::vector m_shape; + std::vector m_stride; +}; + +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/objects/neo_wrapped_tensor.hpp b/morpheus/_lib/include/morpheus/objects/wrapped_tensor.hpp similarity index 61% rename from morpheus/_lib/include/morpheus/objects/neo_wrapped_tensor.hpp rename to morpheus/_lib/include/morpheus/objects/wrapped_tensor.hpp index d6135b7f88..d76a82c803 100644 --- a/morpheus/_lib/include/morpheus/objects/neo_wrapped_tensor.hpp +++ b/morpheus/_lib/include/morpheus/objects/wrapped_tensor.hpp @@ -1,6 +1,6 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,13 +18,13 @@ #pragma once -#include +#include + #include #include #include - #include #include #include @@ -32,16 +32,16 @@ #include namespace morpheus { - /****** Component public implementations *******************/ - /****** neo::TensorObject****************************************/ - // TODO(Devin) defined in neo - /****** InterfaceProxy *************************/ +/****** Component public implementations *******************/ +/****** TensorObject****************************************/ +/****** InterfaceProxy *************************/ #pragma GCC visibility push(default) - /** - * @brief Interface proxy, used to insulate python bindings. - */ - struct NeoTensorObjectInterfaceProxy { - static pybind11::dict cuda_array_interface(neo::TensorObject &self); - }; +/** + * @brief Interface proxy, used to insulate python bindings. + */ +struct TensorObjectInterfaceProxy +{ + static pybind11::dict cuda_array_interface(TensorObject &self); +}; #pragma GCC visibility pop -} +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/utilities/cupy_util.hpp b/morpheus/_lib/include/morpheus/utilities/cupy_util.hpp index 1c78907d6d..058901a1fa 100644 --- a/morpheus/_lib/include/morpheus/utilities/cupy_util.hpp +++ b/morpheus/_lib/include/morpheus/utilities/cupy_util.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,33 +17,34 @@ #pragma once -#include +#include #include #include namespace morpheus { - /****** Component public implementations *******************/ - /****** CupyUtil****************************************/ +/****** Component public implementations *******************/ +/****** CupyUtil****************************************/ +/** + * @brief Structure that encapsulates cupy utilities. + */ +struct CupyUtil +{ + static pybind11::object cp_module; // handle to cupy module + /** - * @brief Structure that encapsulates cupy utilities. + * TODO(Documentation) */ - struct CupyUtil { - static pybind11::object cp_module; // handle to cupy module - - /** - * TODO(Documentation) - */ - static pybind11::module_ get_cp(); + static pybind11::module_ get_cp(); - /** - * TODO(Documentation) - */ - static pybind11::object tensor_to_cupy(const neo::TensorObject &tensor); + /** + * TODO(Documentation) + */ + static pybind11::object tensor_to_cupy(const TensorObject &tensor); - /** - * TODO(Documentation) - */ - static neo::TensorObject cupy_to_tensor(pybind11::object cupy_array); - }; -} + /** + * TODO(Documentation) + */ + static TensorObject cupy_to_tensor(pybind11::object cupy_array); +}; +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/utilities/matx_util.hpp b/morpheus/_lib/include/morpheus/utilities/matx_util.hpp index 4a2dd4cadb..12f2050d69 100644 --- a/morpheus/_lib/include/morpheus/utilities/matx_util.hpp +++ b/morpheus/_lib/include/morpheus/utilities/matx_util.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,49 +19,49 @@ #include #include - -#include -#include +#include +#include #include #include namespace morpheus { - struct MatxUtil { - /** - * @brief Convert one device_buffer type to another - * @return - */ - static std::shared_ptr cast(const DevMemInfo &input, neo::TypeId output_type); +struct MatxUtil +{ + /** + * @brief Convert one device_buffer type to another + * @return + */ + static std::shared_ptr cast(const DevMemInfo &input, TypeId output_type); - /** - * @brief Builds a Nx3 segment ID matrix - * @return - */ - static std::shared_ptr create_seg_ids(size_t row_count, size_t fea_len, neo::TypeId output_type); + /** + * @brief Builds a Nx3 segment ID matrix + * @return + */ + static std::shared_ptr create_seg_ids(size_t row_count, size_t fea_len, TypeId output_type); - /** - * @brief Calculate logits on device_buffer - * @return - */ - static std::shared_ptr logits(const DevMemInfo &input); + /** + * @brief Calculate logits on device_buffer + * @return + */ + static std::shared_ptr logits(const DevMemInfo &input); - /** - * @brief Perform transpose - * @return - */ - static std::shared_ptr transpose(const DevMemInfo &input, size_t rows, size_t cols); + /** + * @brief Perform transpose + * @return + */ + static std::shared_ptr transpose(const DevMemInfo &input, size_t rows, size_t cols); - /** - * @brief Return an array of boolean where x[i,j] >= thresh_val, when by_row is true an Nx1 array will be returned with a - * true if any value in the row is above the threshold - * @return - */ - static std::shared_ptr threshold(const DevMemInfo &input, - size_t rows, - size_t cols, - const std::vector &stride, - double thresh_val, - bool by_row); - }; -} + /** + * @brief Return an array of boolean where x[i,j] >= thresh_val, when by_row is true an Nx1 array will be returned + * with a true if any value in the row is above the threshold + * @return + */ + static std::shared_ptr threshold(const DevMemInfo &input, + size_t rows, + size_t cols, + const std::vector &stride, + double thresh_val, + bool by_row); +}; +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/utilities/tensor_util.hpp b/morpheus/_lib/include/morpheus/utilities/tensor_util.hpp new file mode 100644 index 0000000000..0574ac5a0f --- /dev/null +++ b/morpheus/_lib/include/morpheus/utilities/tensor_util.hpp @@ -0,0 +1,82 @@ +/** + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include + +#include // for ostream +#include // for string +#include // for vector + +namespace morpheus { + +/** + * @brief Tensor Utilities + * + * @note A tensor whose values are laid out in the storage starting from the rightmost + * dimension onward (that is, moving along rows for a 2D tensor) is defined as contiguous. + */ +struct TensorUtils +{ + using shape_type = std::vector; + + /** + * @brief Write a formatted shape to a stream + * + * @param shape + * @param os + */ + static void write_shape_to_stream(const shape_type& shape, std::ostream& os); + + /** + * @brief Convenience method to get a string from write_shape_to_stream + * + * @param shape + * @return std::string + */ + static std::string shape_to_string(const shape_type& shape); + + /** + * @brief Set stride to be contiguous with respect to row-major layouts + * + * @param shape + * @param stride + */ + static void set_contiguous_stride(const std::vector& shape, std::vector& stride); + + /** + * @brief Determines if the tensor layout is both contiguous and ordered. + * + * @note A tensor whose values are laid out in the storage starting from the rightmost + * dimension onward (that is, moving along rows for a 2D tensor) is defined as contiguous. + */ + static bool has_contiguous_stride(const std::vector& shape, const shape_type& stride); + + /** + * @brief Validate the shape and stride are compatible + * + * @param shape + * @param stride + * @return true + * @return false + */ + static bool validate_shape_and_stride(const std::vector& shape, + const std::vector& stride); +}; + +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/utilities/type_util.hpp b/morpheus/_lib/include/morpheus/utilities/type_util.hpp index e6596917e8..501577e8e8 100644 --- a/morpheus/_lib/include/morpheus/utilities/type_util.hpp +++ b/morpheus/_lib/include/morpheus/utilities/type_util.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,7 +17,7 @@ #pragma once -#include +#include #include #include @@ -25,38 +25,39 @@ #include #include - namespace morpheus { - /****** Component public implementations *******************/ - /****** DType****************************************/ - struct DType : neo::DataType // NOLINT - { - DType(const neo::DataType &dtype); +/****** Component public implementations *******************/ +/****** DType****************************************/ +struct DType : DataType // NOLINT +{ + DType(const DataType &dtype); - DType(neo::TypeId tid); + DType(TypeId tid); - // Cudf representation - cudf::type_id cudf_type_id() const; + // Cudf representation + cudf::type_id cudf_type_id() const; - // Returns the triton string representation - std::string triton_str() const; + // Returns the triton string representation + std::string triton_str() const; - // from template - template - static DType create() { - return DType(neo::DataType::create()); - } + // from template + template + static DType create() + { + return DType(DataType::create()); + } - // From cudf - static DType from_cudf(cudf::type_id tid); + // From cudf + static DType from_cudf(cudf::type_id tid); - // From triton - static DType from_triton(const std::string &type_str); - }; + // From triton + static DType from_triton(const std::string &type_str); +}; - template - DType type_to_dtype() { - return DType::from_triton(cudf::type_to_id); - } +template +DType type_to_dtype() +{ + return DType::from_triton(cudf::type_to_id); +} } // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/utilities/type_util_detail.hpp b/morpheus/_lib/include/morpheus/utilities/type_util_detail.hpp new file mode 100644 index 0000000000..90dfe85486 --- /dev/null +++ b/morpheus/_lib/include/morpheus/utilities/type_util_detail.hpp @@ -0,0 +1,163 @@ +/** + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include +#include +#include +#include + +#ifndef NDEBUG +#include +#endif + +namespace morpheus { + +// Pulled from cuDF +template +constexpr std::size_t size_in_bits() +{ + static_assert(CHAR_BIT == 8, "Size of a byte must be 8 bits."); + return sizeof(T) * CHAR_BIT; +} + +// Pulled from cudf +enum class TypeId : int32_t +{ + EMPTY, ///< Always null with no underlying data + INT8, ///< 1 byte signed integer + INT16, ///< 2 byte signed integer + INT32, ///< 4 byte signed integer + INT64, ///< 8 byte signed integer + UINT8, ///< 1 byte unsigned integer + UINT16, ///< 2 byte unsigned integer + UINT32, ///< 4 byte unsigned integer + UINT64, ///< 8 byte unsigned integer + FLOAT32, ///< 4 byte floating point + FLOAT64, ///< 8 byte floating point + BOOL8, ///< Boolean using one byte per value, 0 == false, else true + + // TIMESTAMP_DAYS, ///< point in time in days since Unix Epoch in int32 + // TIMESTAMP_SECONDS, ///< point in time in seconds since Unix Epoch in int64 + // TIMESTAMP_MILLISECONDS, ///< point in time in milliseconds since Unix Epoch in int64 + // TIMESTAMP_MICROSECONDS, ///< point in time in microseconds since Unix Epoch in int64 + // TIMESTAMP_NANOSECONDS, ///< point in time in nanoseconds since Unix Epoch in int64 + // DURATION_DAYS, ///< time interval of days in int32 + // DURATION_SECONDS, ///< time interval of seconds in int64 + // DURATION_MILLISECONDS, ///< time interval of milliseconds in int64 + // DURATION_MICROSECONDS, ///< time interval of microseconds in int64 + // DURATION_NANOSECONDS, ///< time interval of nanoseconds in int64 + // DICTIONARY32, ///< Dictionary type using int32 indices + // STRING, ///< String elements + // LIST, ///< List elements + // DECIMAL32, ///< Fixed-point type with int32_t + // DECIMAL64, ///< Fixed-point type with int64_t + // STRUCT, ///< Struct elements + + // `NUM_TYPE_IDS` must be last! + NUM_TYPE_IDS ///< Total number of type ids +}; + +struct DataType +{ + DataType(TypeId tid); + + TypeId type_id() const; + + // Number of bytes per item + size_t item_size() const; + + // Pretty print + std::string name() const; + + // Returns the numpy string representation + std::string type_str() const; + + // // Returns the triton string representation + // std::string triton_str() const; + + bool operator==(const DataType& other) const; + + // from template + template + static DataType create() + { + if constexpr (std::is_integral_v && std::is_signed_v && size_in_bits() == 8) + { + return DataType(TypeId::INT8); + } + else if constexpr (std::is_integral_v && std::is_signed_v && size_in_bits() == 16) + { + return DataType(TypeId::INT16); + } + else if constexpr (std::is_integral_v && std::is_signed_v && size_in_bits() == 32) + { + return DataType(TypeId::INT32); + } + else if constexpr (std::is_integral_v && std::is_signed_v && size_in_bits() == 64) + { + return DataType(TypeId::INT64); + } + else if constexpr (std::is_integral_v && std::is_unsigned_v && size_in_bits() == 8) + { + return DataType(TypeId::UINT8); + } + else if constexpr (std::is_integral_v && std::is_unsigned_v && size_in_bits() == 16) + { + return DataType(TypeId::UINT16); + } + else if constexpr (std::is_integral_v && std::is_unsigned_v && size_in_bits() == 32) + { + return DataType(TypeId::UINT32); + } + else if constexpr (std::is_integral_v && std::is_unsigned_v && size_in_bits() == 64) + { + return DataType(TypeId::UINT64); + } + else if constexpr (std::is_floating_point_v && size_in_bits() == 32) + { + return DataType(TypeId::FLOAT32); + } + else if constexpr (std::is_floating_point_v && size_in_bits() == 64) + { + return DataType(TypeId::FLOAT64); + } + else if constexpr (std::is_same_v) + { + return DataType(TypeId::BOOL8); + } + else + { + static_assert(!sizeof(T), "Type not implemented"); + } + + // To hide compiler warnings + return DataType(TypeId::EMPTY); + } + + // From numpy + static DataType from_numpy(const std::string& numpy_str); + + protected: + char type_char() const; + + TypeId m_type_id; +}; + +} // namespace morpheus diff --git a/morpheus/_lib/src/messages/memory/inference_memory_fil.cpp b/morpheus/_lib/src/messages/memory/inference_memory_fil.cpp index edce8c0f07..37fc21407f 100644 --- a/morpheus/_lib/src/messages/memory/inference_memory_fil.cpp +++ b/morpheus/_lib/src/messages/memory/inference_memory_fil.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,9 +15,9 @@ * limitations under the License. */ -#include #include #include +#include #include #include @@ -31,70 +31,83 @@ #include namespace morpheus { - /****** Component public implementations *******************/ - /****** InferenceMemoryFIL****************************************/ - InferenceMemoryFIL::InferenceMemoryFIL(size_t count, neo::TensorObject input__0, neo::TensorObject seq_ids) - : InferenceMemory( - count) { - this->inputs["input__0"] = std::move(input__0); - this->inputs["seq_ids"] = std::move(seq_ids); - } - - const neo::TensorObject &InferenceMemoryFIL::get_input__0() const { - auto found = this->inputs.find("input__0"); - if (found == this->inputs.end()) { - throw std::runtime_error("Tensor: 'input__0' not found in memory"); - } - - return found->second; - } - - void InferenceMemoryFIL::set_input__0(neo::TensorObject input__0) { - this->inputs["input__0"] = std::move(input__0); - } - - const neo::TensorObject &InferenceMemoryFIL::get_seq_ids() const { - auto found = this->inputs.find("seq_ids"); - if (found == this->inputs.end()) { - throw std::runtime_error("Tensor: 'seq_ids' not found in memory"); - } - - return found->second; +/****** Component public implementations *******************/ +/****** InferenceMemoryFIL****************************************/ +InferenceMemoryFIL::InferenceMemoryFIL(size_t count, TensorObject input__0, TensorObject seq_ids) : + InferenceMemory(count) +{ + this->inputs["input__0"] = std::move(input__0); + this->inputs["seq_ids"] = std::move(seq_ids); +} + +const TensorObject &InferenceMemoryFIL::get_input__0() const +{ + auto found = this->inputs.find("input__0"); + if (found == this->inputs.end()) + { + throw std::runtime_error("Tensor: 'input__0' not found in memory"); } - void InferenceMemoryFIL::set_seq_ids(neo::TensorObject seq_ids) { - this->inputs["seq_ids"] = std::move(seq_ids); - } - /****** InferenceMemoryFILInterfaceProxy *************************/ - std::shared_ptr - InferenceMemoryFILInterfaceProxy::init(cudf::size_type count, pybind11::object input__0, pybind11::object seq_ids) { - // Convert the cupy arrays to tensors - return std::make_shared(count, - std::move(CupyUtil::cupy_to_tensor(input__0)), - std::move(CupyUtil::cupy_to_tensor(seq_ids))); - } - - std::size_t InferenceMemoryFILInterfaceProxy::count(InferenceMemoryFIL& self) { - return self.count; - } - - neo::TensorObject InferenceMemoryFILInterfaceProxy::get_tensor(InferenceMemoryFIL &self, const std::string &name) { - return self.inputs[name]; - } + return found->second; +} - pybind11::object InferenceMemoryFILInterfaceProxy::get_input__0(InferenceMemoryFIL &self) { - return CupyUtil::tensor_to_cupy(self.get_input__0()); - } +void InferenceMemoryFIL::set_input__0(TensorObject input__0) +{ + this->inputs["input__0"] = std::move(input__0); +} - void InferenceMemoryFILInterfaceProxy::set_input__0(InferenceMemoryFIL &self, pybind11::object cupy_values) { - self.set_input__0(CupyUtil::cupy_to_tensor(cupy_values)); +const TensorObject &InferenceMemoryFIL::get_seq_ids() const +{ + auto found = this->inputs.find("seq_ids"); + if (found == this->inputs.end()) + { + throw std::runtime_error("Tensor: 'seq_ids' not found in memory"); } - pybind11::object InferenceMemoryFILInterfaceProxy::get_seq_ids(InferenceMemoryFIL &self) { - return CupyUtil::tensor_to_cupy(self.get_seq_ids()); - } - - void InferenceMemoryFILInterfaceProxy::set_seq_ids(InferenceMemoryFIL &self, pybind11::object cupy_values) { - return self.set_seq_ids(CupyUtil::cupy_to_tensor(cupy_values)); - } -} \ No newline at end of file + return found->second; +} + +void InferenceMemoryFIL::set_seq_ids(TensorObject seq_ids) +{ + this->inputs["seq_ids"] = std::move(seq_ids); +} +/****** InferenceMemoryFILInterfaceProxy *************************/ +std::shared_ptr InferenceMemoryFILInterfaceProxy::init(cudf::size_type count, + pybind11::object input__0, + pybind11::object seq_ids) +{ + // Convert the cupy arrays to tensors + return std::make_shared( + count, std::move(CupyUtil::cupy_to_tensor(input__0)), std::move(CupyUtil::cupy_to_tensor(seq_ids))); +} + +std::size_t InferenceMemoryFILInterfaceProxy::count(InferenceMemoryFIL &self) +{ + return self.count; +} + +TensorObject InferenceMemoryFILInterfaceProxy::get_tensor(InferenceMemoryFIL &self, const std::string &name) +{ + return self.inputs[name]; +} + +pybind11::object InferenceMemoryFILInterfaceProxy::get_input__0(InferenceMemoryFIL &self) +{ + return CupyUtil::tensor_to_cupy(self.get_input__0()); +} + +void InferenceMemoryFILInterfaceProxy::set_input__0(InferenceMemoryFIL &self, pybind11::object cupy_values) +{ + self.set_input__0(CupyUtil::cupy_to_tensor(cupy_values)); +} + +pybind11::object InferenceMemoryFILInterfaceProxy::get_seq_ids(InferenceMemoryFIL &self) +{ + return CupyUtil::tensor_to_cupy(self.get_seq_ids()); +} + +void InferenceMemoryFILInterfaceProxy::set_seq_ids(InferenceMemoryFIL &self, pybind11::object cupy_values) +{ + return self.set_seq_ids(CupyUtil::cupy_to_tensor(cupy_values)); +} +} // namespace morpheus diff --git a/morpheus/_lib/src/messages/memory/inference_memory_nlp.cpp b/morpheus/_lib/src/messages/memory/inference_memory_nlp.cpp index e1815a6609..d262f7c45b 100644 --- a/morpheus/_lib/src/messages/memory/inference_memory_nlp.cpp +++ b/morpheus/_lib/src/messages/memory/inference_memory_nlp.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -26,93 +26,112 @@ #include namespace morpheus { - /****** Component public implementations *******************/ - /****** InferenceMemoryNLP ****************************************/ - InferenceMemoryNLP::InferenceMemoryNLP(std::size_t count, - neo::TensorObject input_ids, - neo::TensorObject input_mask, - neo::TensorObject seq_ids) : - InferenceMemory(count) { - this->inputs["input_ids"] = std::move(input_ids); - this->inputs["input_mask"] = std::move(input_mask); - this->inputs["seq_ids"] = std::move(seq_ids); +/****** Component public implementations *******************/ +/****** InferenceMemoryNLP ****************************************/ +InferenceMemoryNLP::InferenceMemoryNLP(std::size_t count, + TensorObject input_ids, + TensorObject input_mask, + TensorObject seq_ids) : + InferenceMemory(count) +{ + this->inputs["input_ids"] = std::move(input_ids); + this->inputs["input_mask"] = std::move(input_mask); + this->inputs["seq_ids"] = std::move(seq_ids); +} + +const TensorObject &InferenceMemoryNLP::get_input_ids() const +{ + auto found = this->inputs.find("input_ids"); + if (found == this->inputs.end()) + { + throw std::runtime_error("Tensor: 'input_ids' not found in memory"); } - const neo::TensorObject &InferenceMemoryNLP::get_input_ids() const { - auto found = this->inputs.find("input_ids"); - if (found == this->inputs.end()) { - throw std::runtime_error("Tensor: 'input_ids' not found in memory"); - } + return found->second; +} - return found->second; - } - - void InferenceMemoryNLP::set_input_ids(neo::TensorObject input_ids) { - this->inputs["input_ids"] = std::move(input_ids); - } - - const neo::TensorObject &InferenceMemoryNLP::get_input_mask() const { - auto found = this->inputs.find("input_mask"); - if (found == this->inputs.end()) { - throw std::runtime_error("Tensor: 'input_mask' not found in memory"); - } - - return found->second; - } - - void InferenceMemoryNLP::set_input_mask(neo::TensorObject input_mask) { - this->inputs["input_mask"] = std::move(input_mask); - } - - const neo::TensorObject &InferenceMemoryNLP::get_seq_ids() const { - auto found = this->inputs.find("seq_ids"); - if (found == this->inputs.end()) { - throw std::runtime_error("Tensor: 'seq_ids' not found in memory"); - } - - return found->second; - } +void InferenceMemoryNLP::set_input_ids(TensorObject input_ids) +{ + this->inputs["input_ids"] = std::move(input_ids); +} - void InferenceMemoryNLP::set_seq_ids(neo::TensorObject seq_ids) { - this->inputs["seq_ids"] = std::move(seq_ids); +const TensorObject &InferenceMemoryNLP::get_input_mask() const +{ + auto found = this->inputs.find("input_mask"); + if (found == this->inputs.end()) + { + throw std::runtime_error("Tensor: 'input_mask' not found in memory"); } - /****** InferenceMemoryNLPInterfaceProxy *************************/ - std::shared_ptr - InferenceMemoryNLPInterfaceProxy::init(cudf::size_type count, pybind11::object input_ids, - pybind11::object input_mask, pybind11::object seq_ids) { - // Convert the cupy arrays to tensors - return std::make_shared(count, - std::move(CupyUtil::cupy_to_tensor(input_ids)), - std::move(CupyUtil::cupy_to_tensor(input_mask)), - std::move(CupyUtil::cupy_to_tensor(seq_ids))); - } - - std::size_t InferenceMemoryNLPInterfaceProxy::count(InferenceMemoryNLP& self) { - return self.count; - } + return found->second; +} - pybind11::object InferenceMemoryNLPInterfaceProxy::get_input_ids(InferenceMemoryNLP &self) { - return CupyUtil::tensor_to_cupy(self.get_input_ids()); - } - - void InferenceMemoryNLPInterfaceProxy::set_input_ids(InferenceMemoryNLP &self, pybind11::object cupy_values) { - self.set_input_ids(CupyUtil::cupy_to_tensor(cupy_values)); - } +void InferenceMemoryNLP::set_input_mask(TensorObject input_mask) +{ + this->inputs["input_mask"] = std::move(input_mask); +} - pybind11::object InferenceMemoryNLPInterfaceProxy::get_input_mask(InferenceMemoryNLP &self) { - return CupyUtil::tensor_to_cupy(self.get_input_mask()); +const TensorObject &InferenceMemoryNLP::get_seq_ids() const +{ + auto found = this->inputs.find("seq_ids"); + if (found == this->inputs.end()) + { + throw std::runtime_error("Tensor: 'seq_ids' not found in memory"); } - void InferenceMemoryNLPInterfaceProxy::set_input_mask(InferenceMemoryNLP &self, pybind11::object cupy_values) { - return self.set_input_mask(CupyUtil::cupy_to_tensor(cupy_values)); - } - - pybind11::object InferenceMemoryNLPInterfaceProxy::get_seq_ids(InferenceMemoryNLP &self) { - return CupyUtil::tensor_to_cupy(self.get_seq_ids()); - } - - void InferenceMemoryNLPInterfaceProxy::set_seq_ids(InferenceMemoryNLP &self, pybind11::object cupy_values) { - return self.set_seq_ids(CupyUtil::cupy_to_tensor(cupy_values)); - } -} \ No newline at end of file + return found->second; +} + +void InferenceMemoryNLP::set_seq_ids(TensorObject seq_ids) +{ + this->inputs["seq_ids"] = std::move(seq_ids); +} + +/****** InferenceMemoryNLPInterfaceProxy *************************/ +std::shared_ptr InferenceMemoryNLPInterfaceProxy::init(cudf::size_type count, + pybind11::object input_ids, + pybind11::object input_mask, + pybind11::object seq_ids) +{ + // Convert the cupy arrays to tensors + return std::make_shared(count, + std::move(CupyUtil::cupy_to_tensor(input_ids)), + std::move(CupyUtil::cupy_to_tensor(input_mask)), + std::move(CupyUtil::cupy_to_tensor(seq_ids))); +} + +std::size_t InferenceMemoryNLPInterfaceProxy::count(InferenceMemoryNLP &self) +{ + return self.count; +} + +pybind11::object InferenceMemoryNLPInterfaceProxy::get_input_ids(InferenceMemoryNLP &self) +{ + return CupyUtil::tensor_to_cupy(self.get_input_ids()); +} + +void InferenceMemoryNLPInterfaceProxy::set_input_ids(InferenceMemoryNLP &self, pybind11::object cupy_values) +{ + self.set_input_ids(CupyUtil::cupy_to_tensor(cupy_values)); +} + +pybind11::object InferenceMemoryNLPInterfaceProxy::get_input_mask(InferenceMemoryNLP &self) +{ + return CupyUtil::tensor_to_cupy(self.get_input_mask()); +} + +void InferenceMemoryNLPInterfaceProxy::set_input_mask(InferenceMemoryNLP &self, pybind11::object cupy_values) +{ + return self.set_input_mask(CupyUtil::cupy_to_tensor(cupy_values)); +} + +pybind11::object InferenceMemoryNLPInterfaceProxy::get_seq_ids(InferenceMemoryNLP &self) +{ + return CupyUtil::tensor_to_cupy(self.get_seq_ids()); +} + +void InferenceMemoryNLPInterfaceProxy::set_seq_ids(InferenceMemoryNLP &self, pybind11::object cupy_values) +{ + return self.set_seq_ids(CupyUtil::cupy_to_tensor(cupy_values)); +} +} // namespace morpheus diff --git a/morpheus/_lib/src/messages/memory/response_memory.cpp b/morpheus/_lib/src/messages/memory/response_memory.cpp index 548342341b..a7d027e92c 100644 --- a/morpheus/_lib/src/messages/memory/response_memory.cpp +++ b/morpheus/_lib/src/messages/memory/response_memory.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -27,30 +27,35 @@ #include namespace morpheus { - /****** Component public implementations *******************/ - /****** ResponseMemory****************************************/ - ResponseMemory::ResponseMemory(size_t count) : count(count) {} - - bool ResponseMemory::has_output(const std::string &name) const { - return this->outputs.find(name) != this->outputs.end(); +/****** Component public implementations *******************/ +/****** ResponseMemory****************************************/ +ResponseMemory::ResponseMemory(size_t count) : count(count) {} + +bool ResponseMemory::has_output(const std::string &name) const +{ + return this->outputs.find(name) != this->outputs.end(); +} + +/****** ResponseMemoryInterfaceProxy *************************/ +pybind11::object ResponseMemoryInterfaceProxy::get_output(ResponseMemory &self, const std::string &name) +{ + // Directly return the tensor object + if (!self.has_output(name)) + { + throw pybind11::key_error(); } - /****** ResponseMemoryInterfaceProxy *************************/ - pybind11::object ResponseMemoryInterfaceProxy::get_output(ResponseMemory &self, const std::string &name) { - // Directly return the tensor object - if (!self.has_output(name)) { - throw pybind11::key_error(); - } + return CupyUtil::tensor_to_cupy(self.outputs[name]); +} - return CupyUtil::tensor_to_cupy(self.outputs[name]); +TensorObject ResponseMemoryInterfaceProxy::get_output_tensor(ResponseMemory &self, const std::string &name) +{ + // Directly return the tensor object + if (!self.has_output(name)) + { + throw pybind11::key_error(); } - neo::TensorObject ResponseMemoryInterfaceProxy::get_output_tensor(ResponseMemory &self, const std::string &name) { - // Directly return the tensor object - if (!self.has_output(name)) { - throw pybind11::key_error(); - } - - return self.outputs[name]; - } -} \ No newline at end of file + return self.outputs[name]; +} +} // namespace morpheus diff --git a/morpheus/_lib/src/messages/memory/response_memory_probs.cpp b/morpheus/_lib/src/messages/memory/response_memory_probs.cpp index 81bfa47e5e..617fdfcee4 100644 --- a/morpheus/_lib/src/messages/memory/response_memory_probs.cpp +++ b/morpheus/_lib/src/messages/memory/response_memory_probs.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -25,46 +25,54 @@ #include +#include #include #include -#include namespace morpheus { - /****** Component public implementations *******************/ - /****** ResponseMemoryProbs****************************************/ - ResponseMemoryProbs::ResponseMemoryProbs(size_t count, neo::TensorObject probs) : ResponseMemory(count) { - this->outputs["probs"] = std::move(probs); - } +/****** Component public implementations *******************/ +/****** ResponseMemoryProbs****************************************/ +ResponseMemoryProbs::ResponseMemoryProbs(size_t count, TensorObject probs) : ResponseMemory(count) +{ + this->outputs["probs"] = std::move(probs); +} - const neo::TensorObject &ResponseMemoryProbs::get_probs() const { - auto found = this->outputs.find("probs"); - if (found == this->outputs.end()) { - throw std::runtime_error("Tensor: 'probs' not found in memory"); - } - - return found->second; +const TensorObject &ResponseMemoryProbs::get_probs() const +{ + auto found = this->outputs.find("probs"); + if (found == this->outputs.end()) + { + throw std::runtime_error("Tensor: 'probs' not found in memory"); } - void ResponseMemoryProbs::set_probs(neo::TensorObject probs) { - this->outputs["probs"] = std::move(probs); - } + return found->second; +} - /****** ResponseMemoryProbsInterfaceProxy *************************/ - std::shared_ptr - ResponseMemoryProbsInterfaceProxy::init(cudf::size_type count, pybind11::object probs) { - // Conver the cupy arrays to tensors - return std::make_shared(count, std::move(CupyUtil::cupy_to_tensor(probs))); - } +void ResponseMemoryProbs::set_probs(TensorObject probs) +{ + this->outputs["probs"] = std::move(probs); +} - std::size_t ResponseMemoryProbsInterfaceProxy::count(ResponseMemoryProbs &self) { - return self.count; - } +/****** ResponseMemoryProbsInterfaceProxy *************************/ +std::shared_ptr ResponseMemoryProbsInterfaceProxy::init(cudf::size_type count, + pybind11::object probs) +{ + // Conver the cupy arrays to tensors + return std::make_shared(count, std::move(CupyUtil::cupy_to_tensor(probs))); +} - pybind11::object ResponseMemoryProbsInterfaceProxy::get_probs(ResponseMemoryProbs &self) { - return CupyUtil::tensor_to_cupy(self.get_probs()); - } +std::size_t ResponseMemoryProbsInterfaceProxy::count(ResponseMemoryProbs &self) +{ + return self.count; +} - void ResponseMemoryProbsInterfaceProxy::set_probs(ResponseMemoryProbs &self, pybind11::object cupy_values) { - self.set_probs(CupyUtil::cupy_to_tensor(cupy_values)); - } -} \ No newline at end of file +pybind11::object ResponseMemoryProbsInterfaceProxy::get_probs(ResponseMemoryProbs &self) +{ + return CupyUtil::tensor_to_cupy(self.get_probs()); +} + +void ResponseMemoryProbsInterfaceProxy::set_probs(ResponseMemoryProbs &self, pybind11::object cupy_values) +{ + self.set_probs(CupyUtil::cupy_to_tensor(cupy_values)); +} +} // namespace morpheus diff --git a/morpheus/_lib/src/messages/multi.cpp b/morpheus/_lib/src/messages/multi.cpp index 54565ab948..c1660ddbb3 100644 --- a/morpheus/_lib/src/messages/multi.cpp +++ b/morpheus/_lib/src/messages/multi.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -75,14 +75,14 @@ std::shared_ptr MultiMessage::internal_get_slice(size_t start, siz return std::make_shared(this->meta, mess_start, mess_stop - mess_start); } -void MultiMessage::set_meta(const std::string &col_name, neo::TensorObject tensor) +void MultiMessage::set_meta(const std::string &col_name, TensorObject tensor) { - set_meta(std::vector{col_name}, std::vector{tensor}); + set_meta(std::vector{col_name}, std::vector{tensor}); } -void MultiMessage::set_meta(const std::vector &column_names, const std::vector &tensors) +void MultiMessage::set_meta(const std::vector &column_names, const std::vector &tensors) { - std::vector tensor_types{tensors.size()}; + std::vector tensor_types{tensors.size()}; for (size_t i = 0; i < tensors.size(); ++i) { tensor_types[i] = tensors[i].dtype().type_id(); diff --git a/morpheus/_lib/src/messages/multi_inference.cpp b/morpheus/_lib/src/messages/multi_inference.cpp index b2c1db6ecd..022b80d114 100644 --- a/morpheus/_lib/src/messages/multi_inference.cpp +++ b/morpheus/_lib/src/messages/multi_inference.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,119 +17,137 @@ #include +#include #include #include -#include #include #include -#include #include +#include #include #include #include namespace morpheus { - /****** Component public implementations *******************/ - /****** ****************************************/ - MultiInferenceMessage::MultiInferenceMessage(std::shared_ptr meta, std::size_t mess_offset, - std::size_t mess_count, std::shared_ptr memory, - std::size_t offset, std::size_t count) : - MultiMessage(meta, mess_offset, mess_count), - memory(std::move(memory)), - offset(offset), - count(count) {} - - const neo::TensorObject MultiInferenceMessage::get_input(const std::string &name) const { - CHECK(this->memory->has_input(name)) << "Cound not find input: " << name; - - // check if we are getting the entire input - if (this->offset == 0 && this->count == this->memory->count) { - return this->memory->inputs[name]; - } - - // TODO(MDD): This really needs to return the slice of the tensor - return this->memory->inputs[name].slice({static_cast(this->offset), 0}, - {static_cast(this->offset + this->count), -1}); +/****** Component public implementations *******************/ +/****** ****************************************/ +MultiInferenceMessage::MultiInferenceMessage(std::shared_ptr meta, + std::size_t mess_offset, + std::size_t mess_count, + std::shared_ptr memory, + std::size_t offset, + std::size_t count) : + MultiMessage(meta, mess_offset, mess_count), + memory(std::move(memory)), + offset(offset), + count(count) +{} + +const TensorObject MultiInferenceMessage::get_input(const std::string &name) const +{ + CHECK(this->memory->has_input(name)) << "Cound not find input: " << name; + + // check if we are getting the entire input + if (this->offset == 0 && this->count == this->memory->count) + { + return this->memory->inputs[name]; } - const void MultiInferenceMessage::set_input(const std::string &name, const neo::TensorObject &value) { - // Get the input slice first - auto slice = this->get_input(name); + // TODO(MDD): This really needs to return the slice of the tensor + return this->memory->inputs[name].slice({static_cast(this->offset), 0}, + {static_cast(this->offset + this->count), -1}); +} - // Set the value to use assignment - slice = value; - } +const void MultiInferenceMessage::set_input(const std::string &name, const TensorObject &value) +{ + // Get the input slice first + auto slice = this->get_input(name); - std::shared_ptr MultiInferenceMessage::get_slice(std::size_t start, std::size_t stop) const { - // This can only cast down - return std::static_pointer_cast(this->internal_get_slice(start, stop)); - } + // Set the value to use assignment + slice = value; +} - std::shared_ptr MultiInferenceMessage::internal_get_slice(std::size_t start, std::size_t stop) const { - CHECK(this->mess_count == this->count) << "At this time, mess_count and count must be the same for slicing"; +std::shared_ptr MultiInferenceMessage::get_slice(std::size_t start, std::size_t stop) const +{ + // This can only cast down + return std::static_pointer_cast(this->internal_get_slice(start, stop)); +} - auto mess_start = this->mess_offset + start; - auto mess_stop = this->mess_offset + stop; +std::shared_ptr MultiInferenceMessage::internal_get_slice(std::size_t start, std::size_t stop) const +{ + CHECK(this->mess_count == this->count) << "At this time, mess_count and count must be the same for slicing"; - // If we have more inference rows than message rows, we need to use the seq_ids to figure out the slicing. This - // will be slow and should be avoided at all costs - if (this->memory->has_input("seq_ids") && this->count != this->mess_count) { - auto seq_ids = this->get_input("seq_ids"); + auto mess_start = this->mess_offset + start; + auto mess_stop = this->mess_offset + stop; - // Convert to MatX to access elements - mess_start = this->mess_offset + seq_ids.read_element({(neo::TensorIndex) start, 0}); - mess_stop = this->mess_offset + seq_ids.read_element({(neo::TensorIndex) stop - 1, 0}) + 1; - } + // If we have more inference rows than message rows, we need to use the seq_ids to figure out the slicing. This + // will be slow and should be avoided at all costs + if (this->memory->has_input("seq_ids") && this->count != this->mess_count) + { + auto seq_ids = this->get_input("seq_ids"); - return std::make_shared( - this->meta, mess_start, mess_stop - mess_start, this->memory, start, stop - start); + // Convert to MatX to access elements + mess_start = this->mess_offset + seq_ids.read_element({(TensorIndex)start, 0}); + mess_stop = this->mess_offset + seq_ids.read_element({(TensorIndex)stop - 1, 0}) + 1; } - /****** InterfaceProxy *************************/ - std::shared_ptr - MultiInferenceMessageInterfaceProxy::init(std::shared_ptr meta, cudf::size_type mess_offset, - cudf::size_type mess_count, std::shared_ptr memory, - cudf::size_type offset, cudf::size_type count) { - return std::make_shared( - std::move(meta), mess_offset, mess_count, std::move(memory), offset, count); - } + return std::make_shared( + this->meta, mess_start, mess_stop - mess_start, this->memory, start, stop - start); +} - std::shared_ptr - MultiInferenceMessageInterfaceProxy::memory(MultiInferenceMessage &self) { - return self.memory; - } +/****** InterfaceProxy *************************/ +std::shared_ptr MultiInferenceMessageInterfaceProxy::init( + std::shared_ptr meta, + cudf::size_type mess_offset, + cudf::size_type mess_count, + std::shared_ptr memory, + cudf::size_type offset, + cudf::size_type count) +{ + return std::make_shared( + std::move(meta), mess_offset, mess_count, std::move(memory), offset, count); +} - std::size_t MultiInferenceMessageInterfaceProxy::offset(MultiInferenceMessage &self) { - return self.offset; - } +std::shared_ptr MultiInferenceMessageInterfaceProxy::memory(MultiInferenceMessage &self) +{ + return self.memory; +} - std::size_t MultiInferenceMessageInterfaceProxy::count(MultiInferenceMessage &self) { - return self.count; - } +std::size_t MultiInferenceMessageInterfaceProxy::offset(MultiInferenceMessage &self) +{ + return self.offset; +} - pybind11::object - MultiInferenceMessageInterfaceProxy::get_input(MultiInferenceMessage &self, const std::string &name) { - const auto &py_tensor = CupyUtil::tensor_to_cupy(self.get_input(name)); +std::size_t MultiInferenceMessageInterfaceProxy::count(MultiInferenceMessage &self) +{ + return self.count; +} - // // Need to get just our portion. TODO(MDD): THis should be handled in get_input - // py::object sliced = py_tensor[py::make_tuple( - // py::slice(py::int_(self.offset), py::int_(self.offset + self.count), py::none()), - // py::slice(py::none(), py::none(), py::none()))]; +pybind11::object MultiInferenceMessageInterfaceProxy::get_input(MultiInferenceMessage &self, const std::string &name) +{ + const auto &py_tensor = CupyUtil::tensor_to_cupy(self.get_input(name)); - return py_tensor; - } + // // Need to get just our portion. TODO(MDD): THis should be handled in get_input + // py::object sliced = py_tensor[py::make_tuple( + // py::slice(py::int_(self.offset), py::int_(self.offset + self.count), py::none()), + // py::slice(py::none(), py::none(), py::none()))]; - std::shared_ptr - MultiInferenceMessageInterfaceProxy::get_slice(MultiInferenceMessage &self, std::size_t start, std::size_t stop) { - // py::object seq_ids = CupyUtil::tensor_to_cupy(self.get_input("seq_ids"), m); + return py_tensor; +} - // int mess_start = seq_ids[py::make_tuple(start, 0)].attr("item")().cast(); - // int mess_stop = seq_ids[py::make_tuple(stop - 1, 0)].attr("item")().cast() + 1; +std::shared_ptr MultiInferenceMessageInterfaceProxy::get_slice(MultiInferenceMessage &self, + std::size_t start, + std::size_t stop) +{ + // py::object seq_ids = CupyUtil::tensor_to_cupy(self.get_input("seq_ids"), m); - // return std::make_shared( - // self.meta, mess_start, mess_stop - mess_start, self.memory, start, stop - start); - return self.get_slice(start, stop); - } + // int mess_start = seq_ids[py::make_tuple(start, 0)].attr("item")().cast(); + // int mess_stop = seq_ids[py::make_tuple(stop - 1, 0)].attr("item")().cast() + 1; + + // return std::make_shared( + // self.meta, mess_start, mess_stop - mess_start, self.memory, start, stop - start); + return self.get_slice(start, stop); } +} // namespace morpheus diff --git a/morpheus/_lib/src/messages/multi_inference_fil.cpp b/morpheus/_lib/src/messages/multi_inference_fil.cpp index fe1e3f0bb0..356a9d7bbd 100644 --- a/morpheus/_lib/src/messages/multi_inference_fil.cpp +++ b/morpheus/_lib/src/messages/multi_inference_fil.cpp @@ -1,26 +1,26 @@ /** -* SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. -* SPDX-License-Identifier: Apache-2.0 -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and - * limitations under the License. -*/ + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ #include -#include -#include #include +#include #include +#include #include @@ -29,51 +29,64 @@ #include namespace morpheus { - /****** Component public implementations *******************/ - /****** MultiInferenceFILMessage****************************************/ - MultiInferenceFILMessage::MultiInferenceFILMessage(std::shared_ptr meta, size_t mess_offset, - size_t mess_count, - std::shared_ptr memory, size_t offset, - size_t count) : - MultiInferenceMessage(meta, mess_offset, mess_count, memory, offset, count) {} +/****** Component public implementations *******************/ +/****** MultiInferenceFILMessage****************************************/ +MultiInferenceFILMessage::MultiInferenceFILMessage(std::shared_ptr meta, + size_t mess_offset, + size_t mess_count, + std::shared_ptr memory, + size_t offset, + size_t count) : + MultiInferenceMessage(meta, mess_offset, mess_count, memory, offset, count) +{} - const neo::TensorObject MultiInferenceFILMessage::get_input__0() const { - return this->get_input("input__0"); - } +const TensorObject MultiInferenceFILMessage::get_input__0() const +{ + return this->get_input("input__0"); +} - void MultiInferenceFILMessage::set_input__0(const neo::TensorObject &input__0) { - this->set_input("input__0", input__0); - } +void MultiInferenceFILMessage::set_input__0(const TensorObject &input__0) +{ + this->set_input("input__0", input__0); +} - const neo::TensorObject MultiInferenceFILMessage::get_seq_ids() const { - return this->get_input("seq_ids"); - } +const TensorObject MultiInferenceFILMessage::get_seq_ids() const +{ + return this->get_input("seq_ids"); +} - void MultiInferenceFILMessage::set_seq_ids(const neo::TensorObject &seq_ids) { - this->set_input("seq_ids", seq_ids); - } - /****** MultiInferenceFILMessageInterfaceProxy *************************/ - std::shared_ptr - MultiInferenceFILMessageInterfaceProxy::init(std::shared_ptr meta, cudf::size_type mess_offset, - cudf::size_type mess_count, std::shared_ptr memory, - cudf::size_type offset, cudf::size_type count) { - return std::make_shared( - std::move(meta), mess_offset, mess_count, std::move(memory), offset, count); - } +void MultiInferenceFILMessage::set_seq_ids(const TensorObject &seq_ids) +{ + this->set_input("seq_ids", seq_ids); +} +/****** MultiInferenceFILMessageInterfaceProxy *************************/ +std::shared_ptr MultiInferenceFILMessageInterfaceProxy::init( + std::shared_ptr meta, + cudf::size_type mess_offset, + cudf::size_type mess_count, + std::shared_ptr memory, + cudf::size_type offset, + cudf::size_type count) +{ + return std::make_shared( + std::move(meta), mess_offset, mess_count, std::move(memory), offset, count); +} - std::shared_ptr - MultiInferenceFILMessageInterfaceProxy::memory(MultiInferenceFILMessage &self) { - return self.memory; - } +std::shared_ptr MultiInferenceFILMessageInterfaceProxy::memory( + MultiInferenceFILMessage &self) +{ + return self.memory; +} - std::size_t MultiInferenceFILMessageInterfaceProxy::offset(MultiInferenceFILMessage &self) { - return self.count; - } +std::size_t MultiInferenceFILMessageInterfaceProxy::offset(MultiInferenceFILMessage &self) +{ + return self.count; +} - std::size_t MultiInferenceFILMessageInterfaceProxy::count(MultiInferenceFILMessage &self) { - return self.count; - } +std::size_t MultiInferenceFILMessageInterfaceProxy::count(MultiInferenceFILMessage &self) +{ + return self.count; } +} // namespace morpheus // Created by drobison on 3/17/22. // - diff --git a/morpheus/_lib/src/messages/multi_inference_nlp.cpp b/morpheus/_lib/src/messages/multi_inference_nlp.cpp index bf71e53c55..d1b02bae4e 100644 --- a/morpheus/_lib/src/messages/multi_inference_nlp.cpp +++ b/morpheus/_lib/src/messages/multi_inference_nlp.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,14 +13,14 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. -*/ + */ #include -#include -#include #include +#include #include +#include #include #include @@ -32,79 +32,97 @@ #include namespace morpheus { - /****** Component public implementations *******************/ - /****** MultiInferenceNLPMessage****************************************/ - MultiInferenceNLPMessage::MultiInferenceNLPMessage(std::shared_ptr meta, size_t mess_offset, - size_t mess_count, - std::shared_ptr memory, size_t offset, - size_t count) : - MultiInferenceMessage(meta, mess_offset, mess_count, memory, offset, count) {} - - const neo::TensorObject MultiInferenceNLPMessage::get_input_ids() const { - return this->get_input("input_ids"); - } - - void MultiInferenceNLPMessage::set_input_ids(const neo::TensorObject &input_ids) { - this->set_input("input_ids", input_ids); - } - - const neo::TensorObject MultiInferenceNLPMessage::get_input_mask() const { - return this->get_input("input_mask"); - } - - void MultiInferenceNLPMessage::set_input_mask(const neo::TensorObject &input_mask) { - this->set_input("input_mask", input_mask); - } - - const neo::TensorObject MultiInferenceNLPMessage::get_seq_ids() const { - return this->get_input("seq_ids"); - } - - void MultiInferenceNLPMessage::set_seq_ids(const neo::TensorObject &seq_ids) { - this->set_input("seq_ids", seq_ids); - } - - /****** MultiInferenceNLPMessageInterfaceProxy *************************/ - std::shared_ptr - MultiInferenceNLPMessageInterfaceProxy::init(std::shared_ptr meta, cudf::size_type mess_offset, - cudf::size_type mess_count, std::shared_ptr memory, - cudf::size_type offset, cudf::size_type count) { - return std::make_shared( - std::move(meta), mess_offset, mess_count, std::move(memory), offset, count); - } - - std::shared_ptr - MultiInferenceNLPMessageInterfaceProxy::memory(MultiInferenceNLPMessage &self) { - return self.memory; - } - - std::size_t MultiInferenceNLPMessageInterfaceProxy::offset(MultiInferenceNLPMessage &self) { - return self.count; - } - - std::size_t MultiInferenceNLPMessageInterfaceProxy::count(MultiInferenceNLPMessage &self) { - return self.count; - } - - pybind11::object MultiInferenceNLPMessageInterfaceProxy::input_ids(MultiInferenceNLPMessage &self) { - // Get and convert - auto tensor = self.get_input_ids(); - - return CupyUtil::tensor_to_cupy(tensor); - } - - pybind11::object MultiInferenceNLPMessageInterfaceProxy::input_mask(MultiInferenceNLPMessage &self) { - // Get and convert - auto tensor = self.get_input_mask(); - - return CupyUtil::tensor_to_cupy(tensor); - } - - pybind11::object MultiInferenceNLPMessageInterfaceProxy::seq_ids(MultiInferenceNLPMessage &self) { - // Get and convert - auto tensor = self.get_seq_ids(); - - return CupyUtil::tensor_to_cupy(tensor); - } +/****** Component public implementations *******************/ +/****** MultiInferenceNLPMessage****************************************/ +MultiInferenceNLPMessage::MultiInferenceNLPMessage(std::shared_ptr meta, + size_t mess_offset, + size_t mess_count, + std::shared_ptr memory, + size_t offset, + size_t count) : + MultiInferenceMessage(meta, mess_offset, mess_count, memory, offset, count) +{} + +const TensorObject MultiInferenceNLPMessage::get_input_ids() const +{ + return this->get_input("input_ids"); +} + +void MultiInferenceNLPMessage::set_input_ids(const TensorObject &input_ids) +{ + this->set_input("input_ids", input_ids); +} + +const TensorObject MultiInferenceNLPMessage::get_input_mask() const +{ + return this->get_input("input_mask"); +} + +void MultiInferenceNLPMessage::set_input_mask(const TensorObject &input_mask) +{ + this->set_input("input_mask", input_mask); +} + +const TensorObject MultiInferenceNLPMessage::get_seq_ids() const +{ + return this->get_input("seq_ids"); +} + +void MultiInferenceNLPMessage::set_seq_ids(const TensorObject &seq_ids) +{ + this->set_input("seq_ids", seq_ids); +} + +/****** MultiInferenceNLPMessageInterfaceProxy *************************/ +std::shared_ptr MultiInferenceNLPMessageInterfaceProxy::init( + std::shared_ptr meta, + cudf::size_type mess_offset, + cudf::size_type mess_count, + std::shared_ptr memory, + cudf::size_type offset, + cudf::size_type count) +{ + return std::make_shared( + std::move(meta), mess_offset, mess_count, std::move(memory), offset, count); +} + +std::shared_ptr MultiInferenceNLPMessageInterfaceProxy::memory( + MultiInferenceNLPMessage &self) +{ + return self.memory; +} + +std::size_t MultiInferenceNLPMessageInterfaceProxy::offset(MultiInferenceNLPMessage &self) +{ + return self.count; +} + +std::size_t MultiInferenceNLPMessageInterfaceProxy::count(MultiInferenceNLPMessage &self) +{ + return self.count; } +pybind11::object MultiInferenceNLPMessageInterfaceProxy::input_ids(MultiInferenceNLPMessage &self) +{ + // Get and convert + auto tensor = self.get_input_ids(); + + return CupyUtil::tensor_to_cupy(tensor); +} + +pybind11::object MultiInferenceNLPMessageInterfaceProxy::input_mask(MultiInferenceNLPMessage &self) +{ + // Get and convert + auto tensor = self.get_input_mask(); + + return CupyUtil::tensor_to_cupy(tensor); +} + +pybind11::object MultiInferenceNLPMessageInterfaceProxy::seq_ids(MultiInferenceNLPMessage &self) +{ + // Get and convert + auto tensor = self.get_seq_ids(); + + return CupyUtil::tensor_to_cupy(tensor); +} +} // namespace morpheus diff --git a/morpheus/_lib/src/messages/multi_response.cpp b/morpheus/_lib/src/messages/multi_response.cpp index ec2a1c4ac9..b5f416313f 100644 --- a/morpheus/_lib/src/messages/multi_response.cpp +++ b/morpheus/_lib/src/messages/multi_response.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -35,93 +35,105 @@ namespace morpheus { /****** Component public implementations *******************/ /****** MultiResponseMessage****************************************/ - MultiResponseMessage::MultiResponseMessage(std::shared_ptr meta, - std::size_t mess_offset, - std::size_t mess_count, - std::shared_ptr memory, - std::size_t offset, - std::size_t count) : - MultiMessage(meta, mess_offset, mess_count), - memory(std::move(memory)), - offset(offset), - count(count) {} - - neo::TensorObject MultiResponseMessage::get_output(const std::string &name) { - CHECK(this->memory->has_output(name)) << "Could not find output: " << name; - - // check if we are getting the entire input - if (this->offset == 0 && this->count == this->memory->count) { - return this->memory->outputs[name]; - } - - // TODO(MDD): This really needs to return the slice of the tensor - return this->memory->outputs[name].slice({static_cast(this->offset), 0}, - {static_cast(this->offset + this->count), -1}); +MultiResponseMessage::MultiResponseMessage(std::shared_ptr meta, + std::size_t mess_offset, + std::size_t mess_count, + std::shared_ptr memory, + std::size_t offset, + std::size_t count) : + MultiMessage(meta, mess_offset, mess_count), + memory(std::move(memory)), + offset(offset), + count(count) +{} + +TensorObject MultiResponseMessage::get_output(const std::string &name) +{ + CHECK(this->memory->has_output(name)) << "Could not find output: " << name; + + // check if we are getting the entire input + if (this->offset == 0 && this->count == this->memory->count) + { + return this->memory->outputs[name]; } - const neo::TensorObject MultiResponseMessage::get_output(const std::string &name) const { - CHECK(this->memory->has_output(name)) << "Could not find output: " << name; + // TODO(MDD): This really needs to return the slice of the tensor + return this->memory->outputs[name].slice({static_cast(this->offset), 0}, + {static_cast(this->offset + this->count), -1}); +} - // check if we are getting the entire input - if (this->offset == 0 && this->count == this->memory->count) { - return this->memory->outputs[name]; - } +const TensorObject MultiResponseMessage::get_output(const std::string &name) const +{ + CHECK(this->memory->has_output(name)) << "Could not find output: " << name; - // TODO(MDD): This really needs to return the slice of the tensor - return this->memory->outputs[name].slice({static_cast(this->offset), 0}, - {static_cast(this->offset + this->count), -1}); + // check if we are getting the entire input + if (this->offset == 0 && this->count == this->memory->count) + { + return this->memory->outputs[name]; } - const void MultiResponseMessage::set_output(const std::string &name, const neo::TensorObject &value) { - // Get the input slice first - auto slice = this->get_output(name); + // TODO(MDD): This really needs to return the slice of the tensor + return this->memory->outputs[name].slice({static_cast(this->offset), 0}, + {static_cast(this->offset + this->count), -1}); +} - // Set the value to use assignment - slice = value; - } - - std::shared_ptr MultiResponseMessage::get_slice(std::size_t start, std::size_t stop) const { - // This can only cast down - return std::static_pointer_cast(this->internal_get_slice(start, stop)); - } - - std::shared_ptr MultiResponseMessage::internal_get_slice(std::size_t start, std::size_t stop) const { - CHECK(this->mess_count == this->count) << "At this time, mess_count and count must be the same for slicing"; - - auto mess_start = this->mess_offset + start; - auto mess_stop = this->mess_offset + stop; - - return std::make_shared( - this->meta, mess_start, mess_stop - mess_start, this->memory, start, stop - start); - } +const void MultiResponseMessage::set_output(const std::string &name, const TensorObject &value) +{ + // Get the input slice first + auto slice = this->get_output(name); -/****** MultiResponseMessageInterfaceProxy *************************/ - std::shared_ptr MultiResponseMessageInterfaceProxy::init(std::shared_ptr meta, - cudf::size_type mess_offset, - cudf::size_type mess_count, - std::shared_ptr memory, - cudf::size_type offset, - cudf::size_type count) { - return std::make_shared( - std::move(meta), mess_offset, mess_count, std::move(memory), offset, count); - } + // Set the value to use assignment + slice = value; +} - std::shared_ptr MultiResponseMessageInterfaceProxy::memory(MultiResponseMessage &self) { - return self.memory; - } +std::shared_ptr MultiResponseMessage::get_slice(std::size_t start, std::size_t stop) const +{ + // This can only cast down + return std::static_pointer_cast(this->internal_get_slice(start, stop)); +} - std::size_t MultiResponseMessageInterfaceProxy::offset(MultiResponseMessage &self) { - return self.offset; - } +std::shared_ptr MultiResponseMessage::internal_get_slice(std::size_t start, std::size_t stop) const +{ + CHECK(this->mess_count == this->count) << "At this time, mess_count and count must be the same for slicing"; - std::size_t MultiResponseMessageInterfaceProxy::count(MultiResponseMessage &self) { - return self.count; - } + auto mess_start = this->mess_offset + start; + auto mess_stop = this->mess_offset + stop; - pybind11::object - MultiResponseMessageInterfaceProxy::get_output(MultiResponseMessage &self, const std::string &name) { - auto tensor = self.get_output(name); + return std::make_shared( + this->meta, mess_start, mess_stop - mess_start, this->memory, start, stop - start); +} - return CupyUtil::tensor_to_cupy(tensor); - } +/****** MultiResponseMessageInterfaceProxy *************************/ +std::shared_ptr MultiResponseMessageInterfaceProxy::init(std::shared_ptr meta, + cudf::size_type mess_offset, + cudf::size_type mess_count, + std::shared_ptr memory, + cudf::size_type offset, + cudf::size_type count) +{ + return std::make_shared( + std::move(meta), mess_offset, mess_count, std::move(memory), offset, count); +} + +std::shared_ptr MultiResponseMessageInterfaceProxy::memory(MultiResponseMessage &self) +{ + return self.memory; +} + +std::size_t MultiResponseMessageInterfaceProxy::offset(MultiResponseMessage &self) +{ + return self.offset; +} + +std::size_t MultiResponseMessageInterfaceProxy::count(MultiResponseMessage &self) +{ + return self.count; +} + +pybind11::object MultiResponseMessageInterfaceProxy::get_output(MultiResponseMessage &self, const std::string &name) +{ + auto tensor = self.get_output(name); + + return CupyUtil::tensor_to_cupy(tensor); +} } // namespace morpheus diff --git a/morpheus/_lib/src/messages/multi_response_probs.cpp b/morpheus/_lib/src/messages/multi_response_probs.cpp index 4ad58d50b0..9c029b137f 100644 --- a/morpheus/_lib/src/messages/multi_response_probs.cpp +++ b/morpheus/_lib/src/messages/multi_response_probs.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,63 +17,76 @@ #include -#include #include +#include #include -#include #include +#include #include #include #include namespace morpheus { - /****** Component public implementations *******************/ - /****** MultiResponseProbsMessage****************************************/ - MultiResponseProbsMessage::MultiResponseProbsMessage(std::shared_ptr meta, - size_t mess_offset, size_t mess_count, - std::shared_ptr memory, - size_t offset, size_t count) : - MultiResponseMessage(meta, mess_offset, mess_count, memory, offset, count) {} +/****** Component public implementations *******************/ +/****** MultiResponseProbsMessage****************************************/ +MultiResponseProbsMessage::MultiResponseProbsMessage(std::shared_ptr meta, + size_t mess_offset, + size_t mess_count, + std::shared_ptr memory, + size_t offset, + size_t count) : + MultiResponseMessage(meta, mess_offset, mess_count, memory, offset, count) +{} - const neo::TensorObject MultiResponseProbsMessage::get_probs() const { - return this->get_output("probs"); - } +const TensorObject MultiResponseProbsMessage::get_probs() const +{ + return this->get_output("probs"); +} - void MultiResponseProbsMessage::set_probs(const neo::TensorObject &probs) { - this->set_output("probs", probs); - } +void MultiResponseProbsMessage::set_probs(const TensorObject &probs) +{ + this->set_output("probs", probs); +} - /****** MultiResponseProbsMessageInterfaceProxy *************************/ - /** - * @brief Interface proxy, used to insulate python bindings. - */ - std::shared_ptr - MultiResponseProbsMessageInterfaceProxy::init(std::shared_ptr meta, cudf::size_type mess_offset, - cudf::size_type mess_count, std::shared_ptr memory, - cudf::size_type offset, cudf::size_type count) { - return std::make_shared( - std::move(meta), mess_offset, mess_count, std::move(memory), offset, count); - } +/****** MultiResponseProbsMessageInterfaceProxy *************************/ +/** + * @brief Interface proxy, used to insulate python bindings. + */ +std::shared_ptr MultiResponseProbsMessageInterfaceProxy::init( + std::shared_ptr meta, + cudf::size_type mess_offset, + cudf::size_type mess_count, + std::shared_ptr memory, + cudf::size_type offset, + cudf::size_type count) +{ + return std::make_shared( + std::move(meta), mess_offset, mess_count, std::move(memory), offset, count); +} - std::shared_ptr - MultiResponseProbsMessageInterfaceProxy::memory(MultiResponseProbsMessage &self) { - return self.memory; - } +std::shared_ptr MultiResponseProbsMessageInterfaceProxy::memory( + MultiResponseProbsMessage &self) +{ + return self.memory; +} - std::size_t MultiResponseProbsMessageInterfaceProxy::offset(MultiResponseProbsMessage &self) { - return self.offset; - } +std::size_t MultiResponseProbsMessageInterfaceProxy::offset(MultiResponseProbsMessage &self) +{ + return self.offset; +} - std::size_t MultiResponseProbsMessageInterfaceProxy::count(MultiResponseProbsMessage &self) { - return self.count; - } +std::size_t MultiResponseProbsMessageInterfaceProxy::count(MultiResponseProbsMessage &self) +{ + return self.count; +} - pybind11::object MultiResponseProbsMessageInterfaceProxy::probs(MultiResponseProbsMessage &self) { - // Get and convert - auto tensor = self.get_probs(); +pybind11::object MultiResponseProbsMessageInterfaceProxy::probs(MultiResponseProbsMessage &self) +{ + // Get and convert + auto tensor = self.get_probs(); - return CupyUtil::tensor_to_cupy(tensor); - } + return CupyUtil::tensor_to_cupy(tensor); } +} // namespace morpheus diff --git a/morpheus/_lib/src/objects/neo_wrapped_tensor.cpp b/morpheus/_lib/src/objects/neo_wrapped_tensor.cpp deleted file mode 100644 index b397cddfea..0000000000 --- a/morpheus/_lib/src/objects/neo_wrapped_tensor.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include - -#include -#include - -#include - -namespace morpheus { - /****** Component public implementations *******************/ - /****** neo::TensorObject****************************************/ - // TODO(Devin) defined in Neo - /****** NeoTensorObjectInterfaceProxy *************************/ - pybind11::dict NeoTensorObjectInterfaceProxy::cuda_array_interface(neo::TensorObject &self) { - pybind11::dict array_interface; - - pybind11::list shape_list; - - for (auto &idx: self.get_shape()) { - shape_list.append(idx); - } - - pybind11::list stride_list; - - for (auto &idx: self.get_stride()) { - stride_list.append(idx * self.dtype_size()); - } - - // pybind11::list shape_list = pybind11::cast(self.get_shape()); - - pybind11::int_ stream_val = 1; - - // See https://numba.readthedocs.io/en/stable/cuda/cuda_array_interface.html - // if (self.get_stream().is_default()) - // { - // stream_val = 1; - // } - // else if (self.get_stream().is_per_thread_default()) - // { - // stream_val = 2; - // } - // else - // { - // // Custom stream. Return value - // stream_val = (int64_t)self.get_stream().value(); - // } - - array_interface["shape"] = pybind11::cast(shape_list); - array_interface["typestr"] = self.get_numpy_typestr(); - array_interface["stream"] = stream_val; - array_interface["version"] = 3; - - if (self.is_compact() || self.get_stride().empty()) { - array_interface["strides"] = pybind11::none(); - } else { - array_interface["strides"] = pybind11::cast(stride_list); - } - array_interface["data"] = pybind11::make_tuple((uintptr_t) self.data(), false); - - return array_interface; - } -} diff --git a/morpheus/_lib/src/objects/rmm_tensor.cpp b/morpheus/_lib/src/objects/rmm_tensor.cpp index 479ac804f7..52e54e8329 100644 --- a/morpheus/_lib/src/objects/rmm_tensor.cpp +++ b/morpheus/_lib/src/objects/rmm_tensor.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,16 +15,14 @@ * limitations under the License. */ - #include +#include #include #include -#include - -#include #include +#include #include #include @@ -32,124 +30,145 @@ #include #include - namespace morpheus { - /****** Component public implementations *******************/ - /****** RMMTensor****************************************/ - RMMTensor::RMMTensor(std::shared_ptr device_buffer, size_t offset, DType dtype, - std::vector shape, std::vector stride) : - m_md(std::move(device_buffer)), - m_offset(offset), - m_dtype(std::move(dtype)), - m_shape(std::move(shape)), - m_stride(std::move(stride)) { - if (m_stride.empty()) { - neo::detail::validate_stride(this->m_shape, this->m_stride); +/****** Component public implementations *******************/ +/****** RMMTensor****************************************/ +RMMTensor::RMMTensor(std::shared_ptr device_buffer, + size_t offset, + DType dtype, + std::vector shape, + std::vector stride) : + m_md(std::move(device_buffer)), + m_offset(offset), + m_dtype(std::move(dtype)), + m_shape(std::move(shape)), + m_stride(std::move(stride)) +{ + if (m_stride.empty()) + { + detail::validate_stride(this->m_shape, this->m_stride); + } + + DCHECK(m_offset + this->bytes() <= m_md->size()) + << "Inconsistent tensor. Tensor values would extend past the end of the device_buffer"; +} + +std::shared_ptr RMMTensor::get_memory() const +{ + return nullptr; +} + +void *RMMTensor::data() const +{ + return static_cast(m_md->data()) + this->offset_bytes(); +} + +RankType RMMTensor::rank() const +{ + return m_shape.size(); +} + +DataType RMMTensor::dtype() const +{ + return m_dtype; +} + +std::size_t RMMTensor::count() const +{ + return std::accumulate(m_shape.begin(), m_shape.end(), 1, std::multiplies<>()); +} + +std::size_t RMMTensor::bytes() const +{ + return count() * m_dtype.item_size(); +} + +std::size_t RMMTensor::shape(std::size_t idx) const +{ + DCHECK_LT(idx, m_shape.size()); + return m_shape.at(idx); +} + +std::size_t RMMTensor::stride(std::size_t idx) const +{ + DCHECK_LT(idx, m_stride.size()); + return m_stride.at(idx); +} + +void RMMTensor::get_shape(std::vector &s) const +{ + s.resize(rank()); + std::copy(m_shape.begin(), m_shape.end(), s.begin()); +} + +void RMMTensor::get_stride(std::vector &s) const +{ + s.resize(rank()); + std::copy(m_stride.begin(), m_stride.end(), s.begin()); +} + +bool RMMTensor::is_compact() const +{ + TensorIndex ttl = 1; + for (int i = rank() - 1; i >= 0; i--) + { + if (stride(i) != ttl) + { + return false; } - DCHECK(m_offset + this->bytes() <= m_md->size()) - << "Inconsistent tensor. Tensor values would extend past the end of the device_buffer"; - } - - std::shared_ptr RMMTensor::get_memory() const { - return nullptr; - } - - void *RMMTensor::data() const { - return static_cast(m_md->data()) + this->offset_bytes(); - } - - neo::RankType RMMTensor::rank() const { - return m_shape.size(); - } - - neo::DataType RMMTensor::dtype() const { - return m_dtype; - } - - std::size_t RMMTensor::count() const { - return std::accumulate(m_shape.begin(), m_shape.end(), 1, std::multiplies<>()); - } - - std::size_t RMMTensor::bytes() const { - return count() * m_dtype.item_size(); + ttl *= shape(i); } + return true; +} - std::size_t RMMTensor::shape(std::size_t idx) const { - DCHECK_LT(idx, m_shape.size()); - return m_shape.at(idx); - } +std::shared_ptr RMMTensor::slice(const std::vector &min_dims, + const std::vector &max_dims) const +{ + // Calc new offset + size_t offset = std::transform_reduce( + m_stride.begin(), m_stride.end(), min_dims.begin(), m_offset, std::plus<>(), std::multiplies<>()); - std::size_t RMMTensor::stride(std::size_t idx) const { - DCHECK_LT(idx, m_stride.size()); - return m_stride.at(idx); - } + // Calc new shape + std::vector shape; + std::transform(max_dims.begin(), max_dims.end(), min_dims.begin(), std::back_inserter(shape), std::minus<>()); - void RMMTensor::get_shape(std::vector &s) const { - s.resize(rank()); - std::copy(m_shape.begin(), m_shape.end(), s.begin()); - } + // Stride remains the same - void RMMTensor::get_stride(std::vector &s) const { - s.resize(rank()); - std::copy(m_stride.begin(), m_stride.end(), s.begin()); - } + return std::make_shared(m_md, offset, m_dtype, shape, m_stride); +} - bool RMMTensor::is_compact() const { - neo::TensorIndex ttl = 1; - for (int i = rank() - 1; i >= 0; i--) { - if (stride(i) != ttl) { - return false; - } +std::shared_ptr RMMTensor::reshape(const std::vector &dims) const +{ + return std::make_shared(m_md, 0, m_dtype, dims, m_stride); +} - ttl *= shape(i); - } - return true; - } - - std::shared_ptr RMMTensor::slice(const std::vector &min_dims, - const std::vector &max_dims) const { - // Calc new offset - size_t offset = std::transform_reduce( - m_stride.begin(), m_stride.end(), min_dims.begin(), m_offset, std::plus<>(), std::multiplies<>()); +std::shared_ptr RMMTensor::deep_copy() const +{ + // Deep copy + std::shared_ptr copied_buffer = + std::make_shared(*m_md, m_md->stream(), m_md->memory_resource()); - // Calc new shape - std::vector shape; - std::transform(max_dims.begin(), max_dims.end(), min_dims.begin(), std::back_inserter(shape), - std::minus<>()); + return std::make_shared(copied_buffer, m_offset, m_dtype, m_shape, m_stride); +} - // Stride remains the same +std::shared_ptr RMMTensor::as_type(DataType dtype) const +{ + DType new_dtype(dtype.type_id()); - return std::make_shared(m_md, offset, m_dtype, shape, m_stride); - } + auto input_type = m_dtype.type_id(); + auto output_type = new_dtype.type_id(); - std::shared_ptr RMMTensor::reshape(const std::vector &dims) const { - return std::make_shared(m_md, 0, m_dtype, dims, m_stride); - } + // Now do the conversion + auto new_data_buffer = + MatxUtil::cast(DevMemInfo{this->count(), input_type, m_md, this->offset_bytes()}, output_type); - std::shared_ptr RMMTensor::deep_copy() const { - // Deep copy - std::shared_ptr copied_buffer = - std::make_shared(*m_md, m_md->stream(), m_md->memory_resource()); + // Return the new type + return std::make_shared(new_data_buffer, 0, new_dtype, m_shape, m_stride); +} - return std::make_shared(copied_buffer, m_offset, m_dtype, m_shape, m_stride); - } - - std::shared_ptr RMMTensor::as_type(neo::DataType dtype) const { - DType new_dtype(dtype.type_id()); - - auto input_type = m_dtype.type_id(); - auto output_type = new_dtype.type_id(); - - // Now do the conversion - auto new_data_buffer = MatxUtil::cast(DevMemInfo{this->count(), input_type, m_md, this->offset_bytes()}, - output_type); - - // Return the new type - return std::make_shared(new_data_buffer, 0, new_dtype, m_shape, m_stride); - } - - size_t RMMTensor::offset_bytes() const { - return m_offset * m_dtype.item_size(); - } -} \ No newline at end of file +size_t RMMTensor::offset_bytes() const +{ + return m_offset * m_dtype.item_size(); +} +} // namespace morpheus diff --git a/morpheus/_lib/src/objects/table_info.cpp b/morpheus/_lib/src/objects/table_info.cpp index 4368b01f0c..c5c819be68 100644 --- a/morpheus/_lib/src/objects/table_info.cpp +++ b/morpheus/_lib/src/objects/table_info.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,10 +15,9 @@ * limitations under the License. */ - #include -#include +#include #include #include @@ -34,137 +33,156 @@ #include namespace morpheus { - /****** Component public implementations *******************/ - /****** TableInfo****************************************/ - TableInfo::TableInfo(std::shared_ptr parent, cudf::table_view view, - std::vector index_names, std::vector column_names) : - m_parent(std::move(parent)), - m_table_view(std::move(view)), - m_index_names(std::move(index_names)), - m_column_names(std::move(column_names)) {} - - const pybind11::object &TableInfo::get_parent_table() const { - return m_parent->get_py_object(); - } - - const cudf::table_view &TableInfo::get_view() const { - return m_table_view; - } - - std::vector TableInfo::get_index_names() const { - return m_index_names; - } - - std::vector TableInfo::get_column_names() const { - return m_column_names; - } +/****** Component public implementations *******************/ +/****** TableInfo****************************************/ +TableInfo::TableInfo(std::shared_ptr parent, + cudf::table_view view, + std::vector index_names, + std::vector column_names) : + m_parent(std::move(parent)), + m_table_view(std::move(view)), + m_index_names(std::move(index_names)), + m_column_names(std::move(column_names)) +{} + +const pybind11::object &TableInfo::get_parent_table() const +{ + return m_parent->get_py_object(); +} + +const cudf::table_view &TableInfo::get_view() const +{ + return m_table_view; +} + +std::vector TableInfo::get_index_names() const +{ + return m_index_names; +} + +std::vector TableInfo::get_column_names() const +{ + return m_column_names; +} + +cudf::size_type TableInfo::num_indices() const +{ + return this->get_index_names().size(); +} + +cudf::size_type TableInfo::num_columns() const +{ + return this->get_column_names().size(); +} + +cudf::size_type TableInfo::num_rows() const +{ + return this->m_table_view.num_rows(); +} + +pybind11::object TableInfo::as_py_object() const +{ + const auto offset = m_table_view.column(0).offset(); + const auto stop = offset + this->num_rows(); - cudf::size_type TableInfo::num_indices() const { - return this->get_index_names().size(); - } + { + namespace py = pybind11; + py::gil_scoped_acquire gil; - cudf::size_type TableInfo::num_columns() const { - return this->get_column_names().size(); + auto df = this->get_parent_table(); + auto index_slice = py::slice(py::int_(offset), py::int_(stop), py::none()); + return df.attr("loc")[py::make_tuple(df.attr("index")[index_slice], m_column_names)]; } +} - cudf::size_type TableInfo::num_rows() const { - return this->m_table_view.num_rows(); - } +void TableInfo::insert_columns(const std::vector &column_names, const std::vector &column_types) +{ + CHECK(column_names.size() == column_types.size()); + const auto num_existing_cols = m_column_names.size(); + const auto num_rows = m_table_view.num_rows(); - pybind11::object TableInfo::as_py_object() const + // TODO figure out how to do this without the gil { - const auto offset = m_table_view.column(0).offset(); - const auto stop = offset + this->num_rows(); + namespace py = pybind11; + pybind11::gil_scoped_acquire gil; + pybind11::object cupy_zeros = pybind11::module_::import("cupy").attr("zeros"); - { - namespace py = pybind11; - py::gil_scoped_acquire gil; + auto table = get_parent_table(); - auto df = this->get_parent_table(); - auto index_slice = py::slice(py::int_(offset), py::int_(stop), py::none()); - return df.attr("loc")[py::make_tuple(df.attr("index")[index_slice], m_column_names)]; + for (std::size_t i = 0; i < column_names.size(); ++i) + { + auto empty_array = cupy_zeros(num_rows, DataType(column_types[i]).type_str()); + table.attr("insert")(num_existing_cols + i, column_names[i], empty_array); + m_column_names.push_back(column_names[i]); } } +} - void TableInfo::insert_columns(const std::vector &column_names, - const std::vector &column_types) { - CHECK(column_names.size() == column_types.size()); - const auto num_existing_cols = m_column_names.size(); - const auto num_rows = m_table_view.num_rows(); +void TableInfo::insert_missing_columns(const std::vector &column_names, + const std::vector &column_types) +{ + CHECK(column_names.size() == column_types.size()); - // TODO figure out how to do this without the gil + std::vector missing_names; + std::vector missing_types; + for (std::size_t i = 0; i < column_names.size(); ++i) + { + if (std::find(m_column_names.begin(), m_column_names.end(), column_names[i]) == m_column_names.end()) { - namespace py = pybind11; - pybind11::gil_scoped_acquire gil; - pybind11::object cupy_zeros = pybind11::module_::import("cupy").attr("zeros"); - - auto table = get_parent_table(); - - for (std::size_t i = 0; i < column_names.size(); ++i) { - auto empty_array = cupy_zeros(num_rows, neo::DataType(column_types[i]).type_str()); - table.attr("insert")(num_existing_cols + i, column_names[i], empty_array); - m_column_names.push_back(column_names[i]); - } + missing_names.push_back(column_names[i]); + missing_types.push_back(column_types[i]); } } - void TableInfo::insert_missing_columns(const std::vector &column_names, - const std::vector &column_types) { - CHECK(column_names.size() == column_types.size()); - - std::vector missing_names; - std::vector missing_types; - for (std::size_t i = 0; i < column_names.size(); ++i) { - if (std::find(m_column_names.begin(), m_column_names.end(), column_names[i]) == m_column_names.end()) { - missing_names.push_back(column_names[i]); - missing_types.push_back(column_types[i]); - } - } - - if (!missing_names.empty()) { - insert_columns(missing_names, missing_types); - } + if (!missing_names.empty()) + { + insert_columns(missing_names, missing_types); } +} - const cudf::column_view &TableInfo::get_column(cudf::size_type idx) const { - if (idx < 0 || idx >= this->m_table_view.num_columns()) { - throw std::invalid_argument("idx must satisfy 0 <= idx < num_columns()"); - } - - return this->m_table_view.column(this->m_index_names.size() + idx); +const cudf::column_view &TableInfo::get_column(cudf::size_type idx) const +{ + if (idx < 0 || idx >= this->m_table_view.num_columns()) + { + throw std::invalid_argument("idx must satisfy 0 <= idx < num_columns()"); } - TableInfo - TableInfo::get_slice(cudf::size_type start, cudf::size_type stop, std::vector column_names) const { - std::vector col_indices; + return this->m_table_view.column(this->m_index_names.size() + idx); +} - std::vector new_column_names; +TableInfo TableInfo::get_slice(cudf::size_type start, cudf::size_type stop, std::vector column_names) const +{ + std::vector col_indices; - // Append the indices column idx by default - for (cudf::size_type i = 0; i < this->m_index_names.size(); ++i) { - col_indices.push_back(i); - } + std::vector new_column_names; - std::transform(column_names.begin(), - column_names.end(), - std::back_inserter(col_indices), - [this, &new_column_names](const std::string &c) { - auto found_col = std::find(this->m_column_names.begin(), this->m_column_names.end(), c); + // Append the indices column idx by default + for (cudf::size_type i = 0; i < this->m_index_names.size(); ++i) + { + col_indices.push_back(i); + } - if (found_col == this->m_column_names.end()) { - throw std::runtime_error("Unknown column: " + c); - } + std::transform(column_names.begin(), + column_names.end(), + std::back_inserter(col_indices), + [this, &new_column_names](const std::string &c) { + auto found_col = std::find(this->m_column_names.begin(), this->m_column_names.end(), c); - // Add the found column to the metadata - new_column_names.push_back(c); + if (found_col == this->m_column_names.end()) + { + throw std::runtime_error("Unknown column: " + c); + } - return (found_col - this->m_column_names.begin() + this->num_indices()); - }); + // Add the found column to the metadata + new_column_names.push_back(c); - auto slice_rows = cudf::slice(m_table_view, {start, stop})[0]; + return (found_col - this->m_column_names.begin() + this->num_indices()); + }); - auto slice_cols = slice_rows.select(col_indices); + auto slice_rows = cudf::slice(m_table_view, {start, stop})[0]; - return TableInfo(m_parent, slice_cols, m_index_names, new_column_names); - } -} \ No newline at end of file + auto slice_cols = slice_rows.select(col_indices); + + return TableInfo(m_parent, slice_cols, m_index_names, new_column_names); +} +} // namespace morpheus diff --git a/morpheus/_lib/src/objects/tensor.cpp b/morpheus/_lib/src/objects/tensor.cpp index f98f6fb3d2..9a389976c2 100644 --- a/morpheus/_lib/src/objects/tensor.cpp +++ b/morpheus/_lib/src/objects/tensor.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,10 +17,10 @@ #include -#include #include +#include +#include -#include #include #include @@ -29,44 +29,55 @@ #include namespace morpheus { - Tensor::Tensor(std::shared_ptr buffer, std::string init_typestr, - std::vector init_shape, std::vector init_strides, size_t init_offset) : - m_device_buffer(std::move(buffer)), - typestr(std::move(init_typestr)), - shape(std::move(init_shape)), - strides(std::move(init_strides)), - m_offset(init_offset) {} +Tensor::Tensor(std::shared_ptr buffer, + std::string init_typestr, + std::vector init_shape, + std::vector init_strides, + size_t init_offset) : + m_device_buffer(std::move(buffer)), + typestr(std::move(init_typestr)), + shape(std::move(init_shape)), + strides(std::move(init_strides)), + m_offset(init_offset) +{} - void *Tensor::data() const { - return static_cast(m_device_buffer->data()) + m_offset; - } +void *Tensor::data() const +{ + return static_cast(m_device_buffer->data()) + m_offset; +} - size_t Tensor::bytes_count() const { - // temp just return without shape, size, offset, etc - return m_device_buffer->size(); - } +size_t Tensor::bytes_count() const +{ + // temp just return without shape, size, offset, etc + return m_device_buffer->size(); +} - std::vector Tensor::get_host_data() const { - std::vector out_data; +std::vector Tensor::get_host_data() const +{ + std::vector out_data; - out_data.resize(this->bytes_count()); + out_data.resize(this->bytes_count()); - NEO_CHECK_CUDA(cudaMemcpy(&out_data[0], this->data(), this->bytes_count(), cudaMemcpyDeviceToHost)); + NEO_CHECK_CUDA(cudaMemcpy(&out_data[0], this->data(), this->bytes_count(), cudaMemcpyDeviceToHost)); - return out_data; - } + return out_data; +} - auto Tensor::get_stream() const { - return this->m_device_buffer->stream(); - } +auto Tensor::get_stream() const +{ + return this->m_device_buffer->stream(); +} - neo::TensorObject - Tensor::create(std::shared_ptr buffer, DType dtype, std::vector shape, - std::vector strides, size_t offset) { - auto md = nullptr; +TensorObject Tensor::create(std::shared_ptr buffer, + DType dtype, + std::vector shape, + std::vector strides, + size_t offset) +{ + auto md = nullptr; - auto tensor = std::make_shared(buffer, offset, dtype, shape, strides); + auto tensor = std::make_shared(buffer, offset, dtype, shape, strides); - return neo::TensorObject(md, tensor); - } -} \ No newline at end of file + return TensorObject(md, tensor); +} +} // namespace morpheus diff --git a/morpheus/_lib/src/objects/tensor_object.cpp b/morpheus/_lib/src/objects/tensor_object.cpp new file mode 100644 index 0000000000..3f66ba0024 --- /dev/null +++ b/morpheus/_lib/src/objects/tensor_object.cpp @@ -0,0 +1,110 @@ +/** + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include + +#include // for MemoryDescriptor +#include // for blob +#include // for DataType + +#include + +namespace morpheus { + +static void set_contiguous_stride(const std::vector& shape, std::vector& stride) +{ + stride.resize(shape.size()); + TensorIndex ttl = 1; + auto rank = shape.size(); + for (int i = rank - 1; i >= 0; i--) + { + stride[i] = ttl; + ttl *= shape.at(i); + } +} + +TensorView::TensorView(neo::memory::blob bv, DataType dtype, std::vector shape) : + neo::memory::blob(std::move(bv)), + m_dtype(std::move(dtype)), + m_shape(std::move(shape)) +{ + TensorUtils::set_contiguous_stride(m_shape, m_stride); + + // validate the memory block defined by the blob has sufficient capacity to + // hold a tensor of shape/stride. +} + +TensorView::TensorView(neo::memory::blob bv, + DataType dtype, + std::vector shape, + std::vector stride) : + neo::memory::blob(std::move(bv)), + m_dtype(std::move(dtype)), + m_shape(std::move(shape)), + m_stride(std::move(stride)) +{ + CHECK_EQ(m_shape.size(), m_stride.size()); + + // for now, we are only supporting row-major in the TensorView + + // validate row-major + + // validate the memory block defined by the blob has sufficient capacity to + // hold a tensor of shape/stride. +} + +bool TensorView::is_contiguous() const +{ + return TensorUtils::has_contiguous_stride(shape(), stride()); +} + +GenericTensor::GenericTensor(std::shared_ptr md, + size_t offset, + DataType dtype, + const std::vector& shape, + const std::vector& stride) : + m_md(std::move(md)), + m_offset(offset), + m_dtype(std::move(dtype)), + m_shape(std::move(shape)), + m_stride(std::move(stride)) +{ + if (m_stride.empty()) + { + TensorUtils::set_contiguous_stride(m_shape, m_stride); + } + + CHECK_EQ(m_shape.size(), m_stride.size()); + + // throw_on_invalid_storage(); +} + +const DataType& TensorView::dtype() const +{ + return m_dtype; +} +const std::vector& TensorView::shape() const +{ + return m_shape; +} +const std::vector& TensorView::stride() const +{ + return m_stride; +} +} // namespace morpheus diff --git a/morpheus/_lib/src/objects/wrapped_tensor.cpp b/morpheus/_lib/src/objects/wrapped_tensor.cpp new file mode 100644 index 0000000000..f7fc1fba2a --- /dev/null +++ b/morpheus/_lib/src/objects/wrapped_tensor.cpp @@ -0,0 +1,85 @@ +/** + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include + +#include +#include + +#include + +namespace morpheus { +/****** Component public implementations *******************/ +/****** TensorObject****************************************/ +/****** TensorObjectInterfaceProxy *************************/ +pybind11::dict TensorObjectInterfaceProxy::cuda_array_interface(TensorObject &self) +{ + pybind11::dict array_interface; + + pybind11::list shape_list; + + for (auto &idx : self.get_shape()) + { + shape_list.append(idx); + } + + pybind11::list stride_list; + + for (auto &idx : self.get_stride()) + { + stride_list.append(idx * self.dtype_size()); + } + + // pybind11::list shape_list = pybind11::cast(self.get_shape()); + + pybind11::int_ stream_val = 1; + + // See https://numba.readthedocs.io/en/stable/cuda/cuda_array_interface.html + // if (self.get_stream().is_default()) + // { + // stream_val = 1; + // } + // else if (self.get_stream().is_per_thread_default()) + // { + // stream_val = 2; + // } + // else + // { + // // Custom stream. Return value + // stream_val = (int64_t)self.get_stream().value(); + // } + + array_interface["shape"] = pybind11::cast(shape_list); + array_interface["typestr"] = self.get_numpy_typestr(); + array_interface["stream"] = stream_val; + array_interface["version"] = 3; + + if (self.is_compact() || self.get_stride().empty()) + { + array_interface["strides"] = pybind11::none(); + } + else + { + array_interface["strides"] = pybind11::cast(stride_list); + } + array_interface["data"] = pybind11::make_tuple((uintptr_t)self.data(), false); + + return array_interface; +} +} // namespace morpheus diff --git a/morpheus/_lib/src/python_modules/common.cpp b/morpheus/_lib/src/python_modules/common.cpp index 45369cc8f0..d9b107539e 100644 --- a/morpheus/_lib/src/python_modules/common.cpp +++ b/morpheus/_lib/src/python_modules/common.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,7 @@ */ #include -#include +#include #include #include @@ -24,12 +24,13 @@ #include namespace morpheus { - namespace py = pybind11; +namespace py = pybind11; - PYBIND11_MODULE(common, m) { - google::InitGoogleLogging("morpheus"); +PYBIND11_MODULE(common, m) +{ + google::InitGoogleLogging("morpheus"); - m.doc() = R"pbdoc( + m.doc() = R"pbdoc( ----------------------- .. currentmodule:: morpheus.common .. autosummary:: @@ -37,32 +38,22 @@ namespace morpheus { TODO(Documentation) )pbdoc"; - // Load the cudf helpers - load_cudf_helpers(); + // Load the cudf helpers + load_cudf_helpers(); - // TODO(Devin) -- This should not be defined in morpheus -- should be imported from pyneo -- wrapping for now. - py::class_(m, "Tensor") - .def_property_readonly("__cuda_array_interface__", - &NeoTensorObjectInterfaceProxy::cuda_array_interface); + py::class_(m, "Tensor") + .def_property_readonly("__cuda_array_interface__", &TensorObjectInterfaceProxy::cuda_array_interface); - py::class_>(m, "FiberQueue") - .def(py::init<>(&FiberQueueInterfaceProxy::init), - py::arg("max_size")) - .def("get", - &FiberQueueInterfaceProxy::get, - py::arg("block") = true, - py::arg("timeout") = 0.0) - .def("put", - &FiberQueueInterfaceProxy::put, - py::arg("item"), - py::arg("block") = true, - py::arg("timeout") = 0.0) - .def("close", &FiberQueueInterfaceProxy::close); + py::class_>(m, "FiberQueue") + .def(py::init<>(&FiberQueueInterfaceProxy::init), py::arg("max_size")) + .def("get", &FiberQueueInterfaceProxy::get, py::arg("block") = true, py::arg("timeout") = 0.0) + .def("put", &FiberQueueInterfaceProxy::put, py::arg("item"), py::arg("block") = true, py::arg("timeout") = 0.0) + .def("close", &FiberQueueInterfaceProxy::close); #ifdef VERSION_INFO - m.attr("__version__") = MACRO_STRINGIFY(VERSION_INFO); + m.attr("__version__") = MACRO_STRINGIFY(VERSION_INFO); #else - m.attr("__version__") = "dev"; + m.attr("__version__") = "dev"; #endif - } +} } // namespace morpheus diff --git a/morpheus/_lib/src/stages/add_classification.cpp b/morpheus/_lib/src/stages/add_classification.cpp index bb468089cf..8bd4128d9c 100644 --- a/morpheus/_lib/src/stages/add_classification.cpp +++ b/morpheus/_lib/src/stages/add_classification.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -25,102 +25,105 @@ #include namespace morpheus { - // Component public implementations - // ************ AddClassificationStage **************************** // - AddClassificationsStage::AddClassificationsStage(const neo::Segment &parent, const std::string &name, - float threshold, std::size_t num_class_labels, - std::map idx2label) : - neo::SegmentObject(parent, name), - PythonNode(parent, name, build_operator()), - m_threshold(threshold), - m_num_class_labels(num_class_labels), - m_idx2label(std::move(idx2label)) - { - CHECK(m_idx2label.size() <= m_num_class_labels) << "idx2label should represent a subset of the class_labels"; - } - - AddClassificationsStage::operator_fn_t AddClassificationsStage::build_operator() - { - return [this](neo::Observable& input, neo::Subscriber& output) { - return input.subscribe(neo::make_observer( - [this, &output](reader_type_t&& x) { - const auto& probs = x->get_probs(); - const auto& shape = probs.get_shape(); - const auto& stride = probs.get_stride(); - - CHECK(shape.size() == 2 && shape[1] == m_num_class_labels) - << "Label count does not match output of model. Label count: " << m_num_class_labels - << ", Model output: " << shape[1]; - - const std::size_t num_rows = shape[0]; - const std::size_t num_columns = shape[1]; - - // A bit ugly, but we cant get access to the rmm::device_buffer here. So make a copy - auto tmp_buffer = std::make_shared(probs.bytes(), rmm::cuda_stream_per_thread); - - NEO_CHECK_CUDA( - cudaMemcpy(tmp_buffer->data(), probs.data(), tmp_buffer->size(), cudaMemcpyDeviceToDevice)); - - // Depending on the input the stride is given in bytes or elements, - // divide the stride elements by the smallest item to ensure tensor_stride is defined in - // terms of elements - std::vector tensor_stride(stride.size()); - auto min_stride = std::min_element(stride.cbegin(), stride.cend()); - - std::transform(stride.cbegin(), - stride.cend(), - tensor_stride.begin(), - std::bind(std::divides<>(), std::placeholders::_1, *min_stride)); - - // Now call the threshold function - auto thresh_bool_buffer = - MatxUtil::threshold(DevMemInfo{probs.count(), probs.dtype().type_id(), tmp_buffer, 0}, - num_rows, - num_columns, - tensor_stride, - m_threshold, - false); - - auto tensor_obj = Tensor::create(thresh_bool_buffer, - DType::create(), - std::vector{static_cast(shape[0]), - static_cast(shape[1])}, - tensor_stride); - - std::vector columns(m_idx2label.size()); - std::vector tensors(m_idx2label.size()); - - std::size_t i = 0; - for (const auto& [column_num, column_name] : m_idx2label) - { - columns[i] = column_name; - tensors[i] = tensor_obj.slice( - std::vector{0, static_cast(column_num)}, - std::vector{static_cast(num_rows), - static_cast(column_num + 1)}); - - ++i; - } - - x->set_meta(columns, tensors); - - output.on_next(x); - }, - [&](std::exception_ptr error_ptr) { output.on_error(error_ptr); }, - [&]() { output.on_completed(); })); - }; - } - - // ************ AddClassificationStageInterfaceProxy ************* // - std::shared_ptr - AddClassificationStageInterfaceProxy::init(neo::Segment &parent, const std::string &name, float threshold, - std::size_t num_class_labels, - std::map idx2label) { - auto stage = - std::make_shared(parent, name, threshold, num_class_labels, idx2label); - - parent.register_node(stage); - - return stage; - } +// Component public implementations +// ************ AddClassificationStage **************************** // +AddClassificationsStage::AddClassificationsStage(const neo::Segment& parent, + const std::string& name, + float threshold, + std::size_t num_class_labels, + std::map idx2label) : + neo::SegmentObject(parent, name), + PythonNode(parent, name, build_operator()), + m_threshold(threshold), + m_num_class_labels(num_class_labels), + m_idx2label(std::move(idx2label)) +{ + CHECK(m_idx2label.size() <= m_num_class_labels) << "idx2label should represent a subset of the class_labels"; } + +AddClassificationsStage::operator_fn_t AddClassificationsStage::build_operator() +{ + return [this](neo::Observable& input, neo::Subscriber& output) { + return input.subscribe(neo::make_observer( + [this, &output](reader_type_t&& x) { + const auto& probs = x->get_probs(); + const auto& shape = probs.get_shape(); + const auto& stride = probs.get_stride(); + + CHECK(shape.size() == 2 && shape[1] == m_num_class_labels) + << "Label count does not match output of model. Label count: " << m_num_class_labels + << ", Model output: " << shape[1]; + + const std::size_t num_rows = shape[0]; + const std::size_t num_columns = shape[1]; + + // A bit ugly, but we cant get access to the rmm::device_buffer here. So make a copy + auto tmp_buffer = std::make_shared(probs.bytes(), rmm::cuda_stream_per_thread); + + NEO_CHECK_CUDA( + cudaMemcpy(tmp_buffer->data(), probs.data(), tmp_buffer->size(), cudaMemcpyDeviceToDevice)); + + // Depending on the input the stride is given in bytes or elements, + // divide the stride elements by the smallest item to ensure tensor_stride is defined in + // terms of elements + std::vector tensor_stride(stride.size()); + auto min_stride = std::min_element(stride.cbegin(), stride.cend()); + + std::transform(stride.cbegin(), + stride.cend(), + tensor_stride.begin(), + std::bind(std::divides<>(), std::placeholders::_1, *min_stride)); + + // Now call the threshold function + auto thresh_bool_buffer = + MatxUtil::threshold(DevMemInfo{probs.count(), probs.dtype().type_id(), tmp_buffer, 0}, + num_rows, + num_columns, + tensor_stride, + m_threshold, + false); + + auto tensor_obj = Tensor::create( + thresh_bool_buffer, + DType::create(), + std::vector{static_cast(shape[0]), static_cast(shape[1])}, + tensor_stride); + + std::vector columns(m_idx2label.size()); + std::vector tensors(m_idx2label.size()); + + std::size_t i = 0; + for (const auto& [column_num, column_name] : m_idx2label) + { + columns[i] = column_name; + tensors[i] = tensor_obj.slice(std::vector{0, static_cast(column_num)}, + std::vector{static_cast(num_rows), + static_cast(column_num + 1)}); + + ++i; + } + + x->set_meta(columns, tensors); + + output.on_next(x); + }, + [&](std::exception_ptr error_ptr) { output.on_error(error_ptr); }, + [&]() { output.on_completed(); })); + }; +} + +// ************ AddClassificationStageInterfaceProxy ************* // +std::shared_ptr AddClassificationStageInterfaceProxy::init( + neo::Segment& parent, + const std::string& name, + float threshold, + std::size_t num_class_labels, + std::map idx2label) +{ + auto stage = std::make_shared(parent, name, threshold, num_class_labels, idx2label); + + parent.register_node(stage); + + return stage; +} +} // namespace morpheus diff --git a/morpheus/_lib/src/stages/add_scores.cpp b/morpheus/_lib/src/stages/add_scores.cpp index 0940c5c888..ae08b69a5a 100644 --- a/morpheus/_lib/src/stages/add_scores.cpp +++ b/morpheus/_lib/src/stages/add_scores.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -25,88 +25,91 @@ #include namespace morpheus { - // Component public implementations - // ************ AddScoresStage **************************** // - AddScoresStage::AddScoresStage(const neo::Segment &parent, const std::string &name, std::size_t num_class_labels, - std::map idx2label) : - neo::SegmentObject(parent, name), - PythonNode(parent, name, build_operator()), - m_num_class_labels(num_class_labels), - m_idx2label(std::move(idx2label)) - { - CHECK(m_idx2label.size() <= m_num_class_labels) << "idx2label should represent a subset of the class_labels"; - } - - AddScoresStage::operator_fn_t AddScoresStage::build_operator() - { - return [this](neo::Observable& input, neo::Subscriber& output) { - return input.subscribe(neo::make_observer( - [this, &output](reader_type_t&& x) { - const auto& probs = x->get_probs(); - const auto& shape = probs.get_shape(); - const auto& stride = probs.get_stride(); - - CHECK(shape.size() == 2 && shape[1] == m_num_class_labels) - << "Label count does not match output of model. Label count: " << m_num_class_labels - << ", Model output: " << shape[1]; - - const std::size_t num_rows = shape[0]; - const std::size_t num_columns = shape[1]; - - auto tmp_buffer = std::make_shared(probs.bytes(), rmm::cuda_stream_per_thread); - - NEO_CHECK_CUDA( - cudaMemcpy(tmp_buffer->data(), probs.data(), tmp_buffer->size(), cudaMemcpyDeviceToDevice)); - - // Depending on the input the stride is given in bytes or elements, - // divide the stride elements by the smallest item to ensure tensor_stride is defined in - // terms of elements - std::vector tensor_stride(stride.size()); - auto min_stride = std::min_element(stride.cbegin(), stride.cend()); - - std::transform(stride.cbegin(), - stride.cend(), - tensor_stride.begin(), - std::bind(std::divides<>(), std::placeholders::_1, *min_stride)); - - auto tensor_obj = Tensor::create(tmp_buffer, - probs.dtype(), - std::vector{static_cast(shape[0]), - static_cast(shape[1])}, - tensor_stride); - - std::vector columns(m_idx2label.size()); - std::vector tensors(m_idx2label.size()); - - std::size_t i = 0; - for (const auto& [column_num, column_name] : m_idx2label) - { - columns[i] = column_name; - tensors[i] = tensor_obj.slice( - std::vector{0, static_cast(column_num)}, - std::vector{static_cast(num_rows), - static_cast(column_num + 1)}); - - ++i; - } - - x->set_meta(columns, tensors); - - output.on_next(x); - }, - [&](std::exception_ptr error_ptr) { output.on_error(error_ptr); }, - [&]() { output.on_completed(); })); - }; - } - - // ************ AddScoresStageInterfaceProxy ************* // - std::shared_ptr - AddScoresStageInterfaceProxy::init(neo::Segment &parent, const std::string &name, std::size_t num_class_labels, - std::map idx2label) { - auto stage = std::make_shared(parent, name, num_class_labels, idx2label); - - parent.register_node(stage); - - return stage; - } +// Component public implementations +// ************ AddScoresStage **************************** // +AddScoresStage::AddScoresStage(const neo::Segment& parent, + const std::string& name, + std::size_t num_class_labels, + std::map idx2label) : + neo::SegmentObject(parent, name), + PythonNode(parent, name, build_operator()), + m_num_class_labels(num_class_labels), + m_idx2label(std::move(idx2label)) +{ + CHECK(m_idx2label.size() <= m_num_class_labels) << "idx2label should represent a subset of the class_labels"; } + +AddScoresStage::operator_fn_t AddScoresStage::build_operator() +{ + return [this](neo::Observable& input, neo::Subscriber& output) { + return input.subscribe(neo::make_observer( + [this, &output](reader_type_t&& x) { + const auto& probs = x->get_probs(); + const auto& shape = probs.get_shape(); + const auto& stride = probs.get_stride(); + + CHECK(shape.size() == 2 && shape[1] == m_num_class_labels) + << "Label count does not match output of model. Label count: " << m_num_class_labels + << ", Model output: " << shape[1]; + + const std::size_t num_rows = shape[0]; + const std::size_t num_columns = shape[1]; + + auto tmp_buffer = std::make_shared(probs.bytes(), rmm::cuda_stream_per_thread); + + NEO_CHECK_CUDA( + cudaMemcpy(tmp_buffer->data(), probs.data(), tmp_buffer->size(), cudaMemcpyDeviceToDevice)); + + // Depending on the input the stride is given in bytes or elements, + // divide the stride elements by the smallest item to ensure tensor_stride is defined in + // terms of elements + std::vector tensor_stride(stride.size()); + auto min_stride = std::min_element(stride.cbegin(), stride.cend()); + + std::transform(stride.cbegin(), + stride.cend(), + tensor_stride.begin(), + std::bind(std::divides<>(), std::placeholders::_1, *min_stride)); + + auto tensor_obj = Tensor::create( + tmp_buffer, + probs.dtype(), + std::vector{static_cast(shape[0]), static_cast(shape[1])}, + tensor_stride); + + std::vector columns(m_idx2label.size()); + std::vector tensors(m_idx2label.size()); + + std::size_t i = 0; + for (const auto& [column_num, column_name] : m_idx2label) + { + columns[i] = column_name; + tensors[i] = tensor_obj.slice(std::vector{0, static_cast(column_num)}, + std::vector{static_cast(num_rows), + static_cast(column_num + 1)}); + + ++i; + } + + x->set_meta(columns, tensors); + + output.on_next(x); + }, + [&](std::exception_ptr error_ptr) { output.on_error(error_ptr); }, + [&]() { output.on_completed(); })); + }; +} + +// ************ AddScoresStageInterfaceProxy ************* // +std::shared_ptr AddScoresStageInterfaceProxy::init(neo::Segment& parent, + const std::string& name, + std::size_t num_class_labels, + std::map idx2label) +{ + auto stage = std::make_shared(parent, name, num_class_labels, idx2label); + + parent.register_node(stage); + + return stage; +} +} // namespace morpheus diff --git a/morpheus/_lib/src/stages/filter_detection.cpp b/morpheus/_lib/src/stages/filter_detection.cpp index 5e21babf32..ea47afbad2 100644 --- a/morpheus/_lib/src/stages/filter_detection.cpp +++ b/morpheus/_lib/src/stages/filter_detection.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -25,93 +25,102 @@ #include namespace morpheus { - // Component public implementations - // ************ FilterDetectionStage **************************** // - FilterDetectionsStage::FilterDetectionsStage(const neo::Segment &parent, const std::string &name, float threshold) : - neo::SegmentObject(parent, name), - PythonNode(parent, name, build_operator()), - m_threshold(threshold) {} - - FilterDetectionsStage::operator_fn_t FilterDetectionsStage::build_operator() { - return [this](neo::Observable &input, neo::Subscriber &output) { +// Component public implementations +// ************ FilterDetectionStage **************************** // +FilterDetectionsStage::FilterDetectionsStage(const neo::Segment &parent, const std::string &name, float threshold) : + neo::SegmentObject(parent, name), + PythonNode(parent, name, build_operator()), + m_threshold(threshold) +{} + +FilterDetectionsStage::operator_fn_t FilterDetectionsStage::build_operator() +{ + return + [this](neo::Observable &input, neo::Subscriber &output) { return input.subscribe(neo::make_observer( - [this, &output](reader_type_t &&x) { - const auto &probs = x->get_probs(); - const auto &shape = probs.get_shape(); - const auto &stride = probs.get_stride(); - - CHECK(probs.rank() == 2) - << "C++ impl of the FilterDetectionsStage currently only supports two dimensional arrays"; - - const std::size_t num_rows = shape[0]; - const std::size_t num_columns = shape[1]; - - // A bit ugly, but we cant get access to the rmm::device_buffer here. So make a copy - auto tmp_buffer = std::make_shared(probs.count() * probs.dtype_size(), - rmm::cuda_stream_per_thread); - - NEO_CHECK_CUDA( - cudaMemcpy(tmp_buffer->data(), probs.data(), tmp_buffer->size(), - cudaMemcpyDeviceToDevice)); - - // Depending on the input the stride is given in bytes or elements, - // divide the stride elements by the smallest item to ensure tensor_stride is defined in - // terms of elements - std::vector tensor_stride(stride.size()); - auto min_stride = std::min_element(stride.cbegin(), stride.cend()); - - std::transform(stride.cbegin(), - stride.cend(), - tensor_stride.begin(), - std::bind(std::divides<>(), std::placeholders::_1, *min_stride)); - - // Now call the threshold function - auto thresh_bool_buffer = - MatxUtil::threshold(DevMemInfo{probs.count(), probs.dtype().type_id(), tmp_buffer, 0}, - num_rows, - num_columns, - tensor_stride, - m_threshold, - true); - - std::vector host_bool_values(num_rows); - - // Copy bools back to host - NEO_CHECK_CUDA(cudaMemcpy(host_bool_values.data(), - thresh_bool_buffer->data(), - thresh_bool_buffer->size(), - cudaMemcpyDeviceToHost)); - - // We are slicing by rows, using num_rows as our marker for undefined - std::size_t slice_start = num_rows; - for (std::size_t row = 0; row < num_rows; ++row) { - bool above_threshold = host_bool_values[row]; - - if (above_threshold && slice_start == num_rows) { - slice_start = row; - } else if (!above_threshold && slice_start != num_rows) { - output.on_next(x->get_slice(slice_start, row)); - slice_start = num_rows; - } + [this, &output](reader_type_t &&x) { + const auto &probs = x->get_probs(); + const auto &shape = probs.get_shape(); + const auto &stride = probs.get_stride(); + + CHECK(probs.rank() == 2) + << "C++ impl of the FilterDetectionsStage currently only supports two dimensional arrays"; + + const std::size_t num_rows = shape[0]; + const std::size_t num_columns = shape[1]; + + // A bit ugly, but we cant get access to the rmm::device_buffer here. So make a copy + auto tmp_buffer = std::make_shared(probs.count() * probs.dtype_size(), + rmm::cuda_stream_per_thread); + + NEO_CHECK_CUDA( + cudaMemcpy(tmp_buffer->data(), probs.data(), tmp_buffer->size(), cudaMemcpyDeviceToDevice)); + + // Depending on the input the stride is given in bytes or elements, + // divide the stride elements by the smallest item to ensure tensor_stride is defined in + // terms of elements + std::vector tensor_stride(stride.size()); + auto min_stride = std::min_element(stride.cbegin(), stride.cend()); + + std::transform(stride.cbegin(), + stride.cend(), + tensor_stride.begin(), + std::bind(std::divides<>(), std::placeholders::_1, *min_stride)); + + // Now call the threshold function + auto thresh_bool_buffer = + MatxUtil::threshold(DevMemInfo{probs.count(), probs.dtype().type_id(), tmp_buffer, 0}, + num_rows, + num_columns, + tensor_stride, + m_threshold, + true); + + std::vector host_bool_values(num_rows); + + // Copy bools back to host + NEO_CHECK_CUDA(cudaMemcpy(host_bool_values.data(), + thresh_bool_buffer->data(), + thresh_bool_buffer->size(), + cudaMemcpyDeviceToHost)); + + // We are slicing by rows, using num_rows as our marker for undefined + std::size_t slice_start = num_rows; + for (std::size_t row = 0; row < num_rows; ++row) + { + bool above_threshold = host_bool_values[row]; + + if (above_threshold && slice_start == num_rows) + { + slice_start = row; } - - if (slice_start != num_rows) { - // Last row was above the threshold - output.on_next(x->get_slice(slice_start, num_rows)); + else if (!above_threshold && slice_start != num_rows) + { + output.on_next(x->get_slice(slice_start, row)); + slice_start = num_rows; } - }, - [&](std::exception_ptr error_ptr) { output.on_error(error_ptr); }, - [&]() { output.on_completed(); })); + } + + if (slice_start != num_rows) + { + // Last row was above the threshold + output.on_next(x->get_slice(slice_start, num_rows)); + } + }, + [&](std::exception_ptr error_ptr) { output.on_error(error_ptr); }, + [&]() { output.on_completed(); })); }; - } +} - // ************ FilterDetectionStageInterfaceProxy ************* // - std::shared_ptr - FilterDetectionStageInterfaceProxy::init(neo::Segment &parent, const std::string &name, float threshold) { - auto stage = std::make_shared(parent, name, threshold); +// ************ FilterDetectionStageInterfaceProxy ************* // +std::shared_ptr FilterDetectionStageInterfaceProxy::init(neo::Segment &parent, + const std::string &name, + float threshold) +{ + auto stage = std::make_shared(parent, name, threshold); - parent.register_node(stage); + parent.register_node(stage); - return stage; - } + return stage; } +} // namespace morpheus diff --git a/morpheus/_lib/src/stages/preprocess_fil.cpp b/morpheus/_lib/src/stages/preprocess_fil.cpp index 9a6dda6072..0cce14c29b 100644 --- a/morpheus/_lib/src/stages/preprocess_fil.cpp +++ b/morpheus/_lib/src/stages/preprocess_fil.cpp @@ -20,9 +20,9 @@ #include #include #include +#include #include -#include #include #include @@ -129,24 +129,24 @@ PreprocessFILStage::operator_fn_t PreprocessFILStage::build_operator() } // Need to do a transpose here - auto transposed_data = MatxUtil::transpose( - DevMemInfo{x->mess_count * m_fea_cols.size(), neo::TypeId::FLOAT32, packed_data, 0}, - m_fea_cols.size(), - x->mess_count); + auto transposed_data = + MatxUtil::transpose(DevMemInfo{x->mess_count * m_fea_cols.size(), TypeId::FLOAT32, packed_data, 0}, + m_fea_cols.size(), + x->mess_count); auto input__0 = Tensor::create(transposed_data, DType::create(), - std::vector{static_cast(x->mess_count), - static_cast(m_fea_cols.size())}, - std::vector{}, + std::vector{static_cast(x->mess_count), + static_cast(m_fea_cols.size())}, + std::vector{}, 0); - auto seg_ids = Tensor::create( - MatxUtil::create_seg_ids(x->mess_count, m_fea_cols.size(), neo::TypeId::UINT32), - DType::create(), - std::vector{static_cast(x->mess_count), static_cast(3)}, - std::vector{}, - 0); + auto seg_ids = + Tensor::create(MatxUtil::create_seg_ids(x->mess_count, m_fea_cols.size(), TypeId::UINT32), + DType::create(), + std::vector{static_cast(x->mess_count), static_cast(3)}, + std::vector{}, + 0); // Build the results auto memory = std::make_shared(x->mess_count, input__0, seg_ids); diff --git a/morpheus/_lib/src/stages/preprocess_nlp.cpp b/morpheus/_lib/src/stages/preprocess_nlp.cpp index 029bd555b2..4b350239cb 100644 --- a/morpheus/_lib/src/stages/preprocess_nlp.cpp +++ b/morpheus/_lib/src/stages/preprocess_nlp.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,12 +20,12 @@ #include #include -#include #include +#include +#include #include #include -#include #include #include @@ -34,119 +34,118 @@ #include #include - namespace morpheus { - // Component public implementations - // ************ PreprocessNLPStage ************************* // - PreprocessNLPStage::PreprocessNLPStage(const neo::Segment &parent, const std::string &name, - std::string vocab_hash_file, uint32_t sequence_length, bool truncation, - bool do_lower_case, bool add_special_token, int stride) : - neo::SegmentObject(parent, name), - PythonNode(parent, name, build_operator()), - m_vocab_hash_file(std::move(vocab_hash_file)), - m_sequence_length(sequence_length), - m_truncation(truncation), - m_do_lower_case(do_lower_case), - m_add_special_token(add_special_token), - m_stride(stride) {} - - PreprocessNLPStage::operator_fn_t PreprocessNLPStage::build_operator() { - return [this](neo::Observable &input, neo::Subscriber &output) { - uint32_t stride = m_stride; - - // Auto calc stride to be 75% of sequence length - if (stride < 0) { - stride = m_sequence_length / 2; - stride = stride + stride / 2; - } - - return input.subscribe(neo::make_observer( - [this, stride, &output](reader_type_t &&x) { - // Convert to string view - auto string_col = cudf::strings_column_view{x->get_meta("data").get_column(0)}; - - // Create the hashed vocab - thread_local std::unique_ptr vocab = - nvtext::load_vocabulary_file(this->m_vocab_hash_file); - - // Perform the tokenizer - auto token_results = nvtext::subword_tokenize(string_col, - *vocab, - this->m_sequence_length, - stride, - this->m_do_lower_case, - this->m_truncation, - string_col.size() * 2); - - // Build the results - auto memory = std::make_shared(token_results.nrows_tensor); - - int32_t length = token_results.tensor_token_ids->size() / token_results.sequence_length; - auto input_ids_released = - cudf::cast(token_results.tensor_token_ids->view(), - cudf::data_type(cudf::type_id::INT32)) - ->release(); - - memory->inputs["input_ids"] = std::move(Tensor::create( - std::move(input_ids_released.data), - DType::create(), - std::vector{length, - static_cast(token_results.sequence_length)}, - std::vector{}, - 0)); - - length = token_results.tensor_attention_mask->size() / token_results.sequence_length; - auto input_mask_released = - cudf::cast(token_results.tensor_attention_mask->view(), - cudf::data_type(cudf::type_id::INT32)) - ->release(); - memory->inputs["input_mask"] = std::move(Tensor::create( - std::move(input_mask_released.data), - DType::create(), - std::vector{length, - static_cast(token_results.sequence_length)}, - std::vector{}, - 0)); - - length = token_results.tensor_metadata->size() / 3; - auto seq_ids_released = - cudf::cast(token_results.tensor_metadata->view(), - cudf::data_type(cudf::type_id::INT32)) - ->release(); - memory->inputs["seq_ids"] = - std::move(Tensor::create(std::move(seq_ids_released.data), - DType::create(), - std::vector{length, - static_cast(3)}, - std::vector{}, - 0)); - - auto next = std::make_shared( - x->meta, x->mess_offset, x->mess_count, std::move(memory), 0, memory->count); - - output.on_next(std::move(next)); - }, - [&](std::exception_ptr error_ptr) { output.on_error(error_ptr); }, - [&]() { output.on_completed(); })); - }; - } - - // ************ PreprocessNLPStageInterfaceProxy *********** // - std::shared_ptr - PreprocessNLPStageInterfaceProxy::init(neo::Segment &parent, const std::string &name, std::string vocab_hash_file, - uint32_t sequence_length, bool truncation, bool do_lower_case, - bool add_special_token, int stride) { - auto stage = std::make_shared(parent, - name, - vocab_hash_file, - sequence_length, - truncation, - do_lower_case, - add_special_token, - stride); - - parent.register_node(stage); - - return stage; - } -} \ No newline at end of file +// Component public implementations +// ************ PreprocessNLPStage ************************* // +PreprocessNLPStage::PreprocessNLPStage(const neo::Segment &parent, + const std::string &name, + std::string vocab_hash_file, + uint32_t sequence_length, + bool truncation, + bool do_lower_case, + bool add_special_token, + int stride) : + neo::SegmentObject(parent, name), + PythonNode(parent, name, build_operator()), + m_vocab_hash_file(std::move(vocab_hash_file)), + m_sequence_length(sequence_length), + m_truncation(truncation), + m_do_lower_case(do_lower_case), + m_add_special_token(add_special_token), + m_stride(stride) +{} + +PreprocessNLPStage::operator_fn_t PreprocessNLPStage::build_operator() +{ + return [this](neo::Observable &input, neo::Subscriber &output) { + uint32_t stride = m_stride; + + // Auto calc stride to be 75% of sequence length + if (stride < 0) + { + stride = m_sequence_length / 2; + stride = stride + stride / 2; + } + + return input.subscribe(neo::make_observer( + [this, stride, &output](reader_type_t &&x) { + // Convert to string view + auto string_col = cudf::strings_column_view{x->get_meta("data").get_column(0)}; + + // Create the hashed vocab + thread_local std::unique_ptr vocab = + nvtext::load_vocabulary_file(this->m_vocab_hash_file); + + // Perform the tokenizer + auto token_results = nvtext::subword_tokenize(string_col, + *vocab, + this->m_sequence_length, + stride, + this->m_do_lower_case, + this->m_truncation, + string_col.size() * 2); + + // Build the results + auto memory = std::make_shared(token_results.nrows_tensor); + + int32_t length = token_results.tensor_token_ids->size() / token_results.sequence_length; + auto input_ids_released = + cudf::cast(token_results.tensor_token_ids->view(), cudf::data_type(cudf::type_id::INT32)) + ->release(); + + memory->inputs["input_ids"] = std::move( + Tensor::create(std::move(input_ids_released.data), + DType::create(), + std::vector{length, static_cast(token_results.sequence_length)}, + std::vector{}, + 0)); + + length = token_results.tensor_attention_mask->size() / token_results.sequence_length; + auto input_mask_released = + cudf::cast(token_results.tensor_attention_mask->view(), cudf::data_type(cudf::type_id::INT32)) + ->release(); + memory->inputs["input_mask"] = std::move( + Tensor::create(std::move(input_mask_released.data), + DType::create(), + std::vector{length, static_cast(token_results.sequence_length)}, + std::vector{}, + 0)); + + length = token_results.tensor_metadata->size() / 3; + auto seq_ids_released = + cudf::cast(token_results.tensor_metadata->view(), cudf::data_type(cudf::type_id::INT32))->release(); + memory->inputs["seq_ids"] = + std::move(Tensor::create(std::move(seq_ids_released.data), + DType::create(), + std::vector{length, static_cast(3)}, + std::vector{}, + 0)); + + auto next = std::make_shared( + x->meta, x->mess_offset, x->mess_count, std::move(memory), 0, memory->count); + + output.on_next(std::move(next)); + }, + [&](std::exception_ptr error_ptr) { output.on_error(error_ptr); }, + [&]() { output.on_completed(); })); + }; +} + +// ************ PreprocessNLPStageInterfaceProxy *********** // +std::shared_ptr PreprocessNLPStageInterfaceProxy::init(neo::Segment &parent, + const std::string &name, + std::string vocab_hash_file, + uint32_t sequence_length, + bool truncation, + bool do_lower_case, + bool add_special_token, + int stride) +{ + auto stage = std::make_shared( + parent, name, vocab_hash_file, sequence_length, truncation, do_lower_case, add_special_token, stride); + + parent.register_node(stage); + + return stage; +} +} // namespace morpheus diff --git a/morpheus/_lib/src/stages/triton_inference.cpp b/morpheus/_lib/src/stages/triton_inference.cpp index 4f0cd3ada2..afc4828519 100644 --- a/morpheus/_lib/src/stages/triton_inference.cpp +++ b/morpheus/_lib/src/stages/triton_inference.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -38,363 +38,380 @@ #include #include - #define CHECK_TRITON(method) ::InferenceClientStage__check_triton_errors(method, #method, __FILE__, __LINE__); namespace { - // Component-private free functions. - void InferenceClientStage__check_triton_errors(triton::client::Error status, - const std::string &methodName, - const std::string &filename, - const int &lineNumber) { - if (!status.IsOk()) { - std::string err_msg = - CONCAT_STR("Triton Error while executing '" << methodName << "'. Error: " + status.Message() << "\n" - << filename << "(" << lineNumber << ")"); - LOG(ERROR) << err_msg; - throw std::runtime_error(err_msg); - } +// Component-private free functions. +void InferenceClientStage__check_triton_errors(triton::client::Error status, + const std::string &methodName, + const std::string &filename, + const int &lineNumber) +{ + if (!status.IsOk()) + { + std::string err_msg = + CONCAT_STR("Triton Error while executing '" << methodName << "'. Error: " + status.Message() << "\n" + << filename << "(" << lineNumber << ")"); + LOG(ERROR) << err_msg; + throw std::runtime_error(err_msg); } } +} // namespace namespace morpheus { - // Component public implementations - // ************ InferenceClientStage ************************* // - InferenceClientStage::InferenceClientStage(const neo::Segment &parent, const std::string &name, - std::string model_name, std::string server_url, - bool force_convert_inputs, bool use_shared_memory, bool needs_logits, - std::map inout_mapping) : - neo::SegmentObject(parent, name), - PythonNode(parent, name, build_operator()), - m_model_name(std::move(model_name)), - m_server_url(std::move(server_url)), - m_force_convert_inputs(force_convert_inputs), - m_use_shared_memory(use_shared_memory), - m_needs_logits(needs_logits), - m_inout_mapping(std::move(inout_mapping)), - m_options(m_model_name) { - // Connect with the server to setup the inputs/outputs - this->connect_with_server(); // TODO(Devin) - } - - InferenceClientStage::operator_fn_t InferenceClientStage::build_operator() { - return [this](neo::Observable &input, neo::Subscriber &output) { - std::unique_ptr client; +// Component public implementations +// ************ InferenceClientStage ************************* // +InferenceClientStage::InferenceClientStage(const neo::Segment &parent, + const std::string &name, + std::string model_name, + std::string server_url, + bool force_convert_inputs, + bool use_shared_memory, + bool needs_logits, + std::map inout_mapping) : + neo::SegmentObject(parent, name), + PythonNode(parent, name, build_operator()), + m_model_name(std::move(model_name)), + m_server_url(std::move(server_url)), + m_force_convert_inputs(force_convert_inputs), + m_use_shared_memory(use_shared_memory), + m_needs_logits(needs_logits), + m_inout_mapping(std::move(inout_mapping)), + m_options(m_model_name) +{ + // Connect with the server to setup the inputs/outputs + this->connect_with_server(); // TODO(Devin) +} - CHECK_TRITON(triton::client::InferenceServerHttpClient::Create(&client, m_server_url, false)); +InferenceClientStage::operator_fn_t InferenceClientStage::build_operator() +{ + return [this](neo::Observable &input, neo::Subscriber &output) { + std::unique_ptr client; - return input.subscribe(neo::make_observer( - [this, &output, &client](reader_type_t &&x) { - auto reponse_memory = std::make_shared(x->count); + CHECK_TRITON(triton::client::InferenceServerHttpClient::Create(&client, m_server_url, false)); - // Create the output memory blocks - for (auto &model_output: m_model_outputs) { - auto total_shape = model_output.shape; + return input.subscribe(neo::make_observer( + [this, &output, &client](reader_type_t &&x) { + auto reponse_memory = std::make_shared(x->count); - // First dimension will always end up being the number of rows - total_shape[0] = x->count; + // Create the output memory blocks + for (auto &model_output : m_model_outputs) + { + auto total_shape = model_output.shape; - auto elem_count = - std::accumulate(total_shape.begin(), total_shape.end(), 1, std::multiplies<>()); + // First dimension will always end up being the number of rows + total_shape[0] = x->count; - // Create the output memory - auto output_buffer = std::make_shared( - elem_count * model_output.datatype.item_size(), rmm::cuda_stream_per_thread); + auto elem_count = std::accumulate(total_shape.begin(), total_shape.end(), 1, std::multiplies<>()); - reponse_memory->outputs[model_output.mapped_name] = - Tensor::create(std::move(output_buffer), - model_output.datatype, - std::vector{static_cast(total_shape[0]), - static_cast(total_shape[1])}, - std::vector{}, - 0); - } + // Create the output memory + auto output_buffer = std::make_shared( + elem_count * model_output.datatype.item_size(), rmm::cuda_stream_per_thread); - // This will be the final output of all mini-batches - auto response = std::make_shared( - x->meta, x->mess_offset, x->mess_count, std::move(reponse_memory), 0, - reponse_memory->count); + reponse_memory->outputs[model_output.mapped_name] = Tensor::create( + std::move(output_buffer), + model_output.datatype, + std::vector{static_cast(total_shape[0]), static_cast(total_shape[1])}, + std::vector{}, + 0); + } - for (size_t i = 0; i < x->count; i += m_max_batch_size) { - triton::client::InferInput *input1; + // This will be the final output of all mini-batches + auto response = std::make_shared( + x->meta, x->mess_offset, x->mess_count, std::move(reponse_memory), 0, reponse_memory->count); - size_t start = i; - size_t stop = std::min(i + m_max_batch_size, x->count); + for (size_t i = 0; i < x->count; i += m_max_batch_size) + { + triton::client::InferInput *input1; - reader_type_t mini_batch_input = - std::static_pointer_cast(x->get_slice(start, stop)); - writer_type_t mini_batch_output = - std::static_pointer_cast( - response->get_slice(start, stop)); + size_t start = i; + size_t stop = std::min(i + m_max_batch_size, x->count); - // Iterate on the model inputs in case the model takes less than what tensors are available - std::vector, std::vector>> saved_inputs = - foreach_map(m_model_inputs, [this, &mini_batch_input](auto const &model_input) { - DCHECK(mini_batch_input->memory->has_input(model_input.mapped_name)) - << "Model input '" << model_input.mapped_name - << "' not found in InferenceMemory"; + reader_type_t mini_batch_input = + std::static_pointer_cast(x->get_slice(start, stop)); + writer_type_t mini_batch_output = + std::static_pointer_cast(response->get_slice(start, stop)); - auto const &inp_tensor = mini_batch_input->get_input( - model_input.mapped_name); + // Iterate on the model inputs in case the model takes less than what tensors are available + std::vector, std::vector>> + saved_inputs = foreach_map(m_model_inputs, [this, &mini_batch_input](auto const &model_input) { + DCHECK(mini_batch_input->memory->has_input(model_input.mapped_name)) + << "Model input '" << model_input.mapped_name << "' not found in InferenceMemory"; - // Convert to the right type. Make shallow if necessary - auto final_tensor = inp_tensor.as_type(model_input.datatype); + auto const &inp_tensor = mini_batch_input->get_input(model_input.mapped_name); - std::vector inp_data = final_tensor.get_host_data(); + // Convert to the right type. Make shallow if necessary + auto final_tensor = inp_tensor.as_type(model_input.datatype); - // Test - triton::client::InferInput *inp_ptr; + std::vector inp_data = final_tensor.get_host_data(); - triton::client::InferInput::Create(&inp_ptr, - model_input.name, - {inp_tensor.shape(0), - inp_tensor.shape(1)}, - model_input.datatype.triton_str()); - std::shared_ptr inp_shared; - inp_shared.reset(inp_ptr); + // Test + triton::client::InferInput *inp_ptr; - inp_ptr->AppendRaw(inp_data); + triton::client::InferInput::Create(&inp_ptr, + model_input.name, + {inp_tensor.shape(0), inp_tensor.shape(1)}, + model_input.datatype.triton_str()); + std::shared_ptr inp_shared; + inp_shared.reset(inp_ptr); - return std::make_pair(inp_shared, std::move(inp_data)); - }); + inp_ptr->AppendRaw(inp_data); - std::vector> saved_outputs = - foreach_map(m_model_outputs, [this](auto const &model_output) { - // Generate the outputs to be requested. - triton::client::InferRequestedOutput *out_ptr; + return std::make_pair(inp_shared, std::move(inp_data)); + }); - triton::client::InferRequestedOutput::Create(&out_ptr, model_output.name); - std::shared_ptr out_shared; - out_shared.reset(out_ptr); + std::vector> saved_outputs = + foreach_map(m_model_outputs, [this](auto const &model_output) { + // Generate the outputs to be requested. + triton::client::InferRequestedOutput *out_ptr; - return out_shared; - }); + triton::client::InferRequestedOutput::Create(&out_ptr, model_output.name); + std::shared_ptr out_shared; + out_shared.reset(out_ptr); - std::vector inputs = - foreach_map(saved_inputs, [](auto x) { return x.first.get(); }); + return out_shared; + }); - std::vector outputs = - foreach_map(saved_outputs, [](auto x) { return x.get(); }); + std::vector inputs = + foreach_map(saved_inputs, [](auto x) { return x.first.get(); }); - // this->segment().resources().fiber_pool().enqueue([client, output](){}); + std::vector outputs = + foreach_map(saved_outputs, [](auto x) { return x.get(); }); - triton::client::InferResult *results; + // this->segment().resources().fiber_pool().enqueue([client, output](){}); - CHECK_TRITON(client->Infer(&results, m_options, inputs, outputs)); + triton::client::InferResult *results; - for (auto &model_output: m_model_outputs) { - std::vector output_shape; + CHECK_TRITON(client->Infer(&results, m_options, inputs, outputs)); - CHECK_TRITON(results->Shape(model_output.name, &output_shape)); + for (auto &model_output : m_model_outputs) + { + std::vector output_shape; - // Make sure we have at least 2 dims - while (output_shape.size() < 2) { - output_shape.push_back(1); - } + CHECK_TRITON(results->Shape(model_output.name, &output_shape)); - const uint8_t *output_ptr = nullptr; - size_t output_ptr_size = 0; - CHECK_TRITON(results->RawData(model_output.name, &output_ptr, &output_ptr_size)); + // Make sure we have at least 2 dims + while (output_shape.size() < 2) + { + output_shape.push_back(1); + } - auto output_buffer = - std::make_shared(output_ptr_size, - rmm::cuda_stream_per_thread); + const uint8_t *output_ptr = nullptr; + size_t output_ptr_size = 0; + CHECK_TRITON(results->RawData(model_output.name, &output_ptr, &output_ptr_size)); - NEO_CHECK_CUDA( - cudaMemcpy(output_buffer->data(), output_ptr, output_ptr_size, - cudaMemcpyHostToDevice)); + auto output_buffer = + std::make_shared(output_ptr_size, rmm::cuda_stream_per_thread); - // If we need to do logits, do that here - if (m_needs_logits) { - size_t element_count = - std::accumulate(output_shape.begin(), output_shape.end(), 1, - std::multiplies<>()); - output_buffer = MatxUtil::logits( - DevMemInfo{element_count, model_output.datatype.type_id(), - output_buffer, 0}); - } + NEO_CHECK_CUDA( + cudaMemcpy(output_buffer->data(), output_ptr, output_ptr_size, cudaMemcpyHostToDevice)); - mini_batch_output->set_output( - model_output.mapped_name, - Tensor::create(std::move(output_buffer), - model_output.datatype, - std::vector{ - static_cast(output_shape[0]), - static_cast(output_shape[1])}, - std::vector{}, - 0)); - } + // If we need to do logits, do that here + if (m_needs_logits) + { + size_t element_count = + std::accumulate(output_shape.begin(), output_shape.end(), 1, std::multiplies<>()); + output_buffer = MatxUtil::logits( + DevMemInfo{element_count, model_output.datatype.type_id(), output_buffer, 0}); } - output.on_next(std::move(response)); - }, - [&](std::exception_ptr error_ptr) { output.on_error(error_ptr); }, - [&]() { output.on_completed(); })); - }; - } - void InferenceClientStage::connect_with_server() { - std::string server_url = m_server_url; + mini_batch_output->set_output( + model_output.mapped_name, + Tensor::create(std::move(output_buffer), + model_output.datatype, + std::vector{static_cast(output_shape[0]), + static_cast(output_shape[1])}, + std::vector{}, + 0)); + } + } + output.on_next(std::move(response)); + }, + [&](std::exception_ptr error_ptr) { output.on_error(error_ptr); }, + [&]() { output.on_completed(); })); + }; +} - std::unique_ptr client; +void InferenceClientStage::connect_with_server() +{ + std::string server_url = m_server_url; - auto result = triton::client::InferenceServerHttpClient::Create(&client, server_url, false); + std::unique_ptr client; - // Now load the input/outputs for the model - bool is_server_live = false; + auto result = triton::client::InferenceServerHttpClient::Create(&client, server_url, false); - triton::client::Error status = client->IsServerLive(&is_server_live); + // Now load the input/outputs for the model + bool is_server_live = false; - if (!status.IsOk()) { - if (this->is_default_grpc_port(server_url)) { - LOG(WARNING) << "Failed to connect to Triton at '" << m_server_url - << "'. Default gRPC port of (8001) was detected but C++ " - "InferenceClientStage uses HTTP protocol. Retrying with default HTTP port (8000)"; + triton::client::Error status = client->IsServerLive(&is_server_live); - // We are using the default gRPC port, try the default HTTP - std::unique_ptr unique_client; + if (!status.IsOk()) + { + if (this->is_default_grpc_port(server_url)) + { + LOG(WARNING) << "Failed to connect to Triton at '" << m_server_url + << "'. Default gRPC port of (8001) was detected but C++ " + "InferenceClientStage uses HTTP protocol. Retrying with default HTTP port (8000)"; - auto result = triton::client::InferenceServerHttpClient::Create(&unique_client, server_url, false); + // We are using the default gRPC port, try the default HTTP + std::unique_ptr unique_client; - client = std::move(unique_client); + auto result = triton::client::InferenceServerHttpClient::Create(&unique_client, server_url, false); - status = client->IsServerLive(&is_server_live); - } else if (status.Message().find("Unsupported protocol") != std::string::npos) { - throw std::runtime_error( - CONCAT_STR("Failed to connect to Triton at '" - << m_server_url - << "'. Received 'Unsupported Protocol' error. Are you using the right port? The C++ " - "InferenceClientStage uses Triton's HTTP protocol instead of gRPC. Ensure you have " - "specified the HTTP port (Default 8000).")); - } + client = std::move(unique_client); - if (!status.IsOk()) - throw std::runtime_error(CONCAT_STR("Unable to connect to Triton at '" - << m_server_url - << "'. Check the URL and port and ensure the server is running.")); + status = client->IsServerLive(&is_server_live); + } + else if (status.Message().find("Unsupported protocol") != std::string::npos) + { + throw std::runtime_error( + CONCAT_STR("Failed to connect to Triton at '" + << m_server_url + << "'. Received 'Unsupported Protocol' error. Are you using the right port? The C++ " + "InferenceClientStage uses Triton's HTTP protocol instead of gRPC. Ensure you have " + "specified the HTTP port (Default 8000).")); } - // Save this for new clients - m_server_url = server_url; - - if (!is_server_live) - throw std::runtime_error("Server is not live"); + if (!status.IsOk()) + throw std::runtime_error(CONCAT_STR("Unable to connect to Triton at '" + << m_server_url + << "'. Check the URL and port and ensure the server is running.")); + } - bool is_server_ready = false; - CHECK_TRITON(client->IsServerReady(&is_server_ready)); + // Save this for new clients + m_server_url = server_url; - if (!is_server_ready) - throw std::runtime_error("Server is not ready"); + if (!is_server_live) + throw std::runtime_error("Server is not live"); - bool is_model_ready = false; - CHECK_TRITON(client->IsModelReady(&is_model_ready, this->m_model_name)); + bool is_server_ready = false; + CHECK_TRITON(client->IsServerReady(&is_server_ready)); - if (!is_model_ready) - throw std::runtime_error("Model is not ready"); + if (!is_server_ready) + throw std::runtime_error("Server is not ready"); - std::string model_metadata_json; - CHECK_TRITON(client->ModelMetadata(&model_metadata_json, this->m_model_name)); + bool is_model_ready = false; + CHECK_TRITON(client->IsModelReady(&is_model_ready, this->m_model_name)); - auto model_metadata = nlohmann::json::parse(model_metadata_json); + if (!is_model_ready) + throw std::runtime_error("Model is not ready"); - std::string model_config_json; - CHECK_TRITON(client->ModelConfig(&model_config_json, this->m_model_name)); + std::string model_metadata_json; + CHECK_TRITON(client->ModelMetadata(&model_metadata_json, this->m_model_name)); - auto model_config = nlohmann::json::parse(model_config_json); + auto model_metadata = nlohmann::json::parse(model_metadata_json); - if (model_config.contains("max_batch_size")) { - m_max_batch_size = model_config.at("max_batch_size").get(); - } + std::string model_config_json; + CHECK_TRITON(client->ModelConfig(&model_config_json, this->m_model_name)); - for (auto const &input: model_metadata.at("inputs")) { - auto shape = input.at("shape").get>(); + auto model_config = nlohmann::json::parse(model_config_json); - auto dtype = DType::from_triton(input.at("datatype").get()); + if (model_config.contains("max_batch_size")) + { + m_max_batch_size = model_config.at("max_batch_size").get(); + } - size_t bytes = dtype.item_size(); + for (auto const &input : model_metadata.at("inputs")) + { + auto shape = input.at("shape").get>(); - for (auto &y: shape) { - if (y == -1) { - y = m_max_batch_size; - } + auto dtype = DType::from_triton(input.at("datatype").get()); - bytes *= y; - } + size_t bytes = dtype.item_size(); - std::string mapped_name = input.at("name").get(); - - if (m_inout_mapping.find(mapped_name) != m_inout_mapping.end()) { - mapped_name = m_inout_mapping[mapped_name]; + for (auto &y : shape) + { + if (y == -1) + { + y = m_max_batch_size; } - m_model_inputs.push_back(TritonInOut{input.at("name").get(), - bytes, - DType::from_triton(input.at("datatype").get()), - shape, - mapped_name, - 0}); + bytes *= y; } - for (auto const &output: model_metadata.at("outputs")) { - auto shape = output.at("shape").get>(); + std::string mapped_name = input.at("name").get(); - auto dtype = DType::from_triton(output.at("datatype").get()); + if (m_inout_mapping.find(mapped_name) != m_inout_mapping.end()) + { + mapped_name = m_inout_mapping[mapped_name]; + } - size_t bytes = dtype.item_size(); + m_model_inputs.push_back(TritonInOut{input.at("name").get(), + bytes, + DType::from_triton(input.at("datatype").get()), + shape, + mapped_name, + 0}); + } - for (auto &y: shape) { - if (y == -1) { - y = m_max_batch_size; - } + for (auto const &output : model_metadata.at("outputs")) + { + auto shape = output.at("shape").get>(); - bytes *= y; - } + auto dtype = DType::from_triton(output.at("datatype").get()); - std::string mapped_name = output.at("name").get(); + size_t bytes = dtype.item_size(); - if (m_inout_mapping.find(mapped_name) != m_inout_mapping.end()) { - mapped_name = m_inout_mapping[mapped_name]; + for (auto &y : shape) + { + if (y == -1) + { + y = m_max_batch_size; } - m_model_outputs.push_back( - TritonInOut{output.at("name").get(), bytes, dtype, shape, mapped_name, 0}); + bytes *= y; } - } - bool InferenceClientStage::is_default_grpc_port(std::string &server_url) { - // Check if we are the default gRPC port of 8001 and try 8000 for http client instead - size_t colon_loc = server_url.find_last_of(':'); + std::string mapped_name = output.at("name").get(); - if (colon_loc == -1) { - return false; + if (m_inout_mapping.find(mapped_name) != m_inout_mapping.end()) + { + mapped_name = m_inout_mapping[mapped_name]; } - // Check if the port matches 8001 - if (server_url.size() < colon_loc + 1 || server_url.substr(colon_loc + 1) != "8001") { - return false; - } + m_model_outputs.push_back( + TritonInOut{output.at("name").get(), bytes, dtype, shape, mapped_name, 0}); + } +} - // It matches, change to 8000 - server_url = server_url.substr(0, colon_loc) + ":8000"; +bool InferenceClientStage::is_default_grpc_port(std::string &server_url) +{ + // Check if we are the default gRPC port of 8001 and try 8000 for http client instead + size_t colon_loc = server_url.find_last_of(':'); - return true; + if (colon_loc == -1) + { + return false; } - // ************ InferenceClientStageInterfaceProxy********* // - std::shared_ptr - InferenceClientStageInterfaceProxy::init(neo::Segment &parent, const std::string &name, std::string model_name, - std::string server_url, bool force_convert_inputs, bool use_shared_memory, - bool needs_logits, std::map inout_mapping) { - auto stage = std::make_shared(parent, - name, - model_name, - server_url, - force_convert_inputs, - use_shared_memory, - needs_logits, - inout_mapping); - - parent.register_node(stage); - - return stage; + // Check if the port matches 8001 + if (server_url.size() < colon_loc + 1 || server_url.substr(colon_loc + 1) != "8001") + { + return false; } -} \ No newline at end of file + + // It matches, change to 8000 + server_url = server_url.substr(0, colon_loc) + ":8000"; + + return true; +} + +// ************ InferenceClientStageInterfaceProxy********* // +std::shared_ptr InferenceClientStageInterfaceProxy::init( + neo::Segment &parent, + const std::string &name, + std::string model_name, + std::string server_url, + bool force_convert_inputs, + bool use_shared_memory, + bool needs_logits, + std::map inout_mapping) +{ + auto stage = std::make_shared( + parent, name, model_name, server_url, force_convert_inputs, use_shared_memory, needs_logits, inout_mapping); + + parent.register_node(stage); + + return stage; +} +} // namespace morpheus diff --git a/morpheus/_lib/src/utilities/cupy_util.cpp b/morpheus/_lib/src/utilities/cupy_util.cpp index b1b3b7670b..3a8473d805 100644 --- a/morpheus/_lib/src/utilities/cupy_util.cpp +++ b/morpheus/_lib/src/utilities/cupy_util.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -27,90 +27,95 @@ #include // IWYU pragma: keep namespace morpheus { - pybind11::object CupyUtil::cp_module = pybind11::none(); +pybind11::object CupyUtil::cp_module = pybind11::none(); - pybind11::module_ CupyUtil::get_cp() { - DCHECK(PyGILState_Check() != 0); +pybind11::module_ CupyUtil::get_cp() +{ + DCHECK(PyGILState_Check() != 0); - if (cp_module.is_none()) { - cp_module = pybind11::module_::import("cupy"); - } - - pybind11::module_ m = pybind11::cast(cp_module); - - return m; + if (cp_module.is_none()) + { + cp_module = pybind11::module_::import("cupy"); } - pybind11::object CupyUtil::tensor_to_cupy(const neo::TensorObject &tensor) { - // These steps follow the cupy._convert_object_with_cuda_array_interface function shown here: - // https://github.com/cupy/cupy/blob/a5b24f91d4d77fa03e6a4dd2ac954ff9a04e21f4/cupy/core/core.pyx#L2478-L2514 - auto cp = CupyUtil::get_cp(); - auto cuda = cp.attr("cuda"); - auto ndarray = cp.attr("ndarray"); + pybind11::module_ m = pybind11::cast(cp_module); - auto py_tensor = pybind11::cast(tensor); + return m; +} - auto ptr = (uintptr_t) tensor.data(); - auto nbytes = tensor.bytes(); - auto owner = py_tensor; - int dev_id = -1; +pybind11::object CupyUtil::tensor_to_cupy(const TensorObject &tensor) +{ + // These steps follow the cupy._convert_object_with_cuda_array_interface function shown here: + // https://github.com/cupy/cupy/blob/a5b24f91d4d77fa03e6a4dd2ac954ff9a04e21f4/cupy/core/core.pyx#L2478-L2514 + auto cp = CupyUtil::get_cp(); + auto cuda = cp.attr("cuda"); + auto ndarray = cp.attr("ndarray"); - pybind11::list shape_list; - pybind11::list stride_list; + auto py_tensor = pybind11::cast(tensor); - for (auto &idx: tensor.get_shape()) { - shape_list.append(idx); - } + auto ptr = (uintptr_t)tensor.data(); + auto nbytes = tensor.bytes(); + auto owner = py_tensor; + int dev_id = -1; - for (auto &idx: tensor.get_stride()) { - stride_list.append(idx * tensor.dtype_size()); - } + pybind11::list shape_list; + pybind11::list stride_list; - pybind11::object mem = cuda.attr("UnownedMemory")(ptr, nbytes, owner, dev_id); - pybind11::object dtype = cp.attr("dtype")(tensor.get_numpy_typestr()); - pybind11::object memptr = cuda.attr("MemoryPointer")(mem, 0); - - // TODO(MDD): Sync on stream + for (auto &idx : tensor.get_shape()) + { + shape_list.append(idx); + } - return ndarray( - pybind11::cast(shape_list), dtype, memptr, - pybind11::cast(stride_list)); + for (auto &idx : tensor.get_stride()) + { + stride_list.append(idx * tensor.dtype_size()); } - neo::TensorObject CupyUtil::cupy_to_tensor(pybind11::object cupy_array) { - // Convert inputs from cupy to Tensor - pybind11::dict arr_interface = cupy_array.attr("__cuda_array_interface__"); + pybind11::object mem = cuda.attr("UnownedMemory")(ptr, nbytes, owner, dev_id); + pybind11::object dtype = cp.attr("dtype")(tensor.get_numpy_typestr()); + pybind11::object memptr = cuda.attr("MemoryPointer")(mem, 0); - pybind11::tuple shape_tup = arr_interface["shape"]; + // TODO(MDD): Sync on stream - pybind11::print(shape_tup); - auto shape = shape_tup.cast>(); + return ndarray( + pybind11::cast(shape_list), dtype, memptr, pybind11::cast(stride_list)); +} - std::string typestr = arr_interface["typestr"].cast(); +TensorObject CupyUtil::cupy_to_tensor(pybind11::object cupy_array) +{ + // Convert inputs from cupy to Tensor + pybind11::dict arr_interface = cupy_array.attr("__cuda_array_interface__"); - pybind11::tuple data_tup = arr_interface["data"]; + pybind11::tuple shape_tup = arr_interface["shape"]; - uintptr_t data_ptr = data_tup[0].cast(); + pybind11::print(shape_tup); + auto shape = shape_tup.cast>(); - std::vector strides{}; + std::string typestr = arr_interface["typestr"].cast(); - if (arr_interface.contains("strides") && !arr_interface["strides"].is_none()) { - pybind11::tuple strides_tup = arr_interface["strides"]; + pybind11::tuple data_tup = arr_interface["data"]; - strides = strides_tup.cast>(); - } + uintptr_t data_ptr = data_tup[0].cast(); - // Get the size finally - auto size = cupy_array.attr("data").attr("mem").attr("size").cast(); + std::vector strides{}; - auto tensor = - Tensor::create(std::make_shared((void const *) data_ptr, size, - rmm::cuda_stream_per_thread), - DType::from_numpy(typestr), - shape, - strides, - 0); + if (arr_interface.contains("strides") && !arr_interface["strides"].is_none()) + { + pybind11::tuple strides_tup = arr_interface["strides"]; - return tensor; + strides = strides_tup.cast>(); } + + // Get the size finally + auto size = cupy_array.attr("data").attr("mem").attr("size").cast(); + + auto tensor = + Tensor::create(std::make_shared((void const *)data_ptr, size, rmm::cuda_stream_per_thread), + DType::from_numpy(typestr), + shape, + strides, + 0); + + return tensor; +} } // namespace morpheus diff --git a/morpheus/_lib/src/utilities/matx_util.cu b/morpheus/_lib/src/utilities/matx_util.cu index b1de454ce7..bee8b1016c 100644 --- a/morpheus/_lib/src/utilities/matx_util.cu +++ b/morpheus/_lib/src/utilities/matx_util.cu @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,9 +19,9 @@ #include #include +#include #include -#include #include @@ -177,7 +177,7 @@ namespace morpheus { */ template()> * = nullptr> void - operator()(void *input_data, void *output_data, double threshold, const std::vector &stride) { + operator()(void *input_data, void *output_data, double threshold, const std::vector &stride) { throw std::invalid_argument("Unsupported conversion"); } @@ -186,7 +186,7 @@ namespace morpheus { */ template()> * = nullptr> void - operator()(void *input_data, void *output_data, double threshold, const std::vector &stride) { + operator()(void *input_data, void *output_data, double threshold, const std::vector &stride) { if (by_row) { this->threshold_by_row(input_data, output_data, threshold, stride); } else { @@ -200,7 +200,7 @@ namespace morpheus { */ template void threshold_by_row(void *input_data, void *output_data, double threshold, - const std::vector &stride) { + const std::vector &stride) { matx::tensorShape_t<2> input_shape({static_cast(rows), static_cast(cols)}); // Output is always 1 column @@ -229,7 +229,7 @@ namespace morpheus { */ template void - threshold(void *input_data, void *output_data, double threshold, const std::vector &stride) { + threshold(void *input_data, void *output_data, double threshold, const std::vector &stride) { matx::tensorShape_t<2> shape({static_cast(rows), static_cast(cols)}); matx::index_t matx_stride[2] = {static_cast(stride[0]), @@ -245,7 +245,7 @@ namespace morpheus { // Component public implementations // ************ MatxUtil************************* // - std::shared_ptr MatxUtil::cast(const DevMemInfo &input, neo::TypeId output_type) { + std::shared_ptr MatxUtil::cast(const DevMemInfo &input, TypeId output_type) { auto input_dtype = DType(input.type_id); auto output_dtype = DType(output_type); @@ -266,7 +266,7 @@ namespace morpheus { } std::shared_ptr - MatxUtil::create_seg_ids(size_t row_count, size_t fea_len, neo::TypeId output_type) { + MatxUtil::create_seg_ids(size_t row_count, size_t fea_len, TypeId output_type) { auto output_dtype = DType(output_type); // Now create the output @@ -313,7 +313,7 @@ namespace morpheus { std::shared_ptr MatxUtil::threshold(const DevMemInfo &input, size_t rows, size_t cols, - const std::vector &stride, + const std::vector &stride, double thresh_val, bool by_row) { auto input_dtype = DType(input.type_id); @@ -337,4 +337,4 @@ namespace morpheus { return output; } -} \ No newline at end of file +} diff --git a/morpheus/_lib/src/utilities/tensor_util.cpp b/morpheus/_lib/src/utilities/tensor_util.cpp new file mode 100644 index 0000000000..f8f896d3b1 --- /dev/null +++ b/morpheus/_lib/src/utilities/tensor_util.cpp @@ -0,0 +1,90 @@ +/** + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include // for sort_indexes + +#include // for DCHECK_EQ + +#include // for copy +#include +#include // for multiplies +#include // for begin, end +#include // for accumulate +#include // for operator<<, ostream, stringstream +#include // for char_traits, string +#include // for decay_t +#include // for vector + +namespace morpheus { + +void TensorUtils::write_shape_to_stream(const shape_type& shape, std::ostream& os) +{ + os << "("; + std::copy(shape.begin(), shape.end(), std::experimental::make_ostream_joiner(os, ", ")); + os << ")"; +} + +std::string TensorUtils::shape_to_string(const shape_type& shape) +{ + std::stringstream ss; + write_shape_to_stream(shape, ss); + return ss.str(); +} + +void TensorUtils::set_contiguous_stride(const std::vector& shape, std::vector& stride) +{ + stride.resize(shape.size()); + TensorIndex ttl = 1; + auto rank = shape.size(); + for (int i = rank - 1; i >= 0; i--) + { + stride[i] = ttl; + ttl *= shape.at(i); + } +} + +bool TensorUtils::has_contiguous_stride(const std::vector& shape, const shape_type& stride) +{ + DCHECK_EQ(shape.size(), stride.size()); + auto count = std::accumulate(std::begin(shape), std::end(shape), 1, std::multiplies<>()); + return (shape[0] * stride[0] == count); +} + +bool TensorUtils::validate_shape_and_stride(const std::vector& shape, + const std::vector& stride) +{ + if (shape.size() != stride.size()) + { + return false; + } + + auto stride_sorted_idx = neo::sort_indexes(stride); + + for (int i = 0; i < stride_sorted_idx.size() - 1; ++i) + { + if (!(stride[stride_sorted_idx[i]] * shape[stride_sorted_idx[i]] <= stride[stride_sorted_idx[i + 1]])) + { + return false; + } + } + + return true; +} + +} // namespace morpheus diff --git a/morpheus/_lib/src/utilities/type_util.cu b/morpheus/_lib/src/utilities/type_util.cu index 15e2d64e74..8fc4697178 100644 --- a/morpheus/_lib/src/utilities/type_util.cu +++ b/morpheus/_lib/src/utilities/type_util.cu @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,38 +22,38 @@ namespace morpheus { -DType::DType(const neo::DataType& dtype) : neo::DataType(dtype.type_id()) {} -DType::DType(neo::TypeId tid) : neo::DataType(tid) {} +DType::DType(const DataType& dtype) : DataType(dtype.type_id()) {} +DType::DType(TypeId tid) : DataType(tid) {} // Cudf representation cudf::type_id DType::cudf_type_id() const { switch (m_type_id) { - case neo::TypeId::INT8: + case TypeId::INT8: return cudf::type_id::INT8; - case neo::TypeId::INT16: + case TypeId::INT16: return cudf::type_id::INT16; - case neo::TypeId::INT32: + case TypeId::INT32: return cudf::type_id::INT32; - case neo::TypeId::INT64: + case TypeId::INT64: return cudf::type_id::INT64; - case neo::TypeId::UINT8: + case TypeId::UINT8: return cudf::type_id::UINT8; - case neo::TypeId::UINT16: + case TypeId::UINT16: return cudf::type_id::UINT16; - case neo::TypeId::UINT32: + case TypeId::UINT32: return cudf::type_id::UINT32; - case neo::TypeId::UINT64: + case TypeId::UINT64: return cudf::type_id::UINT64; - case neo::TypeId::FLOAT32: + case TypeId::FLOAT32: return cudf::type_id::FLOAT32; - case neo::TypeId::FLOAT64: + case TypeId::FLOAT64: return cudf::type_id::FLOAT64; - case neo::TypeId::BOOL8: + case TypeId::BOOL8: return cudf::type_id::BOOL8; - case neo::TypeId::EMPTY: - case neo::TypeId::NUM_TYPE_IDS: + case TypeId::EMPTY: + case TypeId::NUM_TYPE_IDS: default: throw std::runtime_error("Not supported"); } @@ -65,30 +65,30 @@ std::string DType::triton_str() const // Triton doesnt have any definitions or enums. Wow switch (m_type_id) { - case neo::TypeId::INT8: + case TypeId::INT8: return "INT8"; - case neo::TypeId::INT16: + case TypeId::INT16: return "INT16"; - case neo::TypeId::INT32: + case TypeId::INT32: return "INT32"; - case neo::TypeId::INT64: + case TypeId::INT64: return "INT64"; - case neo::TypeId::UINT8: + case TypeId::UINT8: return "UINT8"; - case neo::TypeId::UINT16: + case TypeId::UINT16: return "UINT16"; - case neo::TypeId::UINT32: + case TypeId::UINT32: return "UINT32"; - case neo::TypeId::UINT64: + case TypeId::UINT64: return "UINT64"; - case neo::TypeId::FLOAT32: + case TypeId::FLOAT32: return "FP32"; - case neo::TypeId::FLOAT64: + case TypeId::FLOAT64: return "FP64"; - case neo::TypeId::BOOL8: + case TypeId::BOOL8: return "BOOL"; - case neo::TypeId::EMPTY: - case neo::TypeId::NUM_TYPE_IDS: + case TypeId::EMPTY: + case TypeId::NUM_TYPE_IDS: default: throw std::runtime_error("Not supported"); } @@ -100,27 +100,27 @@ DType DType::from_cudf(cudf::type_id tid) switch (tid) { case cudf::type_id::INT8: - return DType(neo::TypeId::INT8); + return DType(TypeId::INT8); case cudf::type_id::INT16: - return DType(neo::TypeId::INT16); + return DType(TypeId::INT16); case cudf::type_id::INT32: - return DType(neo::TypeId::INT32); + return DType(TypeId::INT32); case cudf::type_id::INT64: - return DType(neo::TypeId::INT64); + return DType(TypeId::INT64); case cudf::type_id::UINT8: - return DType(neo::TypeId::UINT8); + return DType(TypeId::UINT8); case cudf::type_id::UINT16: - return DType(neo::TypeId::UINT16); + return DType(TypeId::UINT16); case cudf::type_id::UINT32: - return DType(neo::TypeId::UINT32); + return DType(TypeId::UINT32); case cudf::type_id::UINT64: - return DType(neo::TypeId::UINT64); + return DType(TypeId::UINT64); case cudf::type_id::FLOAT32: - return DType(neo::TypeId::FLOAT32); + return DType(TypeId::FLOAT32); case cudf::type_id::FLOAT64: - return DType(neo::TypeId::FLOAT64); + return DType(TypeId::FLOAT64); case cudf::type_id::BOOL8: - return DType(neo::TypeId::BOOL8); + return DType(TypeId::BOOL8); case cudf::type_id::EMPTY: case cudf::type_id::NUM_TYPE_IDS: default: @@ -133,47 +133,47 @@ DType DType::from_triton(const std::string& type_str) { if (type_str == "INT8") { - return DType(neo::TypeId::INT8); + return DType(TypeId::INT8); } else if (type_str == "INT16") { - return DType(neo::TypeId::INT16); + return DType(TypeId::INT16); } else if (type_str == "INT32") { - return DType(neo::TypeId::INT32); + return DType(TypeId::INT32); } else if (type_str == "INT64") { - return DType(neo::TypeId::INT64); + return DType(TypeId::INT64); } else if (type_str == "UINT8") { - return DType(neo::TypeId::UINT8); + return DType(TypeId::UINT8); } else if (type_str == "UINT16") { - return DType(neo::TypeId::UINT16); + return DType(TypeId::UINT16); } else if (type_str == "UINT32") { - return DType(neo::TypeId::UINT32); + return DType(TypeId::UINT32); } else if (type_str == "UINT64") { - return DType(neo::TypeId::UINT64); + return DType(TypeId::UINT64); } else if (type_str == "FP32") { - return DType(neo::TypeId::FLOAT32); + return DType(TypeId::FLOAT32); } else if (type_str == "FP64") { - return DType(neo::TypeId::FLOAT64); + return DType(TypeId::FLOAT64); } else if (type_str == "BOOL") { - return DType(neo::TypeId::BOOL8); + return DType(TypeId::BOOL8); } else { diff --git a/morpheus/_lib/src/utilities/type_util_detail.cpp b/morpheus/_lib/src/utilities/type_util_detail.cpp new file mode 100644 index 0000000000..c2602e244a --- /dev/null +++ b/morpheus/_lib/src/utilities/type_util_detail.cpp @@ -0,0 +1,158 @@ +/** + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include + +#include + +#include // for size_t +#include +#include +#include +#include // for pair + +namespace morpheus { + +std::map> make_str_to_type_id() +{ + std::map> map; + + map['?'][1] = TypeId::BOOL8; + + map['i'][1] = TypeId::INT8; + map['i'][2] = TypeId::INT16; + map['i'][4] = TypeId::INT32; + map['i'][8] = TypeId::INT64; + + map['u'][1] = TypeId::UINT8; + map['u'][2] = TypeId::UINT16; + map['u'][4] = TypeId::UINT32; + map['u'][8] = TypeId::UINT64; + + map['f'][4] = TypeId::FLOAT32; + map['f'][8] = TypeId::FLOAT64; + + return map; +} + +std::map> str_to_type_id = make_str_to_type_id(); + +DataType::DataType(TypeId tid) : m_type_id(tid) {} + +TypeId DataType::type_id() const +{ + return m_type_id; +} + +size_t DataType::item_size() const +{ + switch (m_type_id) + { + case TypeId::INT8: + case TypeId::UINT8: + case TypeId::BOOL8: + return 1; + case TypeId::INT16: + case TypeId::UINT16: + return 2; + case TypeId::INT32: + case TypeId::UINT32: + case TypeId::FLOAT32: + return 4; + case TypeId::INT64: + case TypeId::UINT64: + case TypeId::FLOAT64: + return 8; + case TypeId::NUM_TYPE_IDS: + case TypeId::EMPTY: + default: + throw std::invalid_argument("Unknown datatype"); + } +} + +std::string DataType::name() const +{ + // TODO(MDD): Replace this with a better version. For now, follow type_str + return this->type_str(); +} + +std::string DataType::type_str() const +{ + return CONCAT_STR("<" << this->type_char() << this->item_size()); +} + +bool DataType::operator==(const DataType& other) const +{ + return m_type_id == other.m_type_id; +} + +DataType DataType::from_numpy(const std::string& numpy_str) +{ + CHECK(!numpy_str.empty()) << "Cannot create DataType from empty string"; + + char type_char = numpy_str[0]; + size_t size_start = 1; + + // Can start with < or > or none + if (numpy_str[0] == '<' || numpy_str[0] == '>') + { + type_char = numpy_str[1]; + size_start = 2; + } + + auto dtype_size = std::stoi(numpy_str.substr(size_start)); + + // Now lookup in the map + auto found_type = str_to_type_id.find(type_char); + + CHECK(found_type != str_to_type_id.end()) << "Type char '" << type_char << "' not supported"; + + auto found_enum = found_type->second.find(dtype_size); + + CHECK(found_enum != found_type->second.end()) << "Type str '" << type_char << dtype_size << "' not supported"; + + return DataType(found_enum->second); +} + +char DataType::type_char() const +{ + switch (m_type_id) + { + case TypeId::INT8: + case TypeId::INT16: + case TypeId::INT32: + case TypeId::INT64: + return 'i'; + case TypeId::UINT8: + case TypeId::UINT16: + case TypeId::UINT32: + case TypeId::UINT64: + return 'u'; + case TypeId::BOOL8: + return '?'; + case TypeId::FLOAT32: + case TypeId::FLOAT64: + return 'f'; + case TypeId::NUM_TYPE_IDS: + case TypeId::EMPTY: + default: + throw std::invalid_argument("Unknown datatype"); + } +} +} // namespace morpheus diff --git a/morpheus/_lib/tests/CMakeLists.txt b/morpheus/_lib/tests/CMakeLists.txt new file mode 100644 index 0000000000..eb97df5fd6 --- /dev/null +++ b/morpheus/_lib/tests/CMakeLists.txt @@ -0,0 +1,40 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +list(APPEND CMAKE_MESSAGE_CONTEXT "tests") + +# Keep all source files sorted +add_executable(test_libmorpheus + test_cuda.cu + test_main.cpp + test_tensor.cpp + test_type_util_detail.cpp +) + +target_link_libraries(test_libmorpheus + PRIVATE + cuda_utils + neo::pyneo + GTest::gtest + matx::matx + pybind11::embed +) + +add_test( + NAME test_libmorpheus + COMMAND $ +) + +list(POP_BACK CMAKE_MESSAGE_CONTEXT) diff --git a/morpheus/_lib/tests/test_cuda.cu b/morpheus/_lib/tests/test_cuda.cu new file mode 100644 index 0000000000..6b5fbbd07d --- /dev/null +++ b/morpheus/_lib/tests/test_cuda.cu @@ -0,0 +1,160 @@ +/** + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "test_morpheus.hpp" + +#include + +#include // for NEO_CHECK_CUDA +//#include +#include // for enqueue_stream_sync_event +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include + +#include +#include +#include + +using namespace neo::memory::literals; +using namespace morpheus; + +using RankType = int; + + +class TestCuda : public ::testing::Test +{ + protected: + void SetUp() override + { + NEO_CHECK_CUDA(cudaStreamCreate(&stream)); + + auto pinned = std::make_shared(); + auto device = std::make_shared(0); + + m_host_allocator = neo::memory::OldHostAllocator(pinned, nullptr).shared(); + m_device_allocator = neo::memory::OldDeviceAllocator(device, nullptr).shared(); + } + + void TearDown() override + { + NEO_CHECK_CUDA(cudaStreamSynchronize(stream)); + NEO_CHECK_CUDA(cudaStreamDestroy(stream)); + } + + template + TensorObject make_host_tensor(const TensorIndex (&shape)[R]) + { + auto count = std::accumulate(std::begin(shape), std::end(shape), 1, std::multiplies<>()); + auto md = m_host_allocator->allocate_descriptor(count * sizeof(T)).make_shared(); + std::vector s(std::begin(shape), std::end(shape)); + + auto tensor = std::make_shared( + md, 0, DataType(TypeId::FLOAT32), std::vector{s}, std::vector{}); + + return TensorObject(md, tensor); + } + + template + TensorObject make_device_tensor(const TensorIndex (&shape)[R]) + { + auto count = std::accumulate(std::begin(shape), std::end(shape), 1, std::multiplies<>()); + auto md = m_device_allocator->allocate_descriptor(count * sizeof(T)).make_shared(); + std::vector s(std::begin(shape), std::end(shape)); + + auto tensor = std::make_shared(md, 0, DataType(TypeId::FLOAT32), s); + + return TensorObject(md, std::move(tensor)); + } + + cudaStream_t stream; // NOLINT + + std::shared_ptr m_host_allocator; + std::shared_ptr m_device_allocator; +}; + +template +auto await_matx(matx::BaseOp& op, cudaStream_t stream) +{ + op.run(stream); + return neo::enqueue_stream_sync_event(stream); +} + +void test_1d(const TensorObject& one_d) +{ + CHECK_EQ(one_d.rank(), 1); + CHECK_EQ(one_d.dtype_size(), 4); + CHECK_EQ(one_d.count(), 100); + CHECK_EQ(one_d.bytes(), 400); + CHECK_EQ(one_d.shape(0), 100); + CHECK_EQ(one_d.stride(0), 1); +} + +void test_2d(const TensorObject& two_d) +{ + CHECK_EQ(two_d.rank(), 2); + CHECK_EQ(two_d.dtype_size(), 4); + CHECK_EQ(two_d.count(), 100); + CHECK_EQ(two_d.bytes(), 400); + CHECK_EQ(two_d.shape(0), 10); + CHECK_EQ(two_d.shape(1), 10); + + // row major + CHECK_EQ(two_d.stride(0), 10); + CHECK_EQ(two_d.stride(1), 1); +} + +TEST_F(TestCuda, Tensor1D) +{ + auto one_d = make_host_tensor({100}); + test_1d(one_d); + + auto two_d = one_d.reshape({10, 10}); + test_2d(two_d); +} + +TEST_F(TestCuda, Tensor2D) +{ + auto two_d = make_host_tensor({10, 10}); + test_2d(two_d); + + auto one_d = two_d.reshape({100}); + test_1d(one_d); + + CHECK_EQ(one_d.data(), two_d.data()); +} + + +TEST_F(TestCuda, Shape) +{ + std::array array_2d = {3, 5}; + matx::tensorShape_t<2> shape_2d(array_2d.data()); +} diff --git a/morpheus/_lib/tests/test_main.cpp b/morpheus/_lib/tests/test_main.cpp new file mode 100644 index 0000000000..8d5c0d27d4 --- /dev/null +++ b/morpheus/_lib/tests/test_main.cpp @@ -0,0 +1,31 @@ +/** + * SPDX-FileCopyrightText: Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include // for ParseCommandLineFlags + +#include + +#include // IWYU pragma: keep + +int main(int argc, char** argv) +{ + FLAGS_alsologtostderr = true; // Log to console + ::google::InitGoogleLogging("morpheus::test_libmorpheus"); + ::testing::InitGoogleTest(&argc, argv); + ::google::ParseCommandLineFlags(&argc, &argv, true); + return RUN_ALL_TESTS(); +} diff --git a/morpheus/_lib/tests/test_morpheus.hpp b/morpheus/_lib/tests/test_morpheus.hpp new file mode 100644 index 0000000000..1b8c9d2667 --- /dev/null +++ b/morpheus/_lib/tests/test_morpheus.hpp @@ -0,0 +1,25 @@ +/** + * SPDX-FileCopyrightText: Copyright (c) 2018-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include // IWYU pragma: keep +#include // IWYU pragma: keep + +#define TEST_CLASS(name) \ + class Test##name : public ::testing::Test \ + {} diff --git a/morpheus/_lib/tests/test_tensor.cpp b/morpheus/_lib/tests/test_tensor.cpp new file mode 100644 index 0000000000..83fb51c956 --- /dev/null +++ b/morpheus/_lib/tests/test_tensor.cpp @@ -0,0 +1,60 @@ +/** + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "./test_morpheus.hpp" // IWYU pragma: associated + +#include // for TensorUtils, TensorUtils::shape_type + +#include // for AssertionResult, SuiteApiResolver, TestInfo, EXPECT_TRUE, Message, TEST_F, Test, TestFactoryImpl, TestPartResult + +#include // for allocator, operator==, basic_string, string + +class TestTensor : public ::testing::Test +{ + protected: + void SetUp() override {} + void TearDown() override {} +}; + +TEST_F(TestTensor, UtilsShapeString) +{ + morpheus::TensorUtils::shape_type shape = {100, 10, 1}; + auto shape_str = morpheus::TensorUtils::shape_to_string(shape); + EXPECT_TRUE(shape_str == std::string("(100, 10, 1)")); +} + +/* +TEST_F(TestTensor, UtilsValidateShapeAndStride) +{ + // validate shape and stride works off element count without knowledge + // the dtype size + // + // stride 1 tensors must have a sorted_index(shape).begin() == 1 + + void *ptr = reinterpret_cast(0xDEADBEEF); + std::size_t bytes = 32 * 1024 * 1024; // 32 MB + + memory::blob mv(ptr, bytes, memory::memory_kind_type::pinned); + + TensorView t0(mv, DataType::create(), {3, 320, 320}); + + EXPECT_TRUE(TensorUtils::has_contiguous_stride(t0.shape(), t0.stride())); + EXPECT_TRUE(TensorUtils::validate_shape_and_stride(t0.shape(), t0.stride())); + + EXPECT_EQ(t0.stride(), std::vector({320 * 320, 320, 1})); +} +*/ diff --git a/morpheus/_lib/tests/test_type_util_detail.cpp b/morpheus/_lib/tests/test_type_util_detail.cpp new file mode 100644 index 0000000000..17aafd5760 --- /dev/null +++ b/morpheus/_lib/tests/test_type_util_detail.cpp @@ -0,0 +1,55 @@ +/* + * SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "./test_morpheus.hpp" // IWYU pragma: associated + +#include + +#include // for EXPECT_EQ + +#include + +TEST_CLASS(TypeUtils); + +TEST_F(TestTypeUtils, DataTypeCopy) +{ + morpheus::DataType d1(morpheus::TypeId::INT32); + morpheus::DataType d2(morpheus::TypeId::FLOAT32); + + std::vector type_list; + type_list.push_back(d1); + type_list.push_back(d2); + type_list.emplace_back(morpheus::TypeId::INT32); + type_list.emplace_back(morpheus::TypeId::FLOAT32); + + EXPECT_EQ(type_list[0], d1); + EXPECT_EQ(type_list[1], d2); + EXPECT_EQ(type_list[2], d1); + EXPECT_EQ(type_list[3], d2); + + morpheus::DataType d3 = d1; + morpheus::DataType d4 = d2; + + EXPECT_EQ(d3, d1); + EXPECT_EQ(d3.type_id(), d1.type_id()); + + EXPECT_EQ(d4, d2); + EXPECT_EQ(d4.type_id(), d2.type_id()); + + morpheus::DataType d5{d1}; + morpheus::DataType d6{d2}; +} From 0bb791082342bc0fb4e94d8f5e83a54e4a5666ac Mon Sep 17 00:00:00 2001 From: bsuryadevara Date: Wed, 1 Jun 2022 12:11:18 -0500 Subject: [PATCH 32/73] Update morpheus_quickstart_guide.md (#127) Minor updates to Quickstart guide Authors: - https://github.com/bsuryadevara Approvers: - Pete MacKinnon (https://github.com/pdmack) - David Gardner (https://github.com/dagardner-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/127 --- docs/source/morpheus_quickstart_guide.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/source/morpheus_quickstart_guide.md b/docs/source/morpheus_quickstart_guide.md index 4f433aaf89..e32b636987 100644 --- a/docs/source/morpheus_quickstart_guide.md +++ b/docs/source/morpheus_quickstart_guide.md @@ -187,24 +187,24 @@ replicaset.apps/zookeeper-87f9f4dd 1 1 1 54s ``` ### Install Morpheus SDK Client -Run the following commands to pull and install the Morpheus CLI on your instance: +Run the following command to pull the Morpheus SDK Client chart on to your instance: ```bash $ helm fetch https://helm.ngc.nvidia.com/nvidia/morpheus/charts/morpheus-sdk-client-22.06.tgz --username='$oauthtoken' --password=$API_KEY --untar ``` +**Note**: For reference, the Morpheus SDK Client install pipeline command template is provided. Let's take a closer look at this when running [example workflows](#example-workflows), but for now, let's proceed to the next step. + ```bash $ helm install --set ngc.apiKey="$API_KEY" \ - --set sdk.args="" \ + --set sdk.args="" \ --namespace $NAMESPACE \ \ morpheus-sdk-client ``` -**Note**: The install command references the run pipeline command argument, provided in the [example workflows](#example-workflows) below. - #### Morpheus SDK Client in Sleep Mode -Using the default `sdk.args` from the charts, Morpheus SDK Client would be put into sleep mode. +Install the Morpheus SDK client pod in sleep mode to copy its sample datasets and models from the container to a shared location that other pods can access. If no `sdk.args` is supplied, the default value `/bin/sleep infinity` from the chart is used in the following command. ```bash $ helm install --set ngc.apiKey="$API_KEY" \ From 36af32cc9c2954203a018755f0e59075078c318a Mon Sep 17 00:00:00 2001 From: bsuryadevara Date: Fri, 3 Jun 2022 09:36:33 -0500 Subject: [PATCH 33/73] AppShieldSource stage (#136) The AppShield source stage reads and normalizes AppShield plugin messages before loading them into a dataframe for further processing. Closes https://github.com/nv-morpheus/Morpheus/issues/37 Authors: - https://github.com/bsuryadevara - https://github.com/bsuryadev Approvers: - David Gardner (https://github.com/dagardner-nv) - Pete MacKinnon (https://github.com/pdmack) URL: https://github.com/nv-morpheus/Morpheus/pull/136 --- .gitattributes | 2 +- docker/conda/environments/requirements.txt | 1 + morpheus/cli.py | 13 + morpheus/messages/message_meta.py | 15 + .../stages/input/appshield_source_stage.py | 383 ++++++++++++++++++ .../stages/input/cloud_trail_source_stage.py | 148 ++----- morpheus/utils/directory_watcher.py | 227 +++++++++++ morpheus/utils/onnx_to_trt.py | 1 - tests/test_abp.py | 2 +- tests/test_add_classifications_stage_pipe.py | 2 +- tests/test_add_scores_stage_pipe.py | 2 +- tests/test_appshield_source_stage.py | 364 +++++++++++++++++ tests/test_cli.py | 4 +- tests/test_directory_watcher.py | 52 +++ tests/test_file_in_out_stage_pipe.py | 4 +- tests/test_filter_detections_stage_pipe.py | 2 +- tests/test_hammah.py | 9 +- tests/test_phishing.py | 2 +- tests/test_serialize_stage_pipe.py | 2 +- tests/test_sid.py | 2 +- .../envars_2022-01-30_10-26-01.017250.json | 3 + .../handles_2022-01-30_10-26-04.570268.json | 3 + ...ldrmodules_2022-01-30_10-25-59.669333.json | 3 + ...threadlist_2022-01-30_10-26-01.670391.json | 3 + .../vadinfo_2022-01-30_10-26-02.785396.json | 3 + .../filter_probs.csv | 0 .../hammah_roleg_anomaly_score.csv | 0 .../hammah_roleg_tensor.csv | 0 .../hammah_user123_anomaly_score.csv | 0 .../hammah_user123_tensor.csv | 0 .../triton_abp_inf_results.csv | 0 .../triton_phishing_inf_results.csv | 0 .../triton_sid_inf_results.csv | 0 tests/utils.py | 2 +- 34 files changed, 1112 insertions(+), 142 deletions(-) create mode 100644 morpheus/stages/input/appshield_source_stage.py create mode 100644 morpheus/utils/directory_watcher.py create mode 100755 tests/test_appshield_source_stage.py create mode 100644 tests/test_directory_watcher.py create mode 100644 tests/tests_data/appshield/snapshot-1/envars_2022-01-30_10-26-01.017250.json create mode 100644 tests/tests_data/appshield/snapshot-1/handles_2022-01-30_10-26-04.570268.json create mode 100644 tests/tests_data/appshield/snapshot-1/ldrmodules_2022-01-30_10-25-59.669333.json create mode 100644 tests/tests_data/appshield/snapshot-1/threadlist_2022-01-30_10-26-01.670391.json create mode 100644 tests/tests_data/appshield/snapshot-1/vadinfo_2022-01-30_10-26-02.785396.json rename tests/{expected_data => tests_data}/filter_probs.csv (100%) rename tests/{expected_data => tests_data}/hammah_roleg_anomaly_score.csv (100%) rename tests/{expected_data => tests_data}/hammah_roleg_tensor.csv (100%) rename tests/{expected_data => tests_data}/hammah_user123_anomaly_score.csv (100%) rename tests/{expected_data => tests_data}/hammah_user123_tensor.csv (100%) rename tests/{expected_data => tests_data}/triton_abp_inf_results.csv (100%) rename tests/{expected_data => tests_data}/triton_phishing_inf_results.csv (100%) rename tests/{expected_data => tests_data}/triton_sid_inf_results.csv (100%) diff --git a/.gitattributes b/.gitattributes index c9e36e9a1e..166f6e171b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,4 @@ morpheus/_version.py export-subst morpheus/data/* filter=lfs diff=lfs merge=lfs -text -tests/expected_data/* filter=lfs diff=lfs merge=lfs -text tests/mock_triton_server/payloads/** filter=lfs diff=lfs merge=lfs -text +tests/tests_data/** filter=lfs diff=lfs merge=lfs -text diff --git a/docker/conda/environments/requirements.txt b/docker/conda/environments/requirements.txt index 0654517c23..df28bd6795 100644 --- a/docker/conda/environments/requirements.txt +++ b/docker/conda/environments/requirements.txt @@ -16,3 +16,4 @@ torch==1.10.2+cu113 tqdm tritonclient[all] typing-utils +watchdog==2.1.8 diff --git a/morpheus/cli.py b/morpheus/cli.py index c6ce7d3dfc..619a37f4ef 100644 --- a/morpheus/cli.py +++ b/morpheus/cli.py @@ -662,6 +662,19 @@ def from_kafka(ctx: click.Context, **kwargs): default=1, type=click.IntRange(min=1), help=("Repeats the input dataset multiple times. Useful to extend small datasets for debugging.")) +@click.option('--sort_glob', + type=bool, + default=False, + help=("If true the list of files matching `input_glob` will be processed in sorted order.")) +@click.option('--recursive', + type=bool, + default=True, + help=("If true, events will be emitted for the files in subdirectories matching `input_glob`.")) +@click.option('--queue_max_size', + type=int, + default=128, + help=("Maximum queue size to hold the file paths to be processed that match `input_glob`.")) +@click.option('--batch_timeout', type=float, default=5.0, help=("Timeout to retrieve batch messages from the queue.")) @prepare_command() def from_cloudtrail(ctx: click.Context, **kwargs): diff --git a/morpheus/messages/message_meta.py b/morpheus/messages/message_meta.py index 553325f9fb..7bca761183 100644 --- a/morpheus/messages/message_meta.py +++ b/morpheus/messages/message_meta.py @@ -62,3 +62,18 @@ class UserMessageMeta(MessageMeta, cpp_class=None): """ user_id: str + + +@dataclasses.dataclass +class AppShieldMessageMeta(MessageMeta, cpp_class=None): + """ + This class extends MessageMeta to also hold source corresponding to batched metadata. + + Parameters + ---------- + df : pd.DataFrame + Input rows in dataframe. + source : str + Determines which source generated the snapshot messages. + """ + source: str diff --git a/morpheus/stages/input/appshield_source_stage.py b/morpheus/stages/input/appshield_source_stage.py new file mode 100644 index 0000000000..125027a7ee --- /dev/null +++ b/morpheus/stages/input/appshield_source_stage.py @@ -0,0 +1,383 @@ +# Copyright (c) 2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import io +import json +import logging +import re +import typing +from functools import partial +from json.decoder import JSONDecodeError + +import neo +import pandas as pd +from neo.core import operators as ops + +from morpheus.config import Config +from morpheus.messages.message_meta import AppShieldMessageMeta +from morpheus.pipeline import SingleOutputSource +from morpheus.pipeline import StreamPair +from morpheus.utils.directory_watcher import DirectoryWatcher + +logger = logging.getLogger(__name__) + + +class AppShieldSourceStage(SingleOutputSource): + """ + Source stage is used to load Appshield messages from one or more plugins into a dataframe. + It normalizes nested json messages and arranges them into a dataframe by snapshot + and source(Determine which source generated the plugin messages). + + Parameters + ---------- + c : `morpheus.config.Config` + Pipeline configuration instance. + input_glob : str + Input glob pattern to match files to read. For example, `./input_dir//snapshot-*/*.json` would read all + files with the 'json' extension in the directory input_dir. + plugins_include: List[str], default = None + Plugins for appshield to be extracted. + cols_include: List[str], default = None + Raw features to extract from appshield plugins data. + cols_exclude: List[str], default = ["SHA256"] + Columns that aren't essential should be excluded. + watch_directory : bool, default = False + The watch directory option instructs this stage to not close down once all files have been read. Instead it will + read all files that match the 'input_glob' pattern, and then continue to watch the directory for additional + files. Any new files that are added that match the glob will then be processed. + max_files: int, default = -1 + Max number of files to read. Useful for debugging to limit startup time. Default value of -1 is unlimited. + sort_glob : bool, default = False + If true the list of files matching `input_glob` will be processed in sorted order. + recursive: bool, default = True + If true, events will be emitted for the files in subdirectories matching `input_glob`. + queue_max_size: int, default = 128 + Maximum queue size to hold the file paths to be processed that match `input_glob`. + batch_timeout: float, default = 5.0 + Timeout to retrieve batch messages from the queue. + encoding: str, default = latin1 + Encoding to read a file. + """ + + def __init__(self, + c: Config, + input_glob: str, + plugins_include: typing.List[str], + cols_include: typing.List[str], + cols_exclude: typing.List[str] = ["SHA256"], + watch_directory: bool = False, + max_files: int = -1, + sort_glob: bool = False, + recursive: bool = True, + queue_max_size: int = 128, + batch_timeout: float = 5.0, + encoding: str = 'latin1'): + + SingleOutputSource.__init__(self, c) + + self._plugins_include = plugins_include + self._cols_include = cols_include + self._cols_exclude = cols_exclude + self._encoding = encoding + + self._input_count = None + + self._watcher = DirectoryWatcher(input_glob=input_glob, + watch_directory=watch_directory, + max_files=max_files, + sort_glob=sort_glob, + recursive=recursive, + queue_max_size=queue_max_size, + batch_timeout=batch_timeout) + + @property + def name(self) -> str: + return "from-appshield" + + @property + def input_count(self) -> int: + """Return None for no max intput count""" + return self._input_count + + @staticmethod + def fill_interested_cols(plugin_df: pd.DataFrame, cols_include: typing.List[str]): + """ + Fill missing interested plugin columns. + + Parameters + ---------- + plugin_df : pandas.DataFrame + Snapshot plugin dataframe + cols_include : typing.List[str] + Columns that needs to be included. + + Returns + ------- + pandas.DataFrame + The columns added dataframe. + """ + cols_exists = plugin_df.columns + for col in cols_include: + if col not in cols_exists: + plugin_df[col] = None + plugin_df = plugin_df[cols_include] + + return plugin_df + + @staticmethod + def read_file_to_df(file: io.TextIOWrapper, cols_exclude: typing.List[str]): + """ + Read file content to dataframe. + + Parameters + ---------- + file : `io.TextIOWrapper` + Input file object + cols_exclude : typing.List[str] + Dropping columns from a dataframe. + + Returns + ------- + pandas.DataFrame + The columns added dataframe + """ + data = json.load(file) + titles = data["titles"] + features_plugin = [col for col in titles if col not in cols_exclude] + + try: + plugin_df = pd.DataFrame(columns=features_plugin, data=data["data"]) + except ValueError: + logger.exception("Error while loading file content to datframe with 'cols_exclude' filter") + logger.info("Attempting to populate the dataframe with all columns.") + + plugin_df = pd.DataFrame(columns=titles, data=data["data"]) + + logger.info("Applying 'cols_exclude' filter on dataframe") + + plugin_df = plugin_df[features_plugin] + + return plugin_df + + @staticmethod + def load_df(filepath: str, cols_exclude: typing.List[str], encoding: str) -> pd.DataFrame: + """ + Reads a file into a dataframe. + + Parameters + ---------- + filepath : str + Path to a file. + cols_exclude : typing.List[str] + Columns that needs to exclude. + encoding : str + Encoding to read a file. + + Returns + ------- + pandas.DataFrame + The parsed dataframe. + + Raises + ------ + JSONDecodeError + If not able to decode the json file. + """ + + try: + with open(filepath, encoding=encoding) as file: + plugin_df = AppShieldSourceStage.read_file_to_df(file, cols_exclude) + except JSONDecodeError as decode_error: + logger.error('Unable to load %s to dataframe with %s encoding : %s', + filepath, + encoding, + decode_error) + + encoding = encoding.lower() + # To avoid retrying with utf-8, check if the given encoding is utf. + if encoding.startswith('utf'): + raise decode_error + + logger.info('Retrying... Attempting to load %s with utf-8 encoding', filepath) + + with open(filepath, encoding='utf-8') as file: + plugin_df = AppShieldSourceStage.read_file_to_df(file, cols_exclude) + + return plugin_df + + @staticmethod + def load_meta_cols(filepath_split: typing.List[str], plugin: str, plugin_df: pd.DataFrame) -> pd.DataFrame: + """ + Loads meta columns to dataframe. + + Parameters + ---------- + filepath_split : typing.List[str] + Splits of file path. + plugin : str + Plugin name to which the data belongs to. + + Returns + ------- + pandas.DataFrame + The parsed dataframe. + """ + + if len(filepath_split) < 3: + raise ValueError('Invalid filepath_split {}. Length should be greater than 2'.format(filepath_split)) + + source = filepath_split[-3] + + snapshot_id = int(filepath_split[-2].split('-')[1]) + ts_re = re.search('[a-z]+_([0-9-_.]+).json', filepath_split[-1]) + + if ts_re is None: + raise ValueError('Invalid format for filepath_split {}'.format(filepath_split)) + + timestamp = ts_re.group(1) + + plugin_df['snapshot_id'] = snapshot_id + plugin_df['timestamp'] = timestamp + plugin_df['source'] = source + plugin_df['plugin'] = plugin + + return plugin_df + + @staticmethod + def batch_source_split(x: typing.List[pd.DataFrame], source: str) -> typing.Dict[str, pd.DataFrame]: + """ + Combines plugin dataframes from multiple snapshot and split dataframe per source. + + Parameters + ---------- + x : typing.List[pd.DataFrame] + Dataframes from multiple sources. + source : str + source column name to group it. + + Returns + ------- + typing.Dict[str, pandas.DataFrame] + Grouped dataframes by source. + """ + + combined_df = pd.concat(x) + + # Get the sources in this DF + unique_sources = combined_df[source].unique() + + source_dfs = {} + + if len(unique_sources) > 1: + for source_name in unique_sources: + source_dfs[source_name] = combined_df[combined_df[source] == source_name] + else: + source_dfs[unique_sources[0]] = combined_df + + return source_dfs + + @staticmethod + def files_to_dfs(x: typing.List[str], + cols_include: typing.List[str], + cols_exclude: typing.List[str], + plugins_include: typing.List[str], + encoding: str) -> pd.DataFrame: + """ + Load plugin files into a dataframe, then segment the dataframe by source. + + Parameters + ---------- + x : typing.List[str] + List of file paths. + cols_include : typing.List[str] + Columns that needs to include. + cols_exclude : typing.List[str] + Columns that needs to exclude. + encoding : str + Encoding to read a file. + + Returns + ------- + typing.Dict[str, pandas.DataFrame] + Grouped dataframes by source. + """ + # Using pandas to parse nested JSON until cuDF adds support + # https://github.com/rapidsai/cudf/issues/8827 + plugin_dfs = [] + for filepath in x: + try: + filepath_split = filepath.split('/') + plugin = filepath_split[-1].split('_')[0] + + if plugin in plugins_include: + plugin_df = AppShieldSourceStage.load_df(filepath, cols_exclude, encoding) + plugin_df = AppShieldSourceStage.fill_interested_cols(plugin_df, cols_include) + plugin_df = AppShieldSourceStage.load_meta_cols(filepath_split, plugin, plugin_df) + plugin_dfs.append(plugin_df) + + except JSONDecodeError as decode_error: + logger.error('Unable to decode json file %s: %s', filepath, decode_error) + + df_per_source = AppShieldSourceStage.batch_source_split(plugin_dfs, source='source') + + return df_per_source + + @staticmethod + def _build_metadata(x: typing.Dict[str, pd.DataFrame]): + + metas = [] + + for source, df in x.items(): + + # Now make a AppShieldMessageMeta with the source name + meta = AppShieldMessageMeta(df, source) + metas.append(meta) + + return metas + + def _build_source(self, seg: neo.Segment) -> StreamPair: + + # The first source just produces filenames + filename_source = self._watcher.build_node(self.unique_name, seg) + + out_type = typing.List[str] + + # Supposed to just return a source here + return filename_source, out_type + + def _post_build_single(self, seg: neo.Segment, out_pair: StreamPair) -> StreamPair: + + out_stream = out_pair[0] + + def node_fn(input: neo.Observable, output: neo.Subscriber): + input.pipe( + # At this point, we have batches of filenames to process. Make a node for processing batches of + # filenames into batches of dataframes + ops.map( + partial(self.files_to_dfs, + cols_include=self._cols_include, + cols_exclude=self._cols_exclude, + plugins_include=self._plugins_include, + encoding=self._encoding)), + ops.map(self._build_metadata), + # Finally flatten to single meta + ops.flatten()).subscribe(output) + + post_node = seg.make_node_full(self.unique_name + "-post", node_fn) + seg.make_edge(out_stream, post_node) + + out_stream = post_node + out_type = AppShieldMessageMeta + + return super()._post_build_single(seg, (out_stream, out_type)) diff --git a/morpheus/stages/input/cloud_trail_source_stage.py b/morpheus/stages/input/cloud_trail_source_stage.py index c4424ddc8a..1a11b1d915 100644 --- a/morpheus/stages/input/cloud_trail_source_stage.py +++ b/morpheus/stages/input/cloud_trail_source_stage.py @@ -12,10 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -import glob import logging import os -import queue import typing from functools import partial @@ -24,7 +22,6 @@ import pandas as pd from neo.core import operators as ops -from morpheus._lib.common import FiberQueue from morpheus._lib.file_types import FileTypes from morpheus._lib.file_types import determine_file_type from morpheus.config import Config @@ -32,7 +29,7 @@ from morpheus.messages import UserMessageMeta from morpheus.pipeline.single_output_source import SingleOutputSource from morpheus.pipeline.stream_pair import StreamPair -from morpheus.utils.producer_consumer_queue import Closed +from morpheus.utils.directory_watcher import DirectoryWatcher logger = logging.getLogger(__name__) @@ -62,6 +59,12 @@ class CloudTrailSourceStage(SingleOutputSource): How many times to repeat the dataset. Useful for extending small datasets in debugging. sort_glob : bool, default = False If true the list of files matching `input_glob` will be processed in sorted order. + recursive: bool, default = True + If true, events will be emitted for the files in subdirectories that match `input_glob`. + queue_max_size: int, default = 128 + Maximum queue size to hold the file paths to be processed that match `input_glob`. + batch_timeout: float, default = 5.0 + Timeout to retrieve batch messages from the queue. """ def __init__(self, @@ -71,14 +74,14 @@ def __init__(self, max_files: int = -1, file_type: FileTypes = FileTypes.Auto, repeat: int = 1, - sort_glob: bool = False): + sort_glob: bool = False, + recursive: bool = True, + queue_max_size: int = 128, + batch_timeout: float = 5.0): - super().__init__(c) + SingleOutputSource.__init__(self, c) - self._input_glob = input_glob - self._sort_glob = sort_glob self._file_type = file_type - self._max_files = max_files self._feature_columns = c.ae.feature_columns self._user_column_name = c.ae.userid_column_name @@ -92,10 +95,14 @@ def __init__(self, # Iterative mode will emit dataframes one at a time. Otherwise a list of dataframes is emitted. Iterative mode # is good for interleaving source stages. self._repeat_count = repeat - self._watch_directory = watch_directory - # Will be a watchdog observer if enabled - self._watcher = None + self._watcher = DirectoryWatcher(input_glob=input_glob, + watch_directory=watch_directory, + max_files=max_files, + sort_glob=sort_glob, + recursive=recursive, + queue_max_size=queue_max_size, + batch_timeout=batch_timeout) @property def name(self) -> str: @@ -106,19 +113,12 @@ def input_count(self) -> int: """Return None for no max intput count""" return self._input_count - def stop(self): + def get_match_pattern(self, glob_split): + """Return a file match pattern""" + dir_to_watch = os.path.dirname(glob_split[0]) + match_pattern = self._input_glob.replace(dir_to_watch + "/", "", 1) - if (self._watcher is not None): - self._watcher.stop() - - return super().stop() - - async def join(self): - - if (self._watcher is not None): - self._watcher.join() - - return await super().join() + return match_pattern @staticmethod def read_file(filename: str, file_type: FileTypes) -> pd.DataFrame: @@ -156,104 +156,6 @@ def read_file(filename: str, file_type: FileTypes) -> pd.DataFrame: return df - def _get_filename_queue(self) -> FiberQueue: - """ - Returns an async queue with tuples of `([files], is_event)` where `is_event` indicates if this is a file changed - event (and we should wait for potentially more changes) or if these files were read on startup and should be - processed immediately. - """ - q = FiberQueue(128) - - if (self._watch_directory): - - from watchdog.events import FileSystemEvent - from watchdog.events import PatternMatchingEventHandler - from watchdog.observers import Observer - - # Create a file watcher - self._watcher = Observer() - self._watcher.setDaemon(True) - self._watcher.setName("DirectoryWatcher") - - glob_split = self._input_glob.split("*", 1) - - if (len(glob_split) == 1): - raise RuntimeError(("When watching directories, input_glob must have a wildcard. " - "Otherwise no files will be matched.")) - - dir_to_watch = os.path.dirname(glob_split[0]) - match_pattern = self._input_glob.replace(dir_to_watch + "/", "", 1) - dir_to_watch = os.path.abspath(os.path.dirname(glob_split[0])) - - event_handler = PatternMatchingEventHandler(patterns=[match_pattern]) - - def process_dir_change(event: FileSystemEvent): - - # Push files into the queue indicating this is an event - q.put(([event.src_path], True)) - - event_handler.on_created = process_dir_change - - self._watcher.schedule(event_handler, dir_to_watch, recursive=True) - - self._watcher.start() - - # Load the glob once and return - file_list = glob.glob(self._input_glob) - if self._sort_glob: - file_list = sorted(file_list) - - if (self._max_files > 0): - file_list = file_list[:self._max_files] - - logger.info("Found %d CloudTrail files in glob. Loading...", len(file_list)) - - # Push all to the queue and close it - q.put((file_list, False)) - - if (not self._watch_directory): - # Close the queue - q.close() - - return q - - def _generate_filenames(self): - - # Gets a queue of filenames as they come in. Returns list[str] - file_queue: FiberQueue = self._get_filename_queue() - - batch_timeout = 30.0 - - files_to_process = [] - - while True: - - try: - files, is_event = file_queue.get(timeout=batch_timeout) - - if (is_event): - # We may be getting files one at a time from the folder watcher, wait a bit - files_to_process = files_to_process + files - continue - - # We must have gotten a group at startup, process immediately - yield files - - # df_queue.task_done() - - except queue.Empty: - # We timed out, if we have any items in the queue, push those now - if (len(files_to_process) > 0): - yield files_to_process - files_to_process = [] - - except Closed: - # Just in case there are any files waiting - if (len(files_to_process) > 0): - yield files_to_process - files_to_process = [] - break - @staticmethod def cleanup_df(df: pd.DataFrame, feature_columns: typing.List[str]): @@ -414,7 +316,7 @@ def _build_user_metadata(self, x: typing.Dict[str, pd.DataFrame]): def _build_source(self, seg: neo.Segment) -> StreamPair: # The first source just produces filenames - filename_source = seg.make_source(self.unique_name, self._generate_filenames()) + filename_source = self._watcher.build_node(self.unique_name, seg) out_type = typing.List[str] diff --git a/morpheus/utils/directory_watcher.py b/morpheus/utils/directory_watcher.py new file mode 100644 index 0000000000..4fda39b8b9 --- /dev/null +++ b/morpheus/utils/directory_watcher.py @@ -0,0 +1,227 @@ +# Copyright (c) 2021-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import glob +import logging +import os +import queue + +import neo +from watchdog.events import FileSystemEvent +from watchdog.events import PatternMatchingEventHandler +from watchdog.observers import Observer +from watchdog.utils.dirsnapshot import DirectorySnapshot +from watchdog.utils.dirsnapshot import DirectorySnapshotDiff +from watchdog.utils.dirsnapshot import EmptyDirectorySnapshot +from watchdog.utils.patterns import filter_paths + +from morpheus._lib.common import FiberQueue +from morpheus.utils.producer_consumer_queue import Closed + +logger = logging.getLogger(__name__) + + +class DirectoryWatcher(): + """ + This class is in responsible of polling for new files in the supplied input glob of directories and + forwarding them on to the pipeline for processing. + + Parameters + ---------- + c : `morpheus.config.Config` + Pipeline configuration instance. + input_glob : str + Input glob pattern to match files to read. For example, `./input_dir/*.json` would read all files with the + 'json' extension in the directory input_dir. + watch_directory : bool + The watch directory option instructs this stage to not close down once all files have been read. Instead it will + read all files that match the 'input_glob' pattern, and then continue to watch the directory for additional + files. Any new files that are added that match the glob will then be processed. + max_files: int + Max number of files to read. Useful for debugging to limit startup time. Default value of -1 is unlimited. + sort_glob : bool + If true the list of files matching `input_glob` will be processed in sorted order. + recursive: bool + If true, events will be emitted for the files in subdirectories matching `input_glob`. + queue_max_size: int + Maximum queue size to hold the file paths to be processed that match `input_glob`. + batch_timeout: float + Timeout to retrieve batch messages from the queue. + """ + + def __init__(self, + input_glob: str, + watch_directory: bool, + max_files: int, + sort_glob: bool, + recursive: bool, + queue_max_size: int, + batch_timeout: float): + + self._input_glob = input_glob + self._watch_directory = watch_directory + self._max_files = max_files + self._sort_glob = sort_glob + self._recursive = recursive + self._queue_max_size = queue_max_size + self._batch_timeout = batch_timeout + + # Determine the directory to watch and the match pattern from the glob + glob_split = self._input_glob.split("*", 1) + + if (len(glob_split) == 1): + raise RuntimeError(("When watching directories, input_glob must have a wildcard. " + "Otherwise no files will be matched.")) + + self._dir_to_watch = os.path.dirname(glob_split[0]) + self._match_pattern = self._input_glob.replace(self._dir_to_watch + "/", "", 1) + + # Will be a watchdog observer if enabled + self._watcher = None + + def build_node(self, name: str, seg: neo.Segment): + + # The first source just produces filenames + return seg.make_source(name, self._generate_via_polling()) + + def _get_filename_queue(self) -> FiberQueue: + """ + Returns an async queue with tuples of `([files], is_event)` where `is_event` indicates if this is a file changed + event (and we should wait for potentially more changes) or if these files were read on startup and should be + processed immediately. + """ + q = FiberQueue(self._queue_max_size) + + if (self._watch_directory): + + # Create a file watcher + self._watcher = Observer() + self._watcher.setDaemon(True) + self._watcher.setName("DirectoryWatcher") + + event_handler = PatternMatchingEventHandler(patterns=[self._match_pattern]) + + def process_dir_change(event: FileSystemEvent): + + # Push files into the queue indicating this is an event + q.put(([event.src_path], True)) + + event_handler.on_created = process_dir_change + + self._watcher.schedule(event_handler, self._dir_to_watch, recursive=self._recursive) + + self._watcher.start() + + # Load the glob once and return + file_list = glob.glob(self._input_glob) + if self._sort_glob: + file_list = sorted(file_list) + + if (self._max_files > 0): + file_list = file_list[:self._max_files] + + logger.info("Found %d files in glob. Loading...", len(file_list)) + + # Push all to the queue and close it + q.put((file_list, False)) + + if (not self._watch_directory): + # Close the queue + q.close() + + return q + + def _generate_via_polling(self): + + # Its a bit ugly, but utilize a filber queue to yield the thread. This will be improved in the future + file_queue = FiberQueue(self._queue_max_size) + + snapshot = EmptyDirectorySnapshot() + + while (True): + + # Get a new snapshot + new_snapshot = DirectorySnapshot(self._dir_to_watch, recursive=self._recursive) + + # Take the diff from the last one + diff_events = DirectorySnapshotDiff(snapshot, new_snapshot) + snapshot = new_snapshot + + files_to_process = filter_paths(diff_events.files_created, included_patterns=[self._input_glob]) + + if (self._sort_glob): + files_to_process = sorted(files_to_process) + + # Convert from generator into list + files_to_process = list(files_to_process) + + if (len(files_to_process) > 0): + # is_running = yield files_to_process + file_queue.put(files_to_process) + + if (not self._watch_directory): + file_queue.close() + + try: + files = file_queue.get(timeout=self._batch_timeout) + + # We must have gotten a group at startup, process immediately + if len(files) > 0: + yield files + + if (not self._watch_directory): + # Break here to prevent looping again + break + + except queue.Empty: + # Timed out, check for files again + continue + + except Closed: + # Exit + break + + def _generate_via_watcher(self): + + # Gets a queue of filenames as they come in. Returns list[str] + file_queue: FiberQueue = self._get_filename_queue() + + files_to_process = [] + + while True: + + try: + files, is_event = file_queue.get(timeout=self._batch_timeout) + + if (is_event): + # We may be getting files one at a time from the folder watcher, wait a bit + files_to_process = files_to_process + files + continue + + # We must have gotten a group at startup, process immediately + if len(files) > 0: + yield files + + except queue.Empty: + # We timed out, if we have any items in the queue, push those now + if (len(files_to_process) > 0): + yield files_to_process + files_to_process = [] + + except Closed: + # Just in case there are any files waiting + if (len(files_to_process) > 0): + yield files_to_process + files_to_process = [] + break diff --git a/morpheus/utils/onnx_to_trt.py b/morpheus/utils/onnx_to_trt.py index 4e873ce535..fa6e766a20 100644 --- a/morpheus/utils/onnx_to_trt.py +++ b/morpheus/utils/onnx_to_trt.py @@ -27,7 +27,6 @@ raise - def gen_engine(c: ConfigOnnxToTRT): """ This class converts an Onnx model to a TRT model. diff --git a/tests/test_abp.py b/tests/test_abp.py index 2c78754e4c..32a0bb008a 100755 --- a/tests/test_abp.py +++ b/tests/test_abp.py @@ -62,7 +62,7 @@ def test_abp_no_cpp(mock_triton_client, config: Config, tmp_path): mock_triton_client.get_model_metadata.return_value = mock_metadata mock_triton_client.get_model_config.return_value = mock_model_config - data = np.loadtxt(os.path.join(TEST_DIRS.expeced_data_dir, 'triton_abp_inf_results.csv'), delimiter=',') + data = np.loadtxt(os.path.join(TEST_DIRS.tests_data_dir, 'triton_abp_inf_results.csv'), delimiter=',') inf_results = np.split(data, range(MODEL_MAX_BATCH_SIZE, len(data), MODEL_MAX_BATCH_SIZE)) mock_infer_result = mock.MagicMock() diff --git a/tests/test_add_classifications_stage_pipe.py b/tests/test_add_classifications_stage_pipe.py index 5c1cc6eb5f..a82a329dd0 100755 --- a/tests/test_add_classifications_stage_pipe.py +++ b/tests/test_add_classifications_stage_pipe.py @@ -34,7 +34,7 @@ def test_add_classifications_stage_pipe(config, tmp_path): config.num_threads = 1 # Silly data with all false values - input_file = os.path.join(TEST_DIRS.expeced_data_dir, "filter_probs.csv") + input_file = os.path.join(TEST_DIRS.tests_data_dir, "filter_probs.csv") out_file = os.path.join(tmp_path, 'results.csv') threshold = 0.75 diff --git a/tests/test_add_scores_stage_pipe.py b/tests/test_add_scores_stage_pipe.py index f096097336..2debcfeade 100755 --- a/tests/test_add_scores_stage_pipe.py +++ b/tests/test_add_scores_stage_pipe.py @@ -32,7 +32,7 @@ def test_add_scores_stage_pipe(config, tmp_path): config.class_labels = ['frogs', 'lizards', 'toads', 'turtles'] - input_file = os.path.join(TEST_DIRS.expeced_data_dir, "filter_probs.csv") + input_file = os.path.join(TEST_DIRS.tests_data_dir, "filter_probs.csv") out_file = os.path.join(tmp_path, 'results.csv') pipe = LinearPipeline(config) diff --git a/tests/test_appshield_source_stage.py b/tests/test_appshield_source_stage.py new file mode 100755 index 0000000000..850c250b45 --- /dev/null +++ b/tests/test_appshield_source_stage.py @@ -0,0 +1,364 @@ +#!/usr/bin/env python +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import glob +import json +import os +from unittest import mock + +import pandas as pd +import pytest +from pandas.testing import assert_frame_equal + +from morpheus.messages.message_meta import AppShieldMessageMeta +from morpheus.stages.input.appshield_source_stage import AppShieldSourceStage +from morpheus.utils.directory_watcher import DirectoryWatcher +from utils import TEST_DIRS + + +@pytest.mark.parametrize('cols_include', + [[ + 'Base', + 'Block', + 'CommitCharge', + 'End VPN', + 'File', + 'GrantedAccess', + 'HandleValue', + 'InInit', + 'InLoad', + 'InMem', + 'Name', + 'Offset', + 'PID', + 'Parent', + 'Path', + 'PrivateMemory', + 'Process', + 'Protection', + 'SHA256', + 'Size', + 'Start VPN', + 'State', + 'TID', + 'Tag', + 'Type', + 'Value', + 'Variable', + 'WaitReason', + 'plugin', + 'snapshot_id', + 'timestamp' + ]]) +@pytest.mark.parametrize('plugins_include', [['ldrmodules', 'threadlist', 'envars', 'vadinfo', 'handles']]) +def test_constructor(tmp_path, config, plugins_include, cols_include): + input_glob = os.path.join(tmp_path, '*', '*.json') + + source = AppShieldSourceStage(config, input_glob, plugins_include, cols_include) + + assert source._plugins_include == ['ldrmodules', 'threadlist', 'envars', 'vadinfo', 'handles'] + assert source._cols_include == [ + 'Base', + 'Block', + 'CommitCharge', + 'End VPN', + 'File', + 'GrantedAccess', + 'HandleValue', + 'InInit', + 'InLoad', + 'InMem', + 'Name', + 'Offset', + 'PID', + 'Parent', + 'Path', + 'PrivateMemory', + 'Process', + 'Protection', + 'SHA256', + 'Size', + 'Start VPN', + 'State', + 'TID', + 'Tag', + 'Type', + 'Value', + 'Variable', + 'WaitReason', + 'plugin', + 'snapshot_id', + 'timestamp' + ] + assert source._cols_exclude == ['SHA256'] + assert source.name == 'from-appshield' + assert isinstance(source._watcher, DirectoryWatcher) + + +@pytest.mark.parametrize('cols_include', [['a', 'b', 'c', 'd']]) +@pytest.mark.parametrize( + 'input_df', + [pd.DataFrame({ + 'a': range(10), 'b': range(10, 20), 'c': range(1, 11) + })], +) +def test_fill_interested_cols(cols_include, input_df): + output_df = AppShieldSourceStage.fill_interested_cols(input_df, cols_include) + actual_columns = list(output_df.columns) + expected_columns = cols_include + + assert actual_columns == expected_columns + + +@pytest.mark.parametrize('cols_exclude', [['Block', 'Variable', 'Value']]) +@pytest.mark.parametrize( + 'expected_df', + [ + pd.DataFrame({ + 'PID': ['304', '304', '304', '444', '444'], + 'Process': ['smss.exe', 'smss.exe', 'smss.exe', 'csrss.exe', 'csrss.exe'] + }) + ], +) +def test_read_file_to_df(cols_exclude, expected_df): + input_file = os.path.join(TEST_DIRS.tests_data_dir, + 'appshield', + 'snapshot-1', + 'envars_2022-01-30_10-26-01.017250.json') + file = open(input_file, 'r', encoding='latin1') + output_df = AppShieldSourceStage.read_file_to_df(file, cols_exclude) + + assert list(output_df.columns) == ['PID', 'Process'] + assert_frame_equal(output_df, expected_df) + + +@pytest.mark.parametrize('cols_exclude', [['Block', 'Variable', 'Value']]) +@pytest.mark.parametrize( + 'expected_df', + [ + pd.DataFrame({ + 'PID': ['304', '304', '304', '444', '444'], + 'Process': ['smss.exe', 'smss.exe', 'smss.exe', 'csrss.exe', 'csrss.exe'] + }) + ], +) +@pytest.mark.parametrize('encoding', ['latin1']) +def test_load_df(cols_exclude, expected_df, encoding): + input_file = os.path.join(TEST_DIRS.tests_data_dir, + 'appshield', + 'snapshot-1', + 'envars_2022-01-30_10-26-01.017250.json') + output_df = AppShieldSourceStage.load_df(input_file, cols_exclude, encoding) + + assert list(output_df.columns) == ['PID', 'Process'] + assert_frame_equal(output_df, expected_df) + + +@pytest.mark.parametrize('plugin', ['envars']) +@pytest.mark.parametrize('expected_new_columns', ['snapshot_id', 'timestamp', 'source', 'plugin']) +def test_load_meta_cols(plugin, expected_new_columns): + input_file = os.path.join(TEST_DIRS.tests_data_dir, + 'appshield', + 'snapshot-1', + 'envars_2022-01-30_10-26-01.017250.json') + filepath_split = input_file.split('/') + + data = json.load(open(input_file, 'r', encoding='latin1')) + input_df = pd.DataFrame(columns=data['titles'], data=data['data']) + output_df = AppShieldSourceStage.load_meta_cols(filepath_split, plugin, input_df) + + assert expected_new_columns in list(output_df.columns) + assert output_df.snapshot_id.iloc[0] == 1 + assert output_df.plugin.iloc[0] == 'envars' + assert output_df.source.iloc[0] == 'appshield' + assert output_df.timestamp.iloc[0] == '2022-01-30_10-26-01.017250' + + +@pytest.mark.parametrize('input_dfs', + [[ + pd.DataFrame({ + 'PID': ['304', '304', '304', '444', '444'], + 'Process': ['smss.exe', 'smss.exe', 'smss.exe', 'csrss.exe', 'csrss.exe'], + 'source': ['appshield', 'appshield', 'appshield-v2', 'appshield', 'appshield-v2'] + }), + pd.DataFrame({ + 'PID': ['350', '360', '304', '563', '673'], + 'Process': ['smss.exe', 'smss.exe', 'smss.exe', 'csrss.exe', 'csrss.exe'], + 'source': ['appshield', 'appshield', 'appshield-v2', 'appshield', 'appshield-v2'] + }) + ]]) +@pytest.mark.parametrize( + 'expected_appshield_df', + [ + pd.DataFrame({ + 'PID': + pd.Series(['304', '304', '444', '350', '360', '563'], index=[0, 1, 3, 0, 1, 3]), + 'Process': + pd.Series(['smss.exe', 'smss.exe', 'csrss.exe', 'smss.exe', 'smss.exe', 'csrss.exe'], + index=[0, 1, 3, 0, 1, 3]), + 'source': + pd.Series(['appshield', 'appshield', 'appshield', 'appshield', 'appshield', 'appshield'], + index=[0, 1, 3, 0, 1, 3]) + }), + ]) +@pytest.mark.parametrize('source_col', ['source']) +def test_batch_source_split(input_dfs, source_col, expected_appshield_df): + output_df_per_source = AppShieldSourceStage.batch_source_split(input_dfs, source_col) + + assert len(output_df_per_source) == 2 + assert len(output_df_per_source['appshield']) == 6 + assert len(output_df_per_source['appshield-v2']) == 4 + assert_frame_equal(output_df_per_source['appshield'], expected_appshield_df) + + +@pytest.mark.parametrize('cols_include', + [[ + 'Base', + 'Block', + 'CommitCharge', + 'End VPN', + 'File', + 'GrantedAccess', + 'HandleValue', + 'InInit', + 'InLoad', + 'InMem', + 'Name', + 'Offset', + 'PID', + 'Parent', + 'Path', + 'PrivateMemory', + 'Process', + 'Protection', + 'SHA256', + 'Size', + 'Start VPN', + 'State', + 'TID', + 'Tag', + 'Type', + 'Value', + 'Variable', + 'WaitReason', + 'plugin', + 'snapshot_id', + 'timestamp' + ]]) +@pytest.mark.parametrize('cols_exclude', [['SHA256']]) +@pytest.mark.parametrize('plugins_include', [['ldrmodules', 'threadlist', 'envars', 'vadinfo', 'handles']]) +@pytest.mark.parametrize('meta_columns', ['snapshot_id', 'timestamp', 'source', 'plugin']) +@pytest.mark.parametrize('encoding', ['latin1']) +def test_files_to_dfs(cols_include, cols_exclude, plugins_include, meta_columns, encoding): + input_glob = os.path.join(TEST_DIRS.tests_data_dir, 'appshield', 'snapshot-1', '*.json') + file_list = glob.glob(input_glob) + output_df_per_source = AppShieldSourceStage.files_to_dfs(file_list, + cols_include, + cols_exclude, + plugins_include, + encoding) + + assert len(output_df_per_source) == 1 + assert 'appshield' in output_df_per_source + assert meta_columns in output_df_per_source['appshield'].columns + + +@pytest.mark.parametrize( + 'input_df_per_source', + [{ + 'appshield': [ + pd.DataFrame({ + 'PID': + pd.Series(['304', '304', '444', '350', '360', '563'], index=[0, 1, 3, 0, 1, 3]), + 'Process': + pd.Series(['smss.exe', 'smss.exe', 'csrss.exe', 'smss.exe', 'smss.exe', 'csrss.exe'], + index=[0, 1, 3, 0, 1, 3]), + 'source': + pd.Series(['appshield', 'appshield', 'appshield', 'appshield', 'appshield', 'appshield'], + index=[0, 1, 3, 0, 1, 3]) + }), + ], + 'appshield-v2': [ + pd.DataFrame({ + 'PID': + pd.Series(['304', '304', '444', '350', '360', '563'], index=[0, 1, 3, 0, 1, 3]), + 'Process': + pd.Series(['smss.exe', 'smss.exe', 'csrss.exe', 'smss.exe', 'smss.exe', 'csrss.exe'], + index=[0, 1, 3, 0, 1, 3]), + 'source': + pd.Series([ + 'appshield-v2', 'appshield-v2', 'appshield-v2', 'appshield-v2', 'appshield-v2', 'appshield-v2' + ], + index=[0, 1, 3, 0, 1, 3]) + }), + ] + }]) +def test_build_metadata(input_df_per_source): + appshield_message_metas = AppShieldSourceStage._build_metadata(input_df_per_source) + + assert len(appshield_message_metas) == 2 + assert isinstance(appshield_message_metas[0], AppShieldMessageMeta) + + +@pytest.mark.use_python +@pytest.mark.parametrize('cols_include', + [[ + 'Base', + 'Block', + 'CommitCharge', + 'End VPN', + 'File', + 'GrantedAccess', + 'HandleValue', + 'InInit', + 'InLoad', + 'InMem', + 'Name', + 'Offset', + 'PID', + 'Parent', + 'Path', + 'PrivateMemory', + 'Process', + 'Protection', + 'SHA256', + 'Size', + 'Start VPN', + 'State', + 'TID', + 'Tag', + 'Type', + 'Value', + 'Variable', + 'WaitReason', + 'plugin', + 'snapshot_id', + 'timestamp' + ]]) +@pytest.mark.parametrize('cols_exclude', [['SHA256']]) +@pytest.mark.parametrize('plugins_include', [['ldrmodules', 'threadlist', 'envars', 'vadinfo', 'handles']]) +@pytest.mark.parametrize('input_glob', [os.path.join(TEST_DIRS.tests_data_dir, 'appshield', 'snapshot-1', '*.json')]) +def test_post_build_single(config, input_glob, cols_include, cols_exclude, plugins_include): + mock_stream = mock.MagicMock() + mock_segment = mock.MagicMock() + mock_segment.make_node.return_value = mock_stream + mock_input = mock.MagicMock() + + source = AppShieldSourceStage(config, input_glob, plugins_include, cols_include, cols_exclude) + source._post_build_single(mock_segment, mock_input) + + mock_segment.make_node_full.assert_called_once() + mock_segment.make_edge.assert_called_once() diff --git a/tests/test_cli.py b/tests/test_cli.py index 718b167485..6545e4cd08 100755 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -209,7 +209,7 @@ def test_pipeline_ae(self, config, callback_values): to_file] = stages assert isinstance(cloud_trail, CloudTrailSourceStage) - assert cloud_trail._input_glob == "input_glob*.csv" + assert cloud_trail._watcher._input_glob == "input_glob*.csv" assert isinstance(train_ae, TrainAEStage) assert train_ae._train_data_glob == "train_glob*.csv" @@ -293,7 +293,7 @@ def test_pipeline_ae_all(self, config, callback_values, tmp_path): ] = stages assert isinstance(cloud_trail, CloudTrailSourceStage) - assert cloud_trail._input_glob == "input_glob*.csv" + assert cloud_trail._watcher._input_glob == "input_glob*.csv" assert isinstance(add_class, AddClassificationsStage) assert isinstance(filter_stage, FilterDetectionsStage) diff --git a/tests/test_directory_watcher.py b/tests/test_directory_watcher.py new file mode 100644 index 0000000000..c0b9fc4a75 --- /dev/null +++ b/tests/test_directory_watcher.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +from unittest import mock + +import pytest + +from morpheus.utils.directory_watcher import DirectoryWatcher +from utils import TEST_DIRS + + +@pytest.mark.use_python +@pytest.mark.parametrize('watch_directory', [True]) +@pytest.mark.parametrize('max_files', [-1]) +@pytest.mark.parametrize('sort_glob', [True]) +@pytest.mark.parametrize('recursive', [True]) +@pytest.mark.parametrize('queue_max_size', [128]) +@pytest.mark.parametrize('batch_timeout', [5.0]) +def test_build_node(watch_directory, max_files, sort_glob, recursive, queue_max_size, batch_timeout): + input_glob = os.path.join(TEST_DIRS.tests_data_dir, 'appshield', '*', '*.json') + watcher = DirectoryWatcher(input_glob, + watch_directory, + max_files, + sort_glob, + recursive, + queue_max_size, + batch_timeout) + + assert watcher._sort_glob + assert watcher._watch_directory + assert watcher._max_files == -1 + + mock_files = mock.MagicMock() + mock_segment = mock.MagicMock() + mock_segment.make_source.return_value = mock_files + + watcher.build_node('watch_directory', mock_segment) + mock_segment.make_source.assert_called_once() diff --git a/tests/test_file_in_out_stage_pipe.py b/tests/test_file_in_out_stage_pipe.py index c1dd3e1d07..5b049bdc04 100755 --- a/tests/test_file_in_out_stage_pipe.py +++ b/tests/test_file_in_out_stage_pipe.py @@ -29,7 +29,7 @@ @pytest.mark.parametrize("output_type", ["csv", "json", "jsonlines"]) def test_file_rw_pipe(tmp_path, config, output_type): - input_file = os.path.join(TEST_DIRS.expeced_data_dir, "filter_probs.csv") + input_file = os.path.join(TEST_DIRS.tests_data_dir, "filter_probs.csv") out_file = os.path.join(tmp_path, 'results.{}'.format(output_type)) pipe = LinearPipeline(config) @@ -60,7 +60,7 @@ def test_to_file_no_path(tmp_path, config): """ Test to ensure issue #48 is fixed """ - input_file = os.path.join(TEST_DIRS.expeced_data_dir, "filter_probs.csv") + input_file = os.path.join(TEST_DIRS.tests_data_dir, "filter_probs.csv") out_file = "test.csv" assert os.path.realpath(os.curdir) == tmp_path.as_posix() diff --git a/tests/test_filter_detections_stage_pipe.py b/tests/test_filter_detections_stage_pipe.py index a9a2cc2c12..09f80fa513 100755 --- a/tests/test_filter_detections_stage_pipe.py +++ b/tests/test_filter_detections_stage_pipe.py @@ -29,7 +29,7 @@ def test_filter_detections_stage_pipe(config, tmp_path): - input_file = os.path.join(TEST_DIRS.expeced_data_dir, "filter_probs.csv") + input_file = os.path.join(TEST_DIRS.tests_data_dir, "filter_probs.csv") out_file = os.path.join(tmp_path, 'results.csv') threshold = 0.75 diff --git a/tests/test_hammah.py b/tests/test_hammah.py index b6de493e1b..5e8e275d4f 100755 --- a/tests/test_hammah.py +++ b/tests/test_hammah.py @@ -46,9 +46,8 @@ @pytest.mark.usefixtures("reload_modules") @mock.patch('morpheus.stages.preprocess.train_ae_stage.AutoEncoder') def test_hammah_roleg(mock_ae, config, tmp_path): - tensor_data = np.loadtxt(os.path.join(TEST_DIRS.expeced_data_dir, 'hammah_roleg_tensor.csv'), delimiter=',') - anomaly_score = np.loadtxt(os.path.join(TEST_DIRS.expeced_data_dir, 'hammah_roleg_anomaly_score.csv'), - delimiter=',') + tensor_data = np.loadtxt(os.path.join(TEST_DIRS.tests_data_dir, 'hammah_roleg_tensor.csv'), delimiter=',') + anomaly_score = np.loadtxt(os.path.join(TEST_DIRS.tests_data_dir, 'hammah_roleg_anomaly_score.csv'), delimiter=',') mock_input_tesnsor = mock.MagicMock() mock_input_tesnsor.return_value = mock_input_tesnsor @@ -121,8 +120,8 @@ def test_hammah_roleg(mock_ae, config, tmp_path): @pytest.mark.usefixtures("reload_modules") @mock.patch('morpheus.stages.preprocess.train_ae_stage.AutoEncoder') def test_hammah_user123(mock_ae, config, tmp_path): - tensor_data = np.loadtxt(os.path.join(TEST_DIRS.expeced_data_dir, 'hammah_user123_tensor.csv'), delimiter=',') - anomaly_score = np.loadtxt(os.path.join(TEST_DIRS.expeced_data_dir, 'hammah_user123_anomaly_score.csv'), + tensor_data = np.loadtxt(os.path.join(TEST_DIRS.tests_data_dir, 'hammah_user123_tensor.csv'), delimiter=',') + anomaly_score = np.loadtxt(os.path.join(TEST_DIRS.tests_data_dir, 'hammah_user123_anomaly_score.csv'), delimiter=',') mock_input_tesnsor = mock.MagicMock() diff --git a/tests/test_phishing.py b/tests/test_phishing.py index 120c7560dc..a5b3464aea 100755 --- a/tests/test_phishing.py +++ b/tests/test_phishing.py @@ -62,7 +62,7 @@ def test_email_no_cpp(mock_triton_client, config, tmp_path): mock_triton_client.get_model_metadata.return_value = mock_metadata mock_triton_client.get_model_config.return_value = mock_model_config - data = np.loadtxt(os.path.join(TEST_DIRS.expeced_data_dir, 'triton_phishing_inf_results.csv'), delimiter=',') + data = np.loadtxt(os.path.join(TEST_DIRS.tests_data_dir, 'triton_phishing_inf_results.csv'), delimiter=',') inf_results = np.split(data, range(MODEL_MAX_BATCH_SIZE, len(data), MODEL_MAX_BATCH_SIZE)) mock_infer_result = mock.MagicMock() diff --git a/tests/test_serialize_stage_pipe.py b/tests/test_serialize_stage_pipe.py index c34d07b8ba..c61c3d6577 100755 --- a/tests/test_serialize_stage_pipe.py +++ b/tests/test_serialize_stage_pipe.py @@ -31,7 +31,7 @@ @pytest.mark.parametrize("output_type", ["csv", "json", "jsonlines"]) def test_serialize_pipe(tmp_path, config, output_type): - input_file = os.path.join(TEST_DIRS.expeced_data_dir, "filter_probs.csv") + input_file = os.path.join(TEST_DIRS.tests_data_dir, "filter_probs.csv") out_file = os.path.join(tmp_path, 'results.{}'.format(output_type)) pipe = LinearPipeline(config) diff --git a/tests/test_sid.py b/tests/test_sid.py index d2a4f34d03..ebe67bea1f 100755 --- a/tests/test_sid.py +++ b/tests/test_sid.py @@ -62,7 +62,7 @@ def test_minibert_no_cpp(mock_triton_client, config, tmp_path): mock_triton_client.get_model_metadata.return_value = mock_metadata mock_triton_client.get_model_config.return_value = mock_model_config - data = np.loadtxt(os.path.join(TEST_DIRS.expeced_data_dir, 'triton_sid_inf_results.csv'), delimiter=',') + data = np.loadtxt(os.path.join(TEST_DIRS.tests_data_dir, 'triton_sid_inf_results.csv'), delimiter=',') inf_results = np.split(data, range(MODEL_MAX_BATCH_SIZE, len(data), MODEL_MAX_BATCH_SIZE)) mock_infer_result = mock.MagicMock() diff --git a/tests/tests_data/appshield/snapshot-1/envars_2022-01-30_10-26-01.017250.json b/tests/tests_data/appshield/snapshot-1/envars_2022-01-30_10-26-01.017250.json new file mode 100644 index 0000000000..352e79d2fb --- /dev/null +++ b/tests/tests_data/appshield/snapshot-1/envars_2022-01-30_10-26-01.017250.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61329c9bb7aa6af28eb0c09bc8ffd9071f840fe818cd395f5eb62816d323eec2 +size 498 diff --git a/tests/tests_data/appshield/snapshot-1/handles_2022-01-30_10-26-04.570268.json b/tests/tests_data/appshield/snapshot-1/handles_2022-01-30_10-26-04.570268.json new file mode 100644 index 0000000000..ecb8c31650 --- /dev/null +++ b/tests/tests_data/appshield/snapshot-1/handles_2022-01-30_10-26-04.570268.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a37be906217673676076f2b77e0b938d29b0b4b68329b0901f26b36424da8b45 +size 489 diff --git a/tests/tests_data/appshield/snapshot-1/ldrmodules_2022-01-30_10-25-59.669333.json b/tests/tests_data/appshield/snapshot-1/ldrmodules_2022-01-30_10-25-59.669333.json new file mode 100644 index 0000000000..73d93f83c7 --- /dev/null +++ b/tests/tests_data/appshield/snapshot-1/ldrmodules_2022-01-30_10-25-59.669333.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79c2c14a8ff6139e0c54e0e6331f3083d98c07ef6c8402c632ec5e980d046691 +size 703 diff --git a/tests/tests_data/appshield/snapshot-1/threadlist_2022-01-30_10-26-01.670391.json b/tests/tests_data/appshield/snapshot-1/threadlist_2022-01-30_10-26-01.670391.json new file mode 100644 index 0000000000..b806dd95bd --- /dev/null +++ b/tests/tests_data/appshield/snapshot-1/threadlist_2022-01-30_10-26-01.670391.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca65e671ef8324c2c83f0d8f675e89e35b2e8cd878abae87baa6f6affb8958b5 +size 408 diff --git a/tests/tests_data/appshield/snapshot-1/vadinfo_2022-01-30_10-26-02.785396.json b/tests/tests_data/appshield/snapshot-1/vadinfo_2022-01-30_10-26-02.785396.json new file mode 100644 index 0000000000..fd3ae5a05c --- /dev/null +++ b/tests/tests_data/appshield/snapshot-1/vadinfo_2022-01-30_10-26-02.785396.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee04b1dcd31b5b4489b36973e84c1f840fe4738101913d5b43ee12e6aa45d6e6 +size 926 diff --git a/tests/expected_data/filter_probs.csv b/tests/tests_data/filter_probs.csv similarity index 100% rename from tests/expected_data/filter_probs.csv rename to tests/tests_data/filter_probs.csv diff --git a/tests/expected_data/hammah_roleg_anomaly_score.csv b/tests/tests_data/hammah_roleg_anomaly_score.csv similarity index 100% rename from tests/expected_data/hammah_roleg_anomaly_score.csv rename to tests/tests_data/hammah_roleg_anomaly_score.csv diff --git a/tests/expected_data/hammah_roleg_tensor.csv b/tests/tests_data/hammah_roleg_tensor.csv similarity index 100% rename from tests/expected_data/hammah_roleg_tensor.csv rename to tests/tests_data/hammah_roleg_tensor.csv diff --git a/tests/expected_data/hammah_user123_anomaly_score.csv b/tests/tests_data/hammah_user123_anomaly_score.csv similarity index 100% rename from tests/expected_data/hammah_user123_anomaly_score.csv rename to tests/tests_data/hammah_user123_anomaly_score.csv diff --git a/tests/expected_data/hammah_user123_tensor.csv b/tests/tests_data/hammah_user123_tensor.csv similarity index 100% rename from tests/expected_data/hammah_user123_tensor.csv rename to tests/tests_data/hammah_user123_tensor.csv diff --git a/tests/expected_data/triton_abp_inf_results.csv b/tests/tests_data/triton_abp_inf_results.csv similarity index 100% rename from tests/expected_data/triton_abp_inf_results.csv rename to tests/tests_data/triton_abp_inf_results.csv diff --git a/tests/expected_data/triton_phishing_inf_results.csv b/tests/tests_data/triton_phishing_inf_results.csv similarity index 100% rename from tests/expected_data/triton_phishing_inf_results.csv rename to tests/tests_data/triton_phishing_inf_results.csv diff --git a/tests/expected_data/triton_sid_inf_results.csv b/tests/tests_data/triton_sid_inf_results.csv similarity index 100% rename from tests/expected_data/triton_sid_inf_results.csv rename to tests/tests_data/triton_sid_inf_results.csv diff --git a/tests/utils.py b/tests/utils.py index 188c9acedb..377822a6f3 100755 --- a/tests/utils.py +++ b/tests/utils.py @@ -38,7 +38,7 @@ def __init__(self, cur_file=__file__) -> None: self.datasets_dir = os.path.join(self.models_dir, 'datasets') self.training_data_dir = os.path.join(self.datasets_dir, 'training-data') self.validation_data_dir = os.path.join(self.datasets_dir, 'validation-data') - self.expeced_data_dir = os.path.join(self.tests_dir, 'expected_data') + self.tests_data_dir = os.path.join(self.tests_dir, 'tests_data') self.mock_triton_servers_dir = os.path.join(self.tests_dir, 'mock_triton_server') From b94bd9b6cd0bffe76e6ec5eab6dee49c22e7baee Mon Sep 17 00:00:00 2001 From: David Gardner <96306125+dagardner-nv@users.noreply.github.com> Date: Tue, 7 Jun 2022 11:18:35 -0700 Subject: [PATCH 34/73] Split data dir, moving large files into examples/data (#130) Brings directory size down to 1.6MB down from 270MB + Move large files to `exaples/data` + Migrate existing files in `exaples/data` to git-lfs + Add missing `email_with_addresses.jsonlines` needed for phishing detection developer guide + Update file paths in docs for data files + Update import paths in developer guide Depends on changes in ~~#62~~ Fixes #120 Authors: - David Gardner (https://github.com/dagardner-nv) - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - https://github.com/raykallen - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/130 --- .gitattributes | 1 + ci/scripts/jenkins/build.sh | 2 + docs/source/basics/examples.rst | 10 +- .../guides/1_simple_python_stage.md | 16 +- .../guides/2_real_world_phishing.md | 38 +- docs/source/morpheus_quickstart_guide.md | 10 +- examples/abp_nvsmi_detection/README.md | 6 +- examples/abp_pcap_detection/README.md | 4 +- .../data/abp_pcap_dump.jsonlines | 0 {morpheus => examples}/data/email.jsonlines | 0 examples/data/email_with_addresses.jsonlines | 3 + {morpheus => examples}/data/nvsmi.jsonlines | 0 .../data/pcap_dump.jsonlines | 0 .../data/sid_training_data_truth.csv | 0 examples/data/with_data_len.json | 1000 ----------------- examples/data/without_data_len.json | 1000 ----------------- examples/nlp_si_detection/README.md | 6 +- morpheus.code-workspace | 2 +- 18 files changed, 52 insertions(+), 2046 deletions(-) rename {morpheus => examples}/data/abp_pcap_dump.jsonlines (100%) rename {morpheus => examples}/data/email.jsonlines (100%) create mode 100644 examples/data/email_with_addresses.jsonlines rename {morpheus => examples}/data/nvsmi.jsonlines (100%) rename {morpheus => examples}/data/pcap_dump.jsonlines (100%) rename {morpheus => examples}/data/sid_training_data_truth.csv (100%) delete mode 100644 examples/data/with_data_len.json delete mode 100644 examples/data/without_data_len.json diff --git a/.gitattributes b/.gitattributes index 166f6e171b..a1e6e0394c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,4 @@ +examples/data/* filter=lfs diff=lfs merge=lfs -text morpheus/_version.py export-subst morpheus/data/* filter=lfs diff=lfs merge=lfs -text tests/mock_triton_server/payloads/** filter=lfs diff=lfs merge=lfs -text diff --git a/ci/scripts/jenkins/build.sh b/ci/scripts/jenkins/build.sh index cea5b45988..31e505da44 100755 --- a/ci/scripts/jenkins/build.sh +++ b/ci/scripts/jenkins/build.sh @@ -19,6 +19,7 @@ set -e source ${WORKSPACE}/ci/scripts/jenkins/common.sh gpuci_logger "Creating conda env" +rm -rf ${MORPHEUS_ROOT}/.cache/ ${MORPHEUS_ROOT}/build/ conda config --add pkgs_dirs /opt/conda/pkgs conda config --env --add channels conda-forge conda config --env --set channel_alias ${CONDA_CHANNEL_ALIAS:-"https://conda.anaconda.org"} @@ -79,6 +80,7 @@ mamba install -q -y -c local -c nvidia -c rapidsai -c conda-forge libcudf cudf gpuci_logger "Installing other dependencies" mamba env update -q -n morpheus -f ${MORPHEUS_ROOT}/docker/conda/environments/cuda${CUDA_VER}_dev.yml +conda deactivate && conda activate morpheus gpuci_logger "Check cmake & ninja" cmake --version diff --git a/docs/source/basics/examples.rst b/docs/source/basics/examples.rst index 7502bb5c51..1dccdede5f 100644 --- a/docs/source/basics/examples.rst +++ b/docs/source/basics/examples.rst @@ -35,7 +35,7 @@ This example will copy the values from Kafka into ``out.jsonlines``. Remove Fields from JSON Objects ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -This example will only copy the fields 'timestamp', 'src_ip' and 'dest_ip' from ``morpheus/data/pcap_dump.jsonlines`` to +This example will only copy the fields 'timestamp', 'src_ip' and 'dest_ip' from ``examples/data/pcap_dump.jsonlines`` to ``out.jsonlines``. .. image:: img/remove_fields_from_json_objects.png @@ -43,7 +43,7 @@ This example will only copy the fields 'timestamp', 'src_ip' and 'dest_ip' from .. code-block:: bash morpheus run pipeline-nlp --viz_file=basic_usage_img/remove_fields_from_json_objects.png \ - from-file --filename morpheus/data/pcap_dump.jsonlines \ + from-file --filename examples/data/pcap_dump.jsonlines \ deserialize \ serialize --include 'timestamp' --include 'src_ip' --include 'dest_ip' \ to-file --filename out.jsonlines @@ -58,7 +58,7 @@ This example will report the throughput on the command line. .. code-block:: console $ morpheus run pipeline-nlp --viz_file=basic_usage_img/monitor_throughput.png \ - from-file --filename morpheus/data/pcap_dump.jsonlines \ + from-file --filename examples/data/pcap_dump.jsonlines \ deserialize \ monitor --description "Lines Throughput" --smoothing 0.1 --unit "lines" \ serialize \ @@ -79,7 +79,7 @@ decouple one stage from the next. Without the buffers, all montioring would show .. code-block:: console $ morpheus run pipeline-nlp --viz_file=basic_usage_img/multi_monitor_throughput.png \ - from-file --filename morpheus/data/pcap_dump.jsonlines \ + from-file --filename examples/data/pcap_dump.jsonlines \ monitor --description "From File Throughput" \ buffer \ deserialize \ @@ -107,7 +107,7 @@ This example shows an NLP Pipeline which uses most stages available in Morpheus. $ morpheus run --num_threads=8 --pipeline_batch_size=1024 --model_max_batch_size=32 \ pipeline-nlp --viz_file=basic_usage_img/nlp_kitchen_sink.png \ - from-file --filename morpheus/data/pcap_dump.jsonlines \ + from-file --filename examples/data/pcap_dump.jsonlines \ buffer --count=500 \ deserialize \ preprocess \ diff --git a/docs/source/developer_guide/guides/1_simple_python_stage.md b/docs/source/developer_guide/guides/1_simple_python_stage.md index 9ec7d4198a..9625ce923d 100644 --- a/docs/source/developer_guide/guides/1_simple_python_stage.md +++ b/docs/source/developer_guide/guides/1_simple_python_stage.md @@ -31,8 +31,8 @@ Defining this stage requires us to specify the stage type. Morpheus stages conta import typing import neo -from morpheus.pipeline.pipeline import SinglePortStage -from morpheus.pipeline.pipeline import StreamPair +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair class PassThruStage(SinglePortStage): ``` @@ -87,8 +87,8 @@ import typing import neo -from morpheus.pipeline.pipeline import SinglePortStage -from morpheus.pipeline.pipeline import StreamPair +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair class PassThruStage(SinglePortStage): @property @@ -122,8 +122,8 @@ import os from morpheus.config import Config from morpheus.pipeline import LinearPipeline -from morpheus.pipeline.general_stages import MonitorStage -from morpheus.pipeline.input.from_file import FileSourceStage +from morpheus.stages.general.monitor_stage import MonitorStage +from morpheus.stages.input.file_source_stage import FileSourceStage from morpheus.utils.logging import configure_logging from pass_thru import PassThruStage @@ -183,8 +183,8 @@ import os from morpheus.config import Config from morpheus.pipeline import LinearPipeline -from morpheus.pipeline.general_stages import MonitorStage -from morpheus.pipeline.input.from_file import FileSourceStage +from morpheus.stages.general.monitor_stage import MonitorStage +from morpheus.stages.input.file_source_stage import FileSourceStage from morpheus.utils.logging import configure_logging from pass_thru import PassThruStage diff --git a/docs/source/developer_guide/guides/2_real_world_phishing.md b/docs/source/developer_guide/guides/2_real_world_phishing.md index 07c1f9ef5f..ad3526f473 100644 --- a/docs/source/developer_guide/guides/2_real_world_phishing.md +++ b/docs/source/developer_guide/guides/2_real_world_phishing.md @@ -80,9 +80,9 @@ import typing import neo -from morpheus.pipeline.messages import MessageMeta -from morpheus.pipeline.pipeline import SinglePortStage -from morpheus.pipeline.pipeline import StreamPair +from morpheus.messages.message_meta import MessageMeta +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair class RecipientFeaturesStage(SinglePortStage): @@ -193,7 +193,7 @@ out_dir = os.environ.get('OUT_DIR', '/tmp') labels_file = os.path.join(morpheus.DATA_DIR, 'labels_phishing.txt') vocab_file = os.path.join(morpheus.DATA_DIR, 'bert-base-uncased-hash.txt') -input_file = os.path.join(root_dir, 'examples/data/email.jsonlines') +input_file = os.path.join(root_dir, 'examples/data/email_with_addresses.jsonlines') results_file = os.path.join(out_dir, 'detections.jsonlines') ``` @@ -290,14 +290,14 @@ import morpheus from morpheus.config import Config from morpheus.config import PipelineModes from morpheus.pipeline import LinearPipeline -from morpheus.pipeline.general_stages import FilterDetectionsStage -from morpheus.pipeline.general_stages import MonitorStage -from morpheus.pipeline.inference.inference_triton import TritonInferenceStage -from morpheus.pipeline.input.from_file import FileSourceStage -from morpheus.pipeline.output.serialize import SerializeStage -from morpheus.pipeline.output.to_file import WriteToFileStage -from morpheus.pipeline.preprocessing import DeserializeStage -from morpheus.pipeline.preprocessing import PreprocessNLPStage +from morpheus.stages.general.monitor_stage import MonitorStage +from morpheus.stages.inference.triton_inference_stage import TritonInferenceStage +from morpheus.stages.input.file_source_stage import FileSourceStage +from morpheus.stages.output.write_to_file_stage import WriteToFileStage +from morpheus.stages.postprocess.filter_detections_stage import FilterDetectionsStage +from morpheus.stages.postprocess.serialize_stage import SerializeStage +from morpheus.stages.preprocess.deserialize_stage import DeserializeStage +from morpheus.stages.preprocess.preprocess_nlp_stage import PreprocessNLPStage from morpheus.utils.logging import configure_logging from recipient_feature_stage import RecipientFeaturesStage @@ -313,7 +313,7 @@ def run_pipeline(): labels_file = os.path.join(morpheus.DATA_DIR, 'labels_phishing.txt') vocab_file = os.path.join(morpheus.DATA_DIR, 'bert-base-uncased-hash.txt') - input_file = os.path.join(root_dir, 'examples/data/email.jsonlines') + input_file = os.path.join(root_dir, 'examples/data/email_with_addresses.jsonlines') results_file = os.path.join(out_dir, 'detections.jsonlines') # It's necessary to configure the pipeline for NLP mode @@ -453,9 +453,9 @@ import pika import cudf from morpheus.config import Config -from morpheus.pipeline.messages import MessageMeta -from morpheus.pipeline.pipeline import SingleOutputSource -from morpheus.pipeline.pipeline import StreamPair +from morpheus.messages.message_meta import MessageMeta +from morpheus.pipeline.single_output_source import SingleOutputSource +from morpheus.pipeline.stream_pair import StreamPair logger = logging.getLogger(__name__) @@ -597,9 +597,9 @@ import pika import cudf from morpheus.config import Config -from morpheus.pipeline.messages import MessageMeta -from morpheus.pipeline.pipeline import SinglePortStage -from morpheus.pipeline.pipeline import StreamPair +from morpheus.messages.message_meta import MessageMeta +from morpheus.pipeline.single_port_stage import SinglePortStage +from morpheus.pipeline.stream_pair import StreamPair logger = logging.getLogger(__name__) diff --git a/docs/source/morpheus_quickstart_guide.md b/docs/source/morpheus_quickstart_guide.md index e32b636987..89907993c7 100644 --- a/docs/source/morpheus_quickstart_guide.md +++ b/docs/source/morpheus_quickstart_guide.md @@ -559,7 +559,7 @@ $ helm install --set ngc.apiKey="$API_KEY" \ pipeline-nlp \ --model_seq_length=128 \ --labels_file=./morpheus/data/labels_phishing.txt \ - from-file --filename=./morpheus/data/email.jsonlines \ + from-file --filename=./examples/data/email.jsonlines \ monitor --description 'FromFile Rate' --smoothing=0.001 \ deserialize \ preprocess --vocab_hash_file=./morpheus/data/bert-base-uncased-hash.txt --truncation=True --do_lower_case=True --add_special_tokens=False \ @@ -635,7 +635,7 @@ $ helm install --set ngc.apiKey="$API_KEY" \ --model_max_batch_size=32 \ pipeline-nlp \ --model_seq_length=256 \ - from-file --filename=./morpheus/data/pcap_dump.jsonlines \ + from-file --filename=./examples/data/pcap_dump.jsonlines \ monitor --description 'FromFile Rate' --smoothing=0.001 \ deserialize \ preprocess --vocab_hash_file=./morpheus/data/bert-base-uncased-hash.txt --truncation=True --do_lower_case=True --add_special_tokens=False \ @@ -685,7 +685,7 @@ Make sure you create input and output Kafka topics before you start the pipeline $ kubectl -n $NAMESPACE exec -it deploy/broker -c broker -- kafka-console-producer.sh \ --broker-list broker:9092 \ --topic < \ - + ``` **Note**: This should be used for development purposes only via this developer kit. Loading from the file into Kafka should not be used in production deployments of Morpheus. @@ -708,7 +708,7 @@ $ helm install --set ngc.apiKey="$API_KEY" \ --model_max_batch_size=64 \ --use_cpp=True \ pipeline-fil \ - from-file --filename=./morpheus/data/nvsmi.jsonlines \ + from-file --filename=./examples/data/nvsmi.jsonlines \ monitor --description 'FromFile Rate' --smoothing=0.001 \ deserialize \ preprocess \ @@ -754,7 +754,7 @@ Make sure you create input and output Kafka topics before you start the pipeline $ kubectl -n $NAMESPACE exec -it deploy/broker -c broker -- kafka-console-producer.sh \ --broker-list broker:9092 \ --topic < \ - + ``` **Note**: This should be used for development purposes only via this developer kit. Loading from the file into Kafka should not be used in production deployments of Morpheus. diff --git a/examples/abp_nvsmi_detection/README.md b/examples/abp_nvsmi_detection/README.md index 7a52fad963..9c590d867e 100644 --- a/examples/abp_nvsmi_detection/README.md +++ b/examples/abp_nvsmi_detection/README.md @@ -46,7 +46,7 @@ $ nvidia-smi dmon Each line in the output represents the GPU metrics at a single point in time. As the tool progresses the GPU begins to be utilized and you can see the SM% and Mem% increase as memory is loaded into the GPU and computations are performed. The model we will be using can ingest this information and determine whether or not the GPU is mining cryptocurriences without needing additional information from the host machine. -In this example we will be using the `morpheus/data/nvsmi.jsonlines` dataset that is known to contain mining behavior profiles. The dataset is in the `.jsonlines` format which means each new line represents an new JSON object. In order to parse this data, it must be ingested, split by lines into individual JSON objects, and parsed into cuDF dataframes. This will all be handled by Morpheus. +In this example we will be using the `examples/data/nvsmi.jsonlines` dataset that is known to contain mining behavior profiles. The dataset is in the `.jsonlines` format which means each new line represents an new JSON object. In order to parse this data, it must be ingested, split by lines into individual JSON objects, and parsed into cuDF dataframes. This will all be handled by Morpheus. ## Pipeline Architecture @@ -102,7 +102,7 @@ morpheus --log_level=DEBUG \ `# Specify a NLP pipeline with 256 sequence length (Must match Triton config)` \ pipeline-fil \ `# 1st Stage: Read from file` \ - from-file --filename=$MORPHEUS_ROOT/morpheus/data/nvsmi.jsonlines \ + from-file --filename=$MORPHEUS_ROOT/examples/data/nvsmi.jsonlines \ `# 2nd Stage: Deserialize from JSON strings to objects` \ deserialize \ `# 3rd Stage: Preprocessing converts the input data into BERT tokens` \ @@ -178,7 +178,7 @@ CPP Enabled: True ====Registering Pipeline Complete!==== ====Starting Pipeline==== ====Building Pipeline==== -Added source: +Added source: └─> morpheus.MessageMeta Added stage: └─ morpheus.MessageMeta -> morpheus.MultiMessage diff --git a/examples/abp_pcap_detection/README.md b/examples/abp_pcap_detection/README.md index 7c478afd0e..4f43f77b0a 100644 --- a/examples/abp_pcap_detection/README.md +++ b/examples/abp_pcap_detection/README.md @@ -83,11 +83,11 @@ Options: --help Show this message and exit. ``` -To launch the configured Morpheus pipeline with the sample data that is provided at `/morpheus/data`, run the following: +To launch the configured Morpheus pipeline with the sample data that is provided at `/examples/data`, run the following: ```bash python run.py \ - --input_file ../../morpheus/data/abp_pcap_dump.jsonlines \ + --input_file ../data/abp_pcap_dump.jsonlines \ --output_file ./pcap_out.jsonlines \ --model_name 'abp-pcap-xgb' \ --server_url localhost:8001 diff --git a/morpheus/data/abp_pcap_dump.jsonlines b/examples/data/abp_pcap_dump.jsonlines similarity index 100% rename from morpheus/data/abp_pcap_dump.jsonlines rename to examples/data/abp_pcap_dump.jsonlines diff --git a/morpheus/data/email.jsonlines b/examples/data/email.jsonlines similarity index 100% rename from morpheus/data/email.jsonlines rename to examples/data/email.jsonlines diff --git a/examples/data/email_with_addresses.jsonlines b/examples/data/email_with_addresses.jsonlines new file mode 100644 index 0000000000..e6492beefc --- /dev/null +++ b/examples/data/email_with_addresses.jsonlines @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:446c0c9a4def391b67700ea628b0b035d30434fd7b06728a76acc66f992c0714 +size 63008188 diff --git a/morpheus/data/nvsmi.jsonlines b/examples/data/nvsmi.jsonlines similarity index 100% rename from morpheus/data/nvsmi.jsonlines rename to examples/data/nvsmi.jsonlines diff --git a/morpheus/data/pcap_dump.jsonlines b/examples/data/pcap_dump.jsonlines similarity index 100% rename from morpheus/data/pcap_dump.jsonlines rename to examples/data/pcap_dump.jsonlines diff --git a/morpheus/data/sid_training_data_truth.csv b/examples/data/sid_training_data_truth.csv similarity index 100% rename from morpheus/data/sid_training_data_truth.csv rename to examples/data/sid_training_data_truth.csv diff --git a/examples/data/with_data_len.json b/examples/data/with_data_len.json deleted file mode 100644 index ee077f1dea..0000000000 --- a/examples/data/with_data_len.json +++ /dev/null @@ -1,1000 +0,0 @@ -{"timestamp": 1616380971990, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 73\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50410", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380971991, "host_ip": "10.188.40.56", "data_len": "139", "data": "\"{\\\"markerEmail\\\": \\\"FuRLFaAZ identify benefit BneiMvCZ join 92694759\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.25", "src_port": "50410", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380971993, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 39\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.1", "src_port": "50412", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972094, "host_ip": "10.188.40.56", "data_len": "105", "data": "\"{\\\"markerEmail\\\": \\\"court 38508680\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "50412", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972096, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 67\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.24", "dest_ip": "10.20.16.248", "src_port": "50414", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972197, "host_ip": "10.188.40.56", "data_len": "133", "data": "\"{\\\"markerEmail\\\": \\\"3IfEzUY4 push TwFuifmV ten 56051356 happen\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.44", "dest_ip": "10.20.16.248", "src_port": "50414", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972200, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 72\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.24", "src_port": "50416", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972302, "host_ip": "10.188.40.56", "data_len": "138", "data": "\"{\\\"evaluatorEmail\\\": \\\"main 77104749 ljfkRtsF while change BIrTfHMq\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.2", "src_port": "50416", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972305, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 45\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50418", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972306, "host_ip": "10.188.40.56", "data_len": "111", "data": "\"{\\\"evaluatorEmail\\\": \\\"RaimeGfZ ejRCN27U\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50418", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972408, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 67\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.38", "src_port": "50420", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972409, "host_ip": "10.188.40.56", "data_len": "133", "data": "\"{\\\"evaluatorEmail\\\": \\\"production third UaVbuUtX gcqJ7l9F rise\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.25", "dest_ip": "10.20.16.248", "src_port": "50420", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972411, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 46\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.1", "src_port": "50422", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972511, "host_ip": "10.188.40.56", "data_len": "112", "data": "\"{\\\"facilitators\\\": true, \\\"learners\\\": true}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50422", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972514, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 265\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.14", "dest_ip": "10.20.16.248", "src_port": "50424", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972515, "host_ip": "10.188.40.56", "data_len": "331", "data": "\"{\\\"client_id\\\": \\\"Dt0glhvY\\\", \\\"client_secret\\\": \\\"IgIgmIspdqbLQaGMTCwlelcOl\\\", \\\"grant_type\\\": \\\"4zw2E0zN cyipAqko even such 82510185 drive\\\", \\\"code\\\": \\\"32173675 BOBZcZ5j board DfAliIAu every newspaper\\\", \\\"redirect_uri\\\": \\\"vGXJUePl despite within LqK4fJFa\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.20", "src_port": "50424", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972516, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "50424", "flags": "24", "is_pii": false} -{"timestamp": 1616380972617, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 283\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.19", "src_port": "50426", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972617, "host_ip": "10.188.40.56", "data_len": "349", "data": "\"{\\\"client_id\\\": \\\"star iPwrFAoJ 50259041\\\", \\\"response_type\\\": \\\"performance\\\", \\\"scope\\\": \\\"hXJMcWvp MmMYG63P\\\", \\\"redirect_uri\\\": \\\"vLpIEb6e movement consider environment 50115611 XfedBJGS\\\", \\\"state\\\": \\\"Massachusetts\\\", \\\"response_mode\\\": \\\"Yvi5VydO 01018998 yourself remain\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.244.0.1", "src_port": "50426", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972618, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "80", "dest_port": "50426", "flags": "24", "is_pii": false} -{"timestamp": 1616380972620, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 312\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50428", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972620, "host_ip": "10.188.40.56", "data_len": "378", "data": "\"{\\\"client_id\\\": \\\"NSloV1ku KuIUbEog\\\", \\\"response_type\\\": \\\"TFxqwBc1 oEKnNdcM 76255087 page\\\", \\\"scope\\\": \\\"19721222 rifztuUs\\\", \\\"redirect_uri\\\": \\\"spend CJezeiqN place\\\", \\\"state\\\": \\\"North Dakota\\\", \\\"display\\\": \\\"63671212\\\", \\\"max_age\\\": 698331062, \\\"Serial\\\": \\\"4cec64fb372462efbd09b2d0fccffe237fbf81cd\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.20.16.248", "src_port": "50428", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972621, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.16", "src_port": "80", "dest_port": "50428", "flags": "24", "is_pii": false} -{"timestamp": 1616380972721, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 255\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.18", "src_port": "50430", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972721, "host_ip": "10.188.40.56", "data_len": "321", "data": "\"{\\\"client_id\\\": \\\"Kz7RjmHL 40806694\\\", \\\"response_type\\\": \\\"trade\\\", \\\"scope\\\": \\\"growth\\\", \\\"redirect_uri\\\": \\\"g8Q24SL8 97373897 XweuyARj\\\", \\\"state\\\": \\\"Georgia\\\", \\\"ui_locales\\\": \\\"wonder teach UQGADuPG QhnM4MnQ 43145227\\\", \\\"PostalCode\\\": \\\"10015\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "50430", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972725, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 424\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.59", "src_port": "50432", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972725, "host_ip": "10.188.40.56", "data_len": "490", "data": "\"{\\\"client_id\\\": \\\"himself 24631962 whole quickly 4VAkfKWA haUAhnwq\\\", \\\"response_type\\\": \\\"FvaHnfg9\\\", \\\"scope\\\": \\\"conference recent single\\\", \\\"redirect_uri\\\": \\\"get show 71137905 that ZLf0aaau\\\", \\\"state\\\": \\\"Florida\\\", \\\"response_mode\\\": \\\"ok maintain QnlLDCUa 35992394 institution\\\", \\\"nonce\\\": \\\"AkT0Nggu nbQDyjPb\\\", \\\"display\\\": \\\"whole 37485503 threat\\\", \\\"prompt\\\": \\\"TBlwTRty mjpK6XJL\\\", \\\"city\\\": \\\"Novakview\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50432", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972826, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "50432", "flags": "24", "is_pii": false} -{"timestamp": 1616380972828, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 399\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.59", "src_port": "50434", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972828, "host_ip": "10.188.40.56", "data_len": "465", "data": "\"{\\\"client_id\\\": \\\"VoLXKgoi threat 73406240 success\\\", \\\"response_type\\\": \\\"more 62802758 1gi0hd7r its where\\\", \\\"scope\\\": \\\"tree YshUlEEV 60wrStK1 between\\\", \\\"redirect_uri\\\": \\\"uSlcZIGa smvm34J6 husband 87890262 wide hair\\\", \\\"state\\\": \\\"California\\\", \\\"response_mode\\\": \\\"poor\\\", \\\"prompt\\\": \\\"vote 41892345\\\", \\\"max_age\\\": -584149250, \\\"ui_locales\\\": \\\"spend\\\", \\\"email\\\": \\\"kray@hotmail.com\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.24", "dest_ip": "10.20.16.248", "src_port": "50434", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972829, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "80", "dest_port": "50434", "flags": "24", "is_pii": false} -{"timestamp": 1616380972831, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 434\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "50436", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972831, "host_ip": "10.188.40.56", "data_len": "500", "data": "\"{\\\"client_id\\\": \\\"view 46278185 qLBrwJTA YuP2ZZm5 get method\\\", \\\"response_type\\\": \\\"flVbXbRB\\\", \\\"scope\\\": \\\"system situation 32468984 tkAWhAVw voice Q15n4Blz\\\", \\\"redirect_uri\\\": \\\"dlvHXCtF 79010035 best\\\", \\\"state\\\": \\\"Maine\\\", \\\"nonce\\\": \\\"28311108 SV2wllvE effort ok western\\\", \\\"display\\\": \\\"33312024 still least ahe8Ixir time\\\", \\\"ui_locales\\\": \\\"forward 21535278 XStoUJUK security UFuazwOL\\\", \\\"bic\\\": \\\"LHGC5918472277767\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "50436", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972930, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.21", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "50436", "flags": "24", "is_pii": false} -{"timestamp": 1616380972931, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 297\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "50438", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972932, "host_ip": "10.188.40.56", "data_len": "363", "data": "\"{\\\"client_id\\\": \\\"at\\\", \\\"response_type\\\": \\\"72023939\\\", \\\"scope\\\": \\\"G4oCJnaJ uuejbMtu 80459319\\\", \\\"redirect_uri\\\": \\\"clear kizjbxDe\\\", \\\"state\\\": \\\"New Hampshire\\\", \\\"response_mode\\\": \\\"step SXADtMyb 41281664 8V9XnX3r\\\", \\\"nonce\\\": \\\"bag WGCEyeLY certainly 71374880\\\", \\\"lat\\\": \\\"41.439694\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50438", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972932, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.44", "src_port": "80", "dest_port": "50438", "flags": "24", "is_pii": false} -{"timestamp": 1616380972936, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 418\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.19", "dest_ip": "10.20.16.248", "src_port": "50440", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380972936, "host_ip": "10.188.40.56", "data_len": "484", "data": "\"{\\\"client_id\\\": \\\"0SdiNrDE\\\", \\\"response_type\\\": \\\"upon\\\", \\\"scope\\\": \\\"detail zfADjx4M boy gIuKwRgi 17147173 room\\\", \\\"redirect_uri\\\": \\\"try 29982152 orcRETeQ\\\", \\\"state\\\": \\\"Tennessee\\\", \\\"response_mode\\\": \\\"tWSPVYLp cultural\\\", \\\"display\\\": \\\"ZxJiAvjJ style provide u6Hot1jI\\\", \\\"max_age\\\": 689612288, \\\"ui_locales\\\": \\\"aCOSVGTl ozOoxqsU let 94950501 trade\\\", \\\"doingBusinessAs\\\": \\\"Gallegos, Saunders and Gill\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.43", "dest_ip": "10.20.16.248", "src_port": "50440", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973034, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "50440", "flags": "24", "is_pii": false} -{"timestamp": 1616380973036, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 403\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.244.0.57", "src_port": "50442", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973036, "host_ip": "10.188.40.56", "data_len": "469", "data": "\"{\\\"client_id\\\": \\\"UPOdKgiS authority v7xp3F3B last 92636017\\\", \\\"response_type\\\": \\\"WkrSZASi\\\", \\\"scope\\\": \\\"owner\\\", \\\"redirect_uri\\\": \\\"sort\\\", \\\"state\\\": \\\"North Dakota\\\", \\\"response_mode\\\": \\\"skin\\\", \\\"nonce\\\": \\\"scientist 84l2NuvZ common 97591958\\\", \\\"prompt\\\": \\\"dwPekZzf floor set woman 42643160 gpvIomTL\\\", \\\"ui_locales\\\": \\\"current nnPJkyj8 training\\\", \\\"businessName\\\": \\\"Hatfield-Mueller\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.37", "src_port": "50442", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973037, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "80", "dest_port": "50442", "flags": "24", "is_pii": false} -{"timestamp": 1616380973039, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 371\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "50444", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973039, "host_ip": "10.188.40.56", "data_len": "437", "data": "\"{\\\"client_id\\\": \\\"strategy FyKVhjLq\\\", \\\"response_type\\\": \\\"qrhPndAT\\\", \\\"scope\\\": \\\"authority 79857125 aIkfUyhk VFgtMJJO grow\\\", \\\"redirect_uri\\\": \\\"MdeBJAbx sell however OlEefnOt 56141368\\\", \\\"state\\\": \\\"Iowa\\\", \\\"display\\\": \\\"interest success strong QVzcIySD 73540639\\\", \\\"ui_locales\\\": \\\"nkmmilbm\\\", \\\"Signature_sha1\\\": \\\"82e7d7d7e77d322eba6cb86ac9721a7f5df21cee\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.20", "src_port": "50444", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973138, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.39", "src_port": "80", "dest_port": "50444", "flags": "24", "is_pii": false} -{"timestamp": 1616380973140, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 328\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.13", "src_port": "50446", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973140, "host_ip": "10.188.40.56", "data_len": "394", "data": "\"{\\\"client_id\\\": \\\"school 78869019 YDUQb6Sn\\\", \\\"response_type\\\": \\\"medical fine Th48giy7\\\", \\\"scope\\\": \\\"rqoECbdJ 04835525 ready issue\\\", \\\"redirect_uri\\\": \\\"set ouXofxiK it\\\", \\\"state\\\": \\\"Texas\\\", \\\"max_age\\\": -426986653, \\\"ui_locales\\\": \\\"FiZQznZo 72137485 hblTVcTg professional people somebody\\\", \\\"user\\\": \\\"Luis Hogan\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.59", "src_port": "50446", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973141, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.16", "src_port": "80", "dest_port": "50446", "flags": "24", "is_pii": false} -{"timestamp": 1616380973142, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 297\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.52", "src_port": "50448", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973143, "host_ip": "10.188.40.56", "data_len": "363", "data": "\"{\\\"client_id\\\": \\\"IfMbYWxh fqFmoTaZ\\\", \\\"response_type\\\": \\\"6J6PtDwA charge zrrtQyKP 66624683 part\\\", \\\"scope\\\": \\\"family ilrUWFTz\\\", \\\"redirect_uri\\\": \\\"60740775 dream\\\", \\\"state\\\": \\\"Arkansas\\\", \\\"prompt\\\": \\\"color\\\", \\\"ui_locales\\\": \\\"nation 13796097\\\", \\\"IdentityDocument\\\": \\\"520-18-4491\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "50448", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973242, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.34", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "50448", "flags": "24", "is_pii": false} -{"timestamp": 1616380973243, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 531\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.15", "dest_ip": "10.244.0.1", "src_port": "50450", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973244, "host_ip": "10.188.40.56", "data_len": "597", "data": "\"{\\\"client_id\\\": \\\"PM i5nj5Z9f protect whether\\\", \\\"response_type\\\": \\\"80751093 president vrLVrPfd enough\\\", \\\"scope\\\": \\\"indicate 75249325 seven wxMfJjDP finally g6cYMHfj\\\", \\\"redirect_uri\\\": \\\"69581702 throw LfICfz3w could\\\", \\\"state\\\": \\\"Rhode Island\\\", \\\"response_mode\\\": \\\"E1OuFW2G project 17466969\\\", \\\"nonce\\\": \\\"produce choice 72231726 space wI9YCBLy\\\", \\\"display\\\": \\\"keTMunsf across consumer\\\", \\\"prompt\\\": \\\"southern\\\", \\\"max_age\\\": -746506095, \\\"ui_locales\\\": \\\"across effort lQs5m130\\\", \\\"longitude\\\": \\\"174.445883\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.13", "src_port": "50450", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973245, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.32", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "50450", "flags": "24", "is_pii": false} -{"timestamp": 1616380973246, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 62\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.27", "dest_ip": "10.20.16.248", "src_port": "50452", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973345, "host_ip": "10.188.40.56", "data_len": "128", "data": "\"{\\\"server\\\": \\\"UeqhpztQ list understand 01554017 3WyW6Io9\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50452", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973348, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 172\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "50454", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973349, "host_ip": "10.188.40.56", "data_len": "238", "data": "\"{\\\"server\\\": \\\"different deal to\\\", \\\"nonce\\\": \\\"03033462 list usually fB8P4wAL\\\", \\\"realm\\\": \\\"29482547 citizen YXjyPeQF our common yzLGb9jG\\\", \\\"userid\\\": \\\"Paul Lee\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.2", "dest_ip": "10.20.16.248", "src_port": "50454", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973554, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 186\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.34", "src_port": "50456", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973555, "host_ip": "10.188.40.56", "data_len": "252", "data": "\"{\\\"server\\\": \\\"worry\\\", \\\"nonce\\\": \\\"11880628 film really rEdIXIiB suggest\\\", \\\"realm\\\": \\\"chair effort gEPkxRgE 7IzONSOK\\\", \\\"userid\\\": \\\"William Shields\\\", \\\"postalCode\\\": \\\"07162\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50456", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973557, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 162\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.26", "dest_ip": "10.20.16.248", "src_port": "50458", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973656, "host_ip": "10.188.40.56", "data_len": "228", "data": "\"{\\\"server\\\": \\\"thought where fus4LRsZ\\\", \\\"nonce\\\": \\\"war cup fagOHCNO 05202296 3oQuuV1d organization\\\", \\\"userid\\\": \\\"Dennis Larson\\\", \\\"State\\\": \\\"Oklahoma\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.36", "src_port": "50458", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973659, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 153\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.10", "src_port": "50460", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973660, "host_ip": "10.188.40.56", "data_len": "219", "data": "\"{\\\"server\\\": \\\"watch 99654302 jdKLfcqi find NUAPSyjZ\\\", \\\"nonce\\\": \\\"9Jv2kI0H could\\\", \\\"userid\\\": \\\"Kenneth Rowland\\\", \\\"Bic\\\": \\\"BQDD0637136315775\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.18", "src_port": "50460", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973865, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 211\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.59", "src_port": "50462", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973866, "host_ip": "10.188.40.56", "data_len": "277", "data": "\"{\\\"server\\\": \\\"zm6kneBV right pull back ZzdrsbuX 99368781\\\", \\\"nonce\\\": \\\"idea employee EwFAEais 89992296 participant\\\", \\\"realm\\\": \\\"speech\\\", \\\"userid\\\": \\\"Kimberly Santiago\\\", \\\"longitude\\\": \\\"-81.889021\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.20.16.248", "src_port": "50462", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973968, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 181\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.52", "dest_ip": "10.244.0.50", "src_port": "50464", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973968, "host_ip": "10.188.40.56", "data_len": "247", "data": "\"{\\\"server\\\": \\\"19379824 natural 1lnZlx4O consider\\\", \\\"nonce\\\": \\\"uwBdorSD do\\\", \\\"realm\\\": \\\"source 9qpWy1p8\\\", \\\"userid\\\": \\\"Helen Wright\\\", \\\"Nationality\\\": \\\"Cayman Islands\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.10", "dest_ip": "10.20.16.248", "src_port": "50464", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973971, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 153\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.28", "src_port": "50466", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380973971, "host_ip": "10.188.40.56", "data_len": "219", "data": "\"{\\\"server\\\": \\\"today\\\", \\\"nonce\\\": \\\"marriage he YeZjVxsL tc3oBXrw relate 13547351\\\", \\\"userid\\\": \\\"William Rice\\\", \\\"Phone\\\": \\\"+1-233-416-4181x203\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.13", "dest_ip": "10.20.16.248", "src_port": "50466", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380974176, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 165\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50468", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380974177, "host_ip": "10.188.40.56", "data_len": "231", "data": "\"{\\\"server\\\": \\\"guess 95478656 reach QVZgk2YO LHUJGeoZ million\\\", \\\"nonce\\\": \\\"until oil BTfNzTEj too\\\", \\\"userid\\\": \\\"Jessica Williams\\\", \\\"Apartment\\\": \\\"26035\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50468", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380974279, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 179\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.36", "src_port": "50470", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380974279, "host_ip": "10.188.40.56", "data_len": "245", "data": "\"{\\\"server\\\": \\\"likely Wrx6mdpu 48794467 YHjeIsjE find\\\", \\\"nonce\\\": \\\"appear 93020503 enter eye LYlUIElF 1friONsy\\\", \\\"userid\\\": \\\"Mark Lamb\\\", \\\"Nationality\\\": \\\"Philippines\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.52", "dest_ip": "10.244.0.57", "src_port": "50470", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380974282, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 186\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.27", "dest_ip": "10.20.16.248", "src_port": "50472", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380974283, "host_ip": "10.188.40.56", "data_len": "252", "data": "\"{\\\"server\\\": \\\"raise face 29870034 full zzpwzMNT\\\", \\\"nonce\\\": \\\"W3MdhP2v special\\\", \\\"realm\\\": \\\"much behind key 81722947\\\", \\\"userid\\\": \\\"Cynthia Frey\\\", \\\"IdCard\\\": \\\"864-07-2292\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.28", "src_port": "50472", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380974485, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 130\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50474", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380974485, "host_ip": "10.188.40.56", "data_len": "196", "data": "\"{\\\"server\\\": \\\"kXIWFoRJ\\\", \\\"nonce\\\": \\\"iVcuFuIR notice l6SVDJHN even\\\", \\\"userid\\\": \\\"Eduardo Riley\\\", \\\"lon\\\": \\\"161.276457\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.32", "dest_ip": "10.20.16.248", "src_port": "50474", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380974691, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 225\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.15", "dest_ip": "10.244.0.57", "src_port": "50476", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380974692, "host_ip": "10.188.40.56", "data_len": "291", "data": "\"{\\\"server\\\": \\\"lEcFo9gK 01936511 ago hear\\\", \\\"nonce\\\": \\\"Democrat iDij96oV NUMWDbiL\\\", \\\"realm\\\": \\\"response 58422028 different company yfOuT5hG ydHgZzQO\\\", \\\"userid\\\": \\\"Linda Nolan\\\", \\\"DocumentNumber\\\": \\\"873-63-1118\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.100.150.125", "dest_ip": "10.244.0.59", "src_port": "50476", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380974693, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 164\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.30", "dest_ip": "10.20.16.248", "src_port": "50478", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380974793, "host_ip": "10.188.40.56", "data_len": "230", "data": "\"{\\\"server\\\": \\\"may her B2jpIoKZ wBBlwNlm 86487196 young\\\", \\\"nonce\\\": \\\"card\\\", \\\"realm\\\": \\\"perhaps\\\", \\\"userid\\\": \\\"Charles Jimenez\\\", \\\"lastname\\\": \\\"Oneill\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.37", "src_port": "50478", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380974796, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 60\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "50480", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380974797, "host_ip": "10.188.40.56", "data_len": "126", "data": "\"{\\\"server\\\": \\\"key sell\\\", \\\"userid\\\": \\\"Jordan Salazar\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.18", "dest_ip": "10.20.16.248", "src_port": "50480", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380974900, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 117\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.34", "src_port": "50482", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380974901, "host_ip": "10.188.40.56", "data_len": "183", "data": "\"{\\\"server\\\": \\\"zRxhl7J9 15974689 UBRqPneb skin\\\", \\\"userid\\\": \\\"Christopher Clark\\\", \\\"passport\\\": \\\"405-83-9747\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.29", "src_port": "50482", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975004, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 124\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.12", "src_port": "50484", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975004, "host_ip": "10.188.40.56", "data_len": "190", "data": "\"{\\\"server\\\": \\\"social RQRGcIeR 40442279\\\", \\\"realm\\\": \\\"protect\\\", \\\"userid\\\": \\\"Julie Garza\\\", \\\"Street\\\": \\\"Suite 248\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "50484", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975006, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 177\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.26", "dest_ip": "10.20.16.248", "src_port": "50486", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975006, "host_ip": "10.188.40.56", "data_len": "243", "data": "\"{\\\"server\\\": \\\"lyuViKpS western use\\\", \\\"realm\\\": \\\"84218171 UM3kVjsL yNGdEpDr sing\\\", \\\"userid\\\": \\\"Emily Houston\\\", \\\"serial\\\": \\\"e0ddde7898dabbdd84766edfd2cd4ebfb26896a7\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.19", "src_port": "50486", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975210, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 124\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50488", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975210, "host_ip": "10.188.40.56", "data_len": "190", "data": "\"{\\\"server\\\": \\\"TWeXaYid like them A3tKd9kg Democrat\\\", \\\"userid\\\": \\\"Laura King\\\", \\\"BusinessContact\\\": \\\"Sarah Russell\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.1", "src_port": "50488", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975314, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 196\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.40", "src_port": "50490", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975314, "host_ip": "10.188.40.56", "data_len": "262", "data": "\"{\\\"server\\\": \\\"37895087\\\", \\\"realm\\\": \\\"difficult agreement eqNOJAOX himself 43506442 KTqhulf6\\\", \\\"userid\\\": \\\"Jerry Simmons\\\", \\\"signature_sha1\\\": \\\"ac444368ac867aaefa3c26b00279651c98db2b13\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.244.0.1", "src_port": "50490", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975318, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 103\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.26", "src_port": "50492", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975418, "host_ip": "10.188.40.56", "data_len": "169", "data": "\"{\\\"server\\\": \\\"lose church 68884739 wrong\\\", \\\"userid\\\": \\\"Jennifer Rojas\\\", \\\"lat\\\": \\\"-49.012068\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.55", "src_port": "50492", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975421, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 138\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.10", "dest_ip": "10.20.16.248", "src_port": "50494", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975422, "host_ip": "10.188.40.56", "data_len": "204", "data": "\"{\\\"server\\\": \\\"same pbeSJtXk about recently GlskTrzE 01273984\\\", \\\"userid\\\": \\\"Teresa King DVM\\\", \\\"identityDocument\\\": \\\"548-91-0610\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.39", "dest_ip": "10.20.16.248", "src_port": "50494", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975524, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 91\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.59", "src_port": "50496", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975524, "host_ip": "10.188.40.56", "data_len": "157", "data": "\"{\\\"server\\\": \\\"class\\\", \\\"userid\\\": \\\"Roberto Cohen\\\", \\\"ReservationCode\\\": \\\"QC019IO3\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50496", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975629, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 98\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.5", "src_port": "50498", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975629, "host_ip": "10.188.40.56", "data_len": "164", "data": "\"{\\\"server\\\": \\\"VXxd8x2u successful\\\", \\\"userid\\\": \\\"Bryan Hartman Jr.\\\", \\\"Lon\\\": \\\"23.623844\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.20", "dest_ip": "10.20.16.248", "src_port": "50498", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975632, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 134\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "50500", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975632, "host_ip": "10.188.40.56", "data_len": "200", "data": "\"{\\\"server\\\": \\\"pull xobyxwFe vjUm48WK week morning 29717277\\\", \\\"userid\\\": \\\"Kristine Christian\\\", \\\"email\\\": \\\"rmarquez@leon.com\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.32", "dest_ip": "10.20.16.248", "src_port": "50500", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975836, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 150\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.23", "dest_ip": "10.20.16.248", "src_port": "50502", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975836, "host_ip": "10.188.40.56", "data_len": "216", "data": "\"{\\\"server\\\": \\\"simply 82515137 tkalCjsA long now\\\", \\\"realm\\\": \\\"sound BxtAXJaT 83219526\\\", \\\"userid\\\": \\\"Dr. Shannon Fleming\\\", \\\"zip\\\": \\\"36047\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "50502", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975940, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 132\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "50504", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975940, "host_ip": "10.188.40.56", "data_len": "198", "data": "\"{\\\"server\\\": \\\"98519574\\\", \\\"realm\\\": \\\"01758378 as bill Es14oVse qYvyAigu\\\", \\\"userid\\\": \\\"Emma Clark\\\", \\\"countryCode\\\": \\\"UZ\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.30", "dest_ip": "10.20.16.248", "src_port": "50504", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380975943, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 62\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.16", "src_port": "50506", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380976044, "host_ip": "10.188.40.56", "data_len": "128", "data": "\"{\\\"server\\\": \\\"Fph5RB8C\\\", \\\"realm\\\": \\\"KerOoAZj 25195278\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.46", "dest_ip": "10.20.16.248", "src_port": "50506", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380976047, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 125\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.12", "src_port": "50508", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380976048, "host_ip": "10.188.40.56", "data_len": "191", "data": "\"{\\\"server\\\": \\\"32433331 wEQMdAEm hold newspaper strategy 6qtMLSIA\\\", \\\"nonce\\\": \\\"sVtQoLGO\\\", \\\"userid\\\": \\\"Eric Beck MD\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50508", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380976252, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 185\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "50510", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380976253, "host_ip": "10.188.40.56", "data_len": "251", "data": "\"{\\\"server\\\": \\\"above scene HQJ7qFij 65692998\\\", \\\"nonce\\\": \\\"stage RUCUbyAs TIIYHfQr 52357741 management employee\\\", \\\"userid\\\": \\\"Aaron Herman\\\", \\\"iban\\\": \\\"GB80IYJG6035022995632\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50510", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380976255, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 126\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.34", "dest_ip": "10.20.16.248", "src_port": "50512", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380976354, "host_ip": "10.188.40.56", "data_len": "192", "data": "\"{\\\"server\\\": \\\"wpugKSlC C6MXHpv3 91077386\\\", \\\"nonce\\\": \\\"Q8QEEpkw\\\", \\\"userid\\\": \\\"Kelly Brown\\\", \\\"Province\\\": \\\"Hawaii\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.42", "src_port": "50512", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380976357, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 167\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.61", "dest_ip": "10.244.0.47", "src_port": "50514", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380976358, "host_ip": "10.188.40.56", "data_len": "233", "data": "\"{\\\"server\\\": \\\"Qd4QV8lh\\\", \\\"nonce\\\": \\\"which effect SBGYnvPj 0FuyUxj7 one 48532323\\\", \\\"userid\\\": \\\"Jay Munoz\\\", \\\"realm\\\": \\\"DefXeB0E\\\", \\\"postalCode\\\": \\\"24087\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.2", "dest_ip": "10.20.16.248", "src_port": "50514", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380976562, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 160\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.10", "src_port": "50516", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380976563, "host_ip": "10.188.40.56", "data_len": "226", "data": "\"{\\\"server\\\": \\\"WjoPii9O\\\", \\\"nonce\\\": \\\"RXwoHhni emTSukpp better science\\\", \\\"userid\\\": \\\"Christy Weiss\\\", \\\"realm\\\": \\\"inside 80057095\\\", \\\"house\\\": \\\"625\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "50516", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380976665, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 252\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.33", "src_port": "50518", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380976665, "host_ip": "10.188.40.56", "data_len": "318", "data": "\"{\\\"server\\\": \\\"newspaper XaMD4OSs discover 47592704 indeed XeiHRDHN\\\", \\\"nonce\\\": \\\"47036794 Democrat tough BsNjvpwY sense jGlqcVEE\\\", \\\"userid\\\": \\\"Todd Henson\\\", \\\"realm\\\": \\\"wTT6WFJv back WfJSSOjF 90785210\\\", \\\"IdentityDocument\\\": \\\"201-35-3648\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.10", "src_port": "50518", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380976668, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 181\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50520", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380976669, "host_ip": "10.188.40.56", "data_len": "247", "data": "\"{\\\"server\\\": \\\"23764275 oiYgpykj reach door\\\", \\\"nonce\\\": \\\"picture 76638322\\\", \\\"userid\\\": \\\"Ashley Norman\\\", \\\"realm\\\": \\\"lead he joNpmUNV\\\", \\\"Shareholder\\\": \\\"Robert Bowman\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50520", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380976770, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 177\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50522", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380976770, "host_ip": "10.188.40.56", "data_len": "243", "data": "\"{\\\"server\\\": \\\"L3bThUcK hundred 40427320 TcpEeeLi hundred same\\\", \\\"nonce\\\": \\\"mnkFUFrx practice 6nFqpMgZ\\\", \\\"userid\\\": \\\"Billy Ward\\\", \\\"IdentityDocument\\\": \\\"153-92-4310\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.58", "src_port": "50522", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380976774, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 187\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "50524", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380976774, "host_ip": "10.188.40.56", "data_len": "253", "data": "\"{\\\"server\\\": \\\"OVDHetnB clear 45644344\\\", \\\"nonce\\\": \\\"zDmaMykU participant cause 20234837 MErL88S4\\\", \\\"userid\\\": \\\"Kayla Best\\\", \\\"realm\\\": \\\"47845775 loss\\\", \\\"Dba\\\": \\\"Hanson Inc\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50524", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380976976, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 157\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.16", "src_port": "50526", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380976976, "host_ip": "10.188.40.56", "data_len": "223", "data": "\"{\\\"server\\\": \\\"analysis specific 7qSBv8zt\\\", \\\"nonce\\\": \\\"31787845 billion day civil vyYnIMJc\\\", \\\"userid\\\": \\\"Joseph Mccormick\\\", \\\"lat\\\": \\\"-38.989658\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "50526", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977080, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 154\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50528", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977080, "host_ip": "10.188.40.56", "data_len": "220", "data": "\"{\\\"server\\\": \\\"63205985 wind\\\", \\\"nonce\\\": \\\"claim 09406018 nXHsdokf vaYGdbbX\\\", \\\"userid\\\": \\\"Dr. Dustin Willis\\\", \\\"drivingLicense\\\": \\\"519-92-5391\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50528", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977083, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 191\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.7", "src_port": "50530", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977084, "host_ip": "10.188.40.56", "data_len": "257", "data": "\"{\\\"server\\\": \\\"25036693 soldier iYcjwKnE DrYXp1vq easy\\\", \\\"nonce\\\": \\\"zQcFerGo candidate QlTyBKQP\\\", \\\"userid\\\": \\\"Kevin Lee\\\", \\\"realm\\\": \\\"88615532 yeah\\\", \\\"longitude\\\": \\\"-74.817899\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50530", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977185, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 195\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "50532", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977186, "host_ip": "10.188.40.56", "data_len": "261", "data": "\"{\\\"server\\\": \\\"41432311 WlBUkZwE food VS9J8zhF song\\\", \\\"nonce\\\": \\\"43500936 trip\\\", \\\"userid\\\": \\\"Susan Cooper\\\", \\\"realm\\\": \\\"provide board w09BLDOw wear\\\", \\\"reservationCode\\\": \\\"XRDFRXHY\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.39", "src_port": "50532", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977187, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 244\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.12", "src_port": "50534", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977289, "host_ip": "10.188.40.56", "data_len": "310", "data": "\"{\\\"server\\\": \\\"IAxYcuox V2WOSLPY 62348611 skin\\\", \\\"type\\\": \\\"whose size 38393484 relationship Qvy2TocU hhCyJkDt\\\", \\\"nonce\\\": \\\"SLFzNrIa church\\\", \\\"name\\\": \\\"ypzfaWiP really 03004307\\\", \\\"realm\\\": \\\"air bZFZhXNk 04031502 account ndb5a9Yr\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "50534", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977291, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 71\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.17", "dest_ip": "10.20.16.248", "src_port": "50536", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977291, "host_ip": "10.188.40.56", "data_len": "137", "data": "\"{\\\"server\\\": \\\"tax 58933742 yqeZAFzR\\\", \\\"nonce\\\": \\\"much KlPMzVKk\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50536", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977394, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 83\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "50538", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977395, "host_ip": "10.188.40.56", "data_len": "149", "data": "\"{\\\"server\\\": \\\"young\\\", \\\"nonce\\\": \\\"nation senior HfnkvsDy 0LXiOcTe newspaper\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.59", "src_port": "50538", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977397, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 121\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50540", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977498, "host_ip": "10.188.40.56", "data_len": "187", "data": "\"{\\\"server\\\": \\\"GqCisVhL main success executive\\\", \\\"nonce\\\": \\\"push 37883314 ByFUtHZW begin\\\", \\\"realm\\\": \\\"CbYAwYrG\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50540", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977500, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 141\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.14", "dest_ip": "10.244.0.1", "src_port": "50542", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977500, "host_ip": "10.188.40.56", "data_len": "207", "data": "\"{\\\"server\\\": \\\"LZSUvbEu piece WHdkHh1x measure 08092646 nor\\\", \\\"nonce\\\": \\\"center 46387746 NlX0D0iO strategy\\\", \\\"accountid\\\": -463046190}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.20.16.248", "src_port": "50542", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977704, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 91\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "50544", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977704, "host_ip": "10.188.40.56", "data_len": "157", "data": "\"{\\\"server\\\": \\\"17854423 choose eXPLAMqj iIz8Vqm9 sit figure\\\", \\\"accountid\\\": -213572943}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.15", "dest_ip": "10.20.16.248", "src_port": "50544", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977808, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 61\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.10", "src_port": "50546", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977808, "host_ip": "10.188.40.56", "data_len": "127", "data": "\"{\\\"server\\\": \\\"personal ready\\\", \\\"accountid\\\": -130289863}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50546", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977811, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 77\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50548", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380977812, "host_ip": "10.188.40.56", "data_len": "143", "data": "\"{\\\"server\\\": \\\"indicate 68458455 QVvyUvDu they\\\", \\\"accountid\\\": 616616623}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50548", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380978015, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 71\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.20", "src_port": "50550", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380978015, "host_ip": "10.188.40.56", "data_len": "137", "data": "\"{\\\"server\\\": \\\"price vFupPWGq 60040395\\\", \\\"pinTimeout\\\": -314732225}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50550", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380978119, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 57\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.25", "src_port": "50552", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380978120, "host_ip": "10.188.40.56", "data_len": "123", "data": "\"{\\\"server\\\": \\\"let dYxYrcN5 51312576 season jOYLbezZ\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.57", "src_port": "50552", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380978121, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 57\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.20.16.248", "src_port": "50554", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380978122, "host_ip": "10.188.40.56", "data_len": "123", "data": "\"{\\\"servername\\\": \\\"mLmKKArt so\\\", \\\"owner\\\": 797977477}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "50554", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380978324, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 305\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.54", "dest_ip": "10.20.16.248", "src_port": "50556", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380978324, "host_ip": "10.188.40.56", "data_len": "371", "data": "\"{\\\"language\\\": \\\"daughter some YSNPaUIt 22195699 yeah wX6b8Az9\\\", \\\"altLanguages\\\": \\\"TV MtkKkMUH\\\", \\\"motherTongue\\\": \\\"twYKyvQc dinner civil\\\", \\\"enabledRules\\\": \\\"rmFnfgZO CXz6nKWx 99579095\\\", \\\"disabledRules\\\": \\\"protect 8UlhQ9gk\\\", \\\"disabledCategories\\\": \\\"late glass 9Zv0B5Zt TjtLTpGJ 07764036\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.61", "dest_ip": "10.244.0.47", "src_port": "50556", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380978325, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.18", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "50556", "flags": "24", "is_pii": false} -{"timestamp": 1616380978326, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 27\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "50558", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380978426, "host_ip": "10.188.40.56", "data_len": "93", "data": "\"{\\\"show_id\\\": -248847580}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.17", "src_port": "50558", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380978429, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 26\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.28", "src_port": "50560", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380978430, "host_ip": "10.188.40.56", "data_len": "92", "data": "\"{\\\"show_id\\\": 715793826}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.29", "src_port": "50560", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380978634, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 27\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "50562", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380978634, "host_ip": "10.188.40.56", "data_len": "93", "data": "\"{\\\"show_id\\\": -135703312}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.13", "src_port": "50562", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380978738, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 23\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50564", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380978739, "host_ip": "10.188.40.56", "data_len": "89", "data": "\"{\\\"embed\\\": \\\"show\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "50564", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380978741, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 31\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.53", "dest_ip": "10.244.0.61", "src_port": "50566", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380978741, "host_ip": "10.188.40.56", "data_len": "97", "data": "\"{\\\"episode_id\\\": -1070089037}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.18", "dest_ip": "10.244.0.1", "src_port": "50566", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380978943, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 30\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "50568", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380978943, "host_ip": "10.188.40.56", "data_len": "96", "data": "\"{\\\"episode_id\\\": -985841070}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.26", "src_port": "50568", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380979047, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 30\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "50570", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380979048, "host_ip": "10.188.40.56", "data_len": "96", "data": "\"{\\\"episode_id\\\": -573323491}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.16", "src_port": "50570", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380979050, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 51\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.15", "src_port": "50572", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380979151, "host_ip": "10.188.40.56", "data_len": "117", "data": "\"{\\\"tag_id\\\": -115463592, \\\"show_id\\\": -976351455}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.34", "src_port": "50572", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380979152, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 51\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "50574", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380979153, "host_ip": "10.188.40.56", "data_len": "117", "data": "\"{\\\"tag_id\\\": -1022368672, \\\"show_id\\\": 544364675}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50574", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380979155, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 46\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.47", "dest_ip": "10.244.0.1", "src_port": "50576", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380979254, "host_ip": "10.188.40.56", "data_len": "112", "data": "\"{\\\"tag_id\\\": 672598223, \\\"embed\\\": \\\"show\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50576", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380979257, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 27\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.34", "dest_ip": "10.244.0.50", "src_port": "50578", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380979258, "host_ip": "10.188.40.56", "data_len": "93", "data": "\"{\\\"tag_id\\\": -1073090125}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.37", "src_port": "50578", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380979463, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 25\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.20", "dest_ip": "10.20.16.248", "src_port": "50580", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380979464, "host_ip": "10.188.40.56", "data_len": "91", "data": "\"{\\\"tag_id\\\": 590917207}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50580", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380979566, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 33\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.43", "src_port": "50582", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380979567, "host_ip": "10.188.40.56", "data_len": "99", "data": "\"{\\\"webchannel_id\\\": -819514169}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.244.0.52", "src_port": "50582", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380979773, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 33\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.36", "src_port": "50584", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380979773, "host_ip": "10.188.40.56", "data_len": "99", "data": "\"{\\\"webchannel_id\\\": -192059935}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.20.16.248", "src_port": "50584", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380979877, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 32\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.18", "src_port": "50586", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380979878, "host_ip": "10.188.40.56", "data_len": "98", "data": "\"{\\\"webchannel_id\\\": -85860374}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "50586", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380979879, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 26\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "50588", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380979880, "host_ip": "10.188.40.56", "data_len": "92", "data": "\"{\\\"show_id\\\": 866065086}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.10", "src_port": "50588", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380980082, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 26\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.25", "dest_ip": "10.20.16.248", "src_port": "50590", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380980082, "host_ip": "10.188.40.56", "data_len": "92", "data": "\"{\\\"show_id\\\": 970096431}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "50590", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380980288, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 27\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50592", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380980288, "host_ip": "10.188.40.56", "data_len": "93", "data": "\"{\\\"show_id\\\": -460164162}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.52", "src_port": "50592", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380980291, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 23\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "50594", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380980391, "host_ip": "10.188.40.56", "data_len": "89", "data": "\"{\\\"embed\\\": \\\"show\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.24", "dest_ip": "10.20.16.248", "src_port": "50594", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380980394, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 28\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "50596", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380980395, "host_ip": "10.188.40.56", "data_len": "94", "data": "\"{\\\"person_id\\\": 960257580}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.19", "dest_ip": "10.244.0.1", "src_port": "50596", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380980599, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 28\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.14", "dest_ip": "10.244.0.1", "src_port": "50598", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380980599, "host_ip": "10.188.40.56", "data_len": "94", "data": "\"{\\\"person_id\\\": 980476478}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50598", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380980601, "host_ip": "10.188.40.56", "data_len": "94", "data": "\"{\\\"person_id\\\": 980476478}\"", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "50598", "flags": "24", "is_pii": false} -{"timestamp": 1616380980603, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 29\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "50600", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380980702, "host_ip": "10.188.40.56", "data_len": "95", "data": "\"{\\\"person_id\\\": 1035551302}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.22", "dest_ip": "10.244.0.48", "src_port": "50600", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380980705, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 30\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.47", "dest_ip": "10.244.0.61", "src_port": "50602", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380980706, "host_ip": "10.188.40.56", "data_len": "96", "data": "\"{\\\"network_id\\\": -769147327}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "50602", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380980910, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 30\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "50604", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380980910, "host_ip": "10.188.40.56", "data_len": "96", "data": "\"{\\\"network_id\\\": -958012436}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.10", "src_port": "50604", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380980914, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 30\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.44", "src_port": "50606", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981013, "host_ip": "10.188.40.56", "data_len": "96", "data": "\"{\\\"network_id\\\": 1043772372}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.33", "src_port": "50606", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981016, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 26\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "50608", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981017, "host_ip": "10.188.40.56", "data_len": "92", "data": "\"{\\\"embed\\\": \\\"network\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.15", "dest_ip": "10.244.0.1", "src_port": "50608", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981119, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 30\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.6", "dest_ip": "10.20.16.248", "src_port": "50610", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981119, "host_ip": "10.188.40.56", "data_len": "96", "data": "\"{\\\"episode_id\\\": -885346381}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.23", "dest_ip": "10.20.16.248", "src_port": "50610", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981122, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 29\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.30", "dest_ip": "10.244.0.57", "src_port": "50612", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981223, "host_ip": "10.188.40.56", "data_len": "95", "data": "\"{\\\"episode_id\\\": 473850422}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "50612", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981226, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 30\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.41", "src_port": "50614", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981227, "host_ip": "10.188.40.56", "data_len": "96", "data": "\"{\\\"episode_id\\\": -916518774}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50614", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981329, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 25\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50616", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981330, "host_ip": "10.188.40.56", "data_len": "91", "data": "\"{\\\"specType\\\": \\\"ANY\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.33", "dest_ip": "10.244.0.1", "src_port": "50616", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981332, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 71\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "50618", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981332, "host_ip": "10.188.40.56", "data_len": "137", "data": "\"{\\\"isPrivate\\\": true, \\\"version\\\": \\\"simple 73432965 next xYtX98HR\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.58", "src_port": "50618", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981534, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 31\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.41", "dest_ip": "10.20.16.248", "src_port": "50620", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981534, "host_ip": "10.188.40.56", "data_len": "97", "data": "\"{\\\"id\\\": 1672742268734787366}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.52", "src_port": "50620", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981638, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 98\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.20.16.248", "src_port": "50622", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981638, "host_ip": "10.188.40.56", "data_len": "164", "data": "\"{\\\"id\\\": 1267197026811748818, \\\"displayMethod\\\": \\\"seat 98999921 wife while zlKGsYjY febpSQOF\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "50622", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981641, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 31\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "50624", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981642, "host_ip": "10.188.40.56", "data_len": "97", "data": "\"{\\\"id\\\": 1419037971066231503}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.31", "src_port": "50624", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981845, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 53\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.41", "dest_ip": "10.20.16.248", "src_port": "50626", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981846, "host_ip": "10.188.40.56", "data_len": "119", "data": "\"{\\\"id\\\": -2518545345218489645, \\\"max\\\": -270714589}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.38", "src_port": "50626", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981948, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 31\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.31", "dest_ip": "10.244.0.1", "src_port": "50628", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981948, "host_ip": "10.188.40.56", "data_len": "97", "data": "\"{\\\"id\\\": -717395282214833709}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50628", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981952, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 182\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.26", "dest_ip": "10.20.16.248", "src_port": "50630", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380981952, "host_ip": "10.188.40.56", "data_len": "248", "data": "\"{\\\"name\\\": \\\"9n2njq7l entire remember dklCfllS short\\\", \\\"mediaId\\\": 3256988467198488110, \\\"typeId\\\": 1848191599023398584, \\\"typeName\\\": \\\"QIiHPnqV teach jkmakffu 48729606 movie\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50630", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380982154, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 84\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50632", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380982154, "host_ip": "10.188.40.56", "data_len": "150", "data": "\"{\\\"id\\\": -2719418369181386147, \\\"displayMethod\\\": \\\"sort KZFbCbr0 21690416 them\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50632", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380982258, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 31\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.35", "src_port": "50634", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380982258, "host_ip": "10.188.40.56", "data_len": "97", "data": "\"{\\\"id\\\": 3878812611171215091}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.3", "src_port": "50634", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380982261, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 26\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.18", "src_port": "50636", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380982262, "host_ip": "10.188.40.56", "data_len": "92", "data": "\"{\\\"offset\\\": -596339175}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "50636", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380982464, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 29\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.42", "dest_ip": "10.20.16.248", "src_port": "50638", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380982464, "host_ip": "10.188.40.56", "data_len": "95", "data": "\"{\\\"id\\\": 24689903092673030}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.47", "dest_ip": "10.244.0.61", "src_port": "50638", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380982568, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 32\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.18", "src_port": "50640", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380982568, "host_ip": "10.188.40.56", "data_len": "98", "data": "\"{\\\"id\\\": -3142492231604042861}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.20", "dest_ip": "10.20.16.248", "src_port": "50640", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380982570, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 125\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "50642", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380982571, "host_ip": "10.188.40.56", "data_len": "191", "data": "\"{\\\"id\\\": 4064480933387532740, \\\"stripScripts\\\": true, \\\"imageMargin\\\": \\\"DTdUohNB wDxmq52O show natural popular 48714960\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50642", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380982773, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 55\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "50644", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380982773, "host_ip": "10.188.40.56", "data_len": "121", "data": "\"{\\\"id\\\": -3570096286156978995, \\\"offset\\\": 294740301}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.41", "dest_ip": "10.244.0.1", "src_port": "50644", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380982877, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 31\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.36", "dest_ip": "10.20.16.248", "src_port": "50646", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380982877, "host_ip": "10.188.40.56", "data_len": "97", "data": "\"{\\\"id\\\": 3546205908407932443}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.61", "dest_ip": "10.20.16.248", "src_port": "50646", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380982879, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 32\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.12", "src_port": "50648", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380982980, "host_ip": "10.188.40.56", "data_len": "98", "data": "\"{\\\"id\\\": -2252843690123177141}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "50648", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380982983, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 168\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.3", "src_port": "50650", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380982984, "host_ip": "10.188.40.56", "data_len": "234", "data": "\"{\\\"id\\\": 2870105835033630983, \\\"flavor\\\": \\\"VAhicYpR 02678587 vTTZDvXS right\\\", \\\"width\\\": 813875931, \\\"excludeJquery\\\": true, \\\"displayMethod\\\": \\\"become dD6hUjbh\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.32", "src_port": "50650", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983188, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 32\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50652", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983188, "host_ip": "10.188.40.56", "data_len": "98", "data": "\"{\\\"id\\\": -3825144377074533413}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.52", "src_port": "50652", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983292, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 32\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50654", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983293, "host_ip": "10.188.40.56", "data_len": "98", "data": "\"{\\\"id\\\": -2477231214387068879}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50654", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983294, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 65\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.38", "dest_ip": "10.244.0.1", "src_port": "50656", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983295, "host_ip": "10.188.40.56", "data_len": "131", "data": "\"{\\\"q\\\": \\\"who fish 04104180 xGUw3ZNX\\\", \\\"offset\\\": -330507079}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50656", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983497, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 21\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "50658", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983497, "host_ip": "10.188.40.56", "data_len": "87", "data": "\"{\\\"max\\\": 76496970}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.34", "dest_ip": "10.244.0.57", "src_port": "50658", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983601, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 35\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.59", "src_port": "50660", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983602, "host_ip": "10.188.40.56", "data_len": "101", "data": "\"{\\\"offset\\\": 2098393409527027289}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50660", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983604, "host_ip": "10.188.40.56", "data_len": "311", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 1504\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50662", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983604, "host_ip": "10.188.40.56", "data_len": "1514", "data": "\"{\\\"offset\\\": 664774949, \\\"sort\\\": \\\"52923352 technology uWnENZaC among walk\\\", \\\"order\\\": \\\"care dTpLYaUh fh6ZqWHO sing\\\", \\\"nameContains\\\": \\\"success eHOXU3G4 47425570 than increase\\\", \\\"descriptionContains\\\": \\\"ISNlvKFS senior early xQdDaqKg 91156211 modern\\\", \\\"sourceUrl\\\": \\\"65569213 begin ground ZCrgdAXD again\\\", \\\"customThumbnailUrl\\\": \\\"JAonoOjp 20287082 movement mean UOJ19EUS win\\\", \\\"customThumbnailUrlContains\\\": \\\"qPkQYeoC join rmx4nVEf\\\", \\\"dateContentAuthored\\\": \\\"1974-11-24\\\", \\\"dateContentUpdated\\\": \\\"2009-03-01\\\", \\\"dateSyndicationCaptured\\\": \\\"1983-11-18\\\", \\\"dateSyndicationUpdated\\\": \\\"1992-01-04\\\", \\\"contentAuthoredSinceDate\\\": \\\"2022-01-18\\\", \\\"contentAuthoredInRange\\\": \\\"mtkWqo2p item fear vHXxBCwM\\\", \\\"contentUpdatedSinceDate\\\": \\\"2037-11-25\\\", \\\"contentReviewedBeforeDate\\\": \\\"1978-02-27\\\", \\\"contentReviewedInRange\\\": \\\"newspaper 31525291 leave msUddfPG mXIU1wzr century\\\", \\\"syndicationCapturedSinceDate\\\": \\\"1980-08-16\\\", \\\"syndicationCapturedBeforeDate\\\": \\\"2007-02-18\\\", \\\"syndicationUpdatedSinceDate\\\": \\\"2027-08-30\\\", \\\"syndicationUpdatedInRange\\\": \\\"4xyQhZ0k 35197175 worry ability QxQSthFw small\\\", \\\"syndicationVisibleInRange\\\": \\\"YdKnYRdK\\\", \\\"languageId\\\": -3663943676493643205, \\\"languageName\\\": \\\"62979176 ok Q398Ey4E\\\", \\\"sourceName\\\": \\\"magazine 00979514 NwiwxMIE pdcOMHkh house throughout\\\", \\\"sourceAcronym\\\": \\\"degree\\\", \\\"sourceAcronymContains\\\": \\\"side interesting 13142102 gslUQmcy choice 2CjV", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "50662", "dest_port": "80", "flags": "16", "is_pii": false} -{"timestamp": 1616380983605, "host_ip": "10.188.40.56", "data_len": "122", "data": "nMln\\\", \\\"tagIds\\\": \\\"hope community 9y8mDtUd mother\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.15", "src_port": "50662", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983606, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "80", "dest_port": "50662", "flags": "24", "is_pii": false} -{"timestamp": 1616380983709, "host_ip": "10.188.40.56", "data_len": "311", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 1330\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.33", "dest_ip": "10.244.0.1", "src_port": "50664", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983710, "host_ip": "10.188.40.56", "data_len": "1396", "data": "\"{\\\"offset\\\": 595531657, \\\"order\\\": \\\"force think\\\", \\\"name\\\": \\\"KFSREZGk 36508481 aAXSdowq seem finish stay\\\", \\\"nameContains\\\": \\\"security he wLozsPFr\\\", \\\"descriptionContains\\\": \\\"home nYjZrKOB significant 65503585 ever\\\", \\\"sourceUrl\\\": \\\"slleGwcp 75616799 sometimes 4FKjw6S6\\\", \\\"sourceUrlContains\\\": \\\"right garden during 99956171\\\", \\\"customThumbnailUrl\\\": \\\"bed jROYonqu e18UKhK3 education 37225460 alone\\\", \\\"customThumbnailUrlContains\\\": \\\"detail\\\", \\\"dateContentUpdated\\\": \\\"2009-06-05\\\", \\\"dateContentReviewed\\\": \\\"1982-11-23\\\", \\\"dateSyndicationCaptured\\\": \\\"1984-07-13\\\", \\\"dateSyndicationUpdated\\\": \\\"1996-03-12\\\", \\\"contentAuthoredSinceDate\\\": \\\"1978-11-13\\\", \\\"contentUpdatedBeforeDate\\\": \\\"2010-08-08\\\", \\\"contentPublishedSinceDate\\\": \\\"2017-11-26\\\", \\\"syndicationCapturedSinceDate\\\": \\\"2024-02-01\\\", \\\"syndicationCapturedInRange\\\": \\\"tree 72Ok9Hy1 station\\\", \\\"syndicationUpdatedBeforeDate\\\": \\\"1973-01-12\\\", \\\"syndicationVisibleSinceDate\\\": \\\"2036-06-21\\\", \\\"syndicationVisibleInRange\\\": \\\"23124042 own LdJIYqAz\\\", \\\"languageName\\\": \\\"WCPRGPZs ZGos0Hr9 find east where 87558588\\\", \\\"hash\\\": \\\"zQcmzDPw scientist yyUcN4nb leg\\\", \\\"sourceName\\\": \\\"teach forget right L5BdaaVw 07957144\\\", \\\"sourceNameContains\\\": \\\"coach 3QGg3ImJ\\\", \\\"restrictToSet\\\": \\\"23984509 do lqqIJR2M\\\", \\\"Shareholder\\\": \\\"James Mosley\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.18", "src_port": "50664", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983711, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.47", "src_port": "80", "dest_port": "50664", "flags": "24", "is_pii": false} -{"timestamp": 1616380983713, "host_ip": "10.188.40.56", "data_len": "311", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 1555\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.32", "dest_ip": "10.244.0.1", "src_port": "50666", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983713, "host_ip": "10.188.40.56", "data_len": "1514", "data": "\"{\\\"max\\\": -805027538, \\\"mediaTypes\\\": \\\"xHoP2kZj sometimes condition information 54028280\\\", \\\"collectionId\\\": -929315000, \\\"nameContains\\\": \\\"create\\\", \\\"descriptionContains\\\": \\\"13055021 mmwSrGIe threat\\\", \\\"sourceUrlContains\\\": \\\"xVFDkG0n shAAcrUY sound\\\", \\\"customThumbnailUrl\\\": \\\"GnFYuyHU 36799648\\\", \\\"customThumbnailUrlContains\\\": \\\"true 17348543 other ERqOvxSl Xezcbrrx watch\\\", \\\"dateContentUpdated\\\": \\\"1971-01-13\\\", \\\"dateContentPublished\\\": \\\"2012-10-02\\\", \\\"dateContentReviewed\\\": \\\"1982-10-13\\\", \\\"dateSyndicationUpdated\\\": \\\"2009-04-21\\\", \\\"contentAuthoredBeforeDate\\\": \\\"2025-07-26\\\", \\\"contentUpdatedSinceDate\\\": \\\"1996-06-09\\\", \\\"contentPublishedSinceDate\\\": \\\"2000-11-23\\\", \\\"contentReviewedSinceDate\\\": \\\"1978-12-04\\\", \\\"contentReviewedInRange\\\": \\\"receive item a79bSzfx KWrmYIjm myself\\\", \\\"syndicationCapturedBeforeDate\\\": \\\"2016-02-29\\\", \\\"syndicationCapturedInRange\\\": \\\"able 21495471 very\\\", \\\"syndicationUpdatedBeforeDate\\\": \\\"2021-07-13\\\", \\\"syndicationVisibleSinceDate\\\": \\\"2014-07-24\\\", \\\"syndicationVisibleBeforeDate\\\": \\\"1996-09-30\\\", \\\"languageName\\\": \\\"lot iOqDxkwT energy KDpnybEB 54080806\\\", \\\"languageIsoCode\\\": \\\"traditional scientist another FtieT7W5 08929315 HpaoxFtc\\\", \\\"hashContains\\\": \\\"QpwsXGGP\\\", \\\"sourceId\\\": 1273508498258448724, \\\"sourceAcronym\\\": \\\"would splowPLo drug major 61477261 Yn7VOo82\\\", \\\"sourceAcronymContains\\\": \\\"jHy881RI red father 67317887 uKWmngtT white\\\", \\\"tagIds\\\": \\\"firm 539072", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "50666", "dest_port": "80", "flags": "16", "is_pii": false} -{"timestamp": 1616380983713, "host_ip": "10.188.40.56", "data_len": "173", "data": "32 yUkfAqXd produce\\\", \\\"createdBy\\\": \\\"stage 77611132 inside eG8EGzNY\\\", \\\"RecordLocator\\\": \\\"QCTYMESY\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "50666", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983715, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.17", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "50666", "flags": "24", "is_pii": false} -{"timestamp": 1616380983813, "host_ip": "10.188.40.56", "data_len": "311", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 1382\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50668", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983813, "host_ip": "10.188.40.56", "data_len": "1448", "data": "\"{\\\"max\\\": 24679751, \\\"offset\\\": -1038948645, \\\"mediaTypes\\\": \\\"tell\\\", \\\"name\\\": \\\"oXjHUpmc\\\", \\\"collectionId\\\": -133111533, \\\"customThumbnailUrl\\\": \\\"DnLDlejz qPJAPVz3 sport rich in\\\", \\\"customThumbnailUrlContains\\\": \\\"SIIfFPke success official\\\", \\\"dateContentUpdated\\\": \\\"1970-02-13\\\", \\\"dateContentReviewed\\\": \\\"2001-01-20\\\", \\\"dateSyndicationCaptured\\\": \\\"2018-12-27\\\", \\\"contentAuthoredBeforeDate\\\": \\\"1997-12-20\\\", \\\"contentPublishedBeforeDate\\\": \\\"2023-09-02\\\", \\\"contentPublishedInRange\\\": \\\"Sc7UttVX rPtRzTAO foot half\\\", \\\"contentReviewedSinceDate\\\": \\\"1979-02-14\\\", \\\"contentReviewedInRange\\\": \\\"suffer\\\", \\\"syndicationCapturedSinceDate\\\": \\\"2033-04-12\\\", \\\"syndicationCapturedInRange\\\": \\\"bUeMCswR 61932146 8d9FRoHy\\\", \\\"syndicationUpdatedBeforeDate\\\": \\\"2008-09-06\\\", \\\"syndicationUpdatedInRange\\\": \\\"better 39853700 at bank AxitfKBe JEB4FCzT\\\", \\\"syndicationVisibleSinceDate\\\": \\\"1973-04-17\\\", \\\"syndicationVisibleInRange\\\": \\\"wife method TjbUzBDu GQIIM1dI back\\\", \\\"languageIsoCode\\\": \\\"say xNOWkrOY\\\", \\\"hashContains\\\": \\\"image fykhxyzp drug\\\", \\\"sourceName\\\": \\\"behind 63776312 9Z6d0TMd uRYRfnOK nation concern\\\", \\\"sourceNameContains\\\": \\\"67347533 war xvopfZQz myself G9oRvGOz\\\", \\\"tagIds\\\": \\\"involve UCHQ7rPm\\\", \\\"restrictToSet\\\": \\\"light ks8Ku5cn dmYTRool education\\\", \\\"createdBy\\\": \\\"less WYOFNKBa home win sBdNiQKo 72363758\\\", \\\"Latitude\\\": \\\"20.781010\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.24", "src_port": "50668", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983814, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "80", "dest_port": "50668", "flags": "24", "is_pii": false} -{"timestamp": 1616380983816, "host_ip": "10.188.40.56", "data_len": "311", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 1440\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50670", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983816, "host_ip": "10.188.40.56", "data_len": "1506", "data": "\"{\\\"offset\\\": -590570148, \\\"sort\\\": \\\"Qjqfr72V draw think oPdytoPr\\\", \\\"name\\\": \\\"thousand 00105723 xchiXvCy him yeah 4fScAxAr\\\", \\\"descriptionContains\\\": \\\"CoKD4grY medical 97167720 consider whether\\\", \\\"sourceUrl\\\": \\\"public only 36238557 IPSewSWa\\\", \\\"sourceUrlContains\\\": \\\"still fight her\\\", \\\"dateContentAuthored\\\": \\\"1999-02-11\\\", \\\"dateContentUpdated\\\": \\\"1989-02-02\\\", \\\"dateContentReviewed\\\": \\\"2019-02-17\\\", \\\"dateSyndicationCaptured\\\": \\\"2020-04-14\\\", \\\"dateSyndicationUpdated\\\": \\\"2004-02-03\\\", \\\"contentAuthoredSinceDate\\\": \\\"1995-06-21\\\", \\\"contentAuthoredBeforeDate\\\": \\\"2037-06-07\\\", \\\"contentAuthoredInRange\\\": \\\"cyC4b2rv NyWUZHIH 66617423 matter\\\", \\\"contentUpdatedSinceDate\\\": \\\"2036-06-09\\\", \\\"contentUpdatedBeforeDate\\\": \\\"1971-12-25\\\", \\\"contentUpdatedInRange\\\": \\\"speech that NIrkRltv during XJymXpZa 27221501\\\", \\\"contentPublishedBeforeDate\\\": \\\"2024-07-12\\\", \\\"contentReviewedSinceDate\\\": \\\"1986-07-03\\\", \\\"syndicationUpdatedBeforeDate\\\": \\\"1983-05-15\\\", \\\"syndicationVisibleSinceDate\\\": \\\"2028-02-04\\\", \\\"syndicationVisibleBeforeDate\\\": \\\"1991-06-22\\\", \\\"languageId\\\": 1337992301786042673, \\\"hash\\\": \\\"69090425\\\", \\\"hashContains\\\": \\\"mUPzUMzX serve tABJDAf4 74701962 every speak\\\", \\\"sourceName\\\": \\\"SvqWm9V8 interview\\\", \\\"sourceAcronym\\\": \\\"try risk\\\", \\\"sourceAcronymContains\\\": \\\"memory\\\", \\\"tagIds\\\": \\\"wear behind lgIeu1op 21883761\\\", \\\"restrictToSet\\\": \\\"medical jHK61i4Q\\\", \\\"passport\\\": \\\"856-34-7905\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.40", "dest_ip": "10.244.0.57", "src_port": "50670", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983917, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "50670", "flags": "24", "is_pii": false} -{"timestamp": 1616380983918, "host_ip": "10.188.40.56", "data_len": "311", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 1400\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.31", "dest_ip": "10.20.16.248", "src_port": "50672", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983918, "host_ip": "10.188.40.56", "data_len": "1466", "data": "\"{\\\"nameContains\\\": \\\"agreement uZTMwOVU\\\", \\\"sourceUrl\\\": \\\"require rlrjwJqe stock L43BXqpV event 99793526\\\", \\\"customThumbnailUrl\\\": \\\"RGltugjJ\\\", \\\"customThumbnailUrlContains\\\": \\\"middle M5rFWAU5 62565586\\\", \\\"dateContentAuthored\\\": \\\"1982-04-25\\\", \\\"dateContentUpdated\\\": \\\"2006-03-17\\\", \\\"dateSyndicationCaptured\\\": \\\"1970-12-11\\\", \\\"dateSyndicationUpdated\\\": \\\"2004-07-19\\\", \\\"contentAuthoredBeforeDate\\\": \\\"1988-11-08\\\", \\\"contentAuthoredInRange\\\": \\\"everyone VqCtX97U ksiLprvV bill\\\", \\\"contentUpdatedBeforeDate\\\": \\\"2017-10-17\\\", \\\"contentUpdatedInRange\\\": \\\"36142436 not MrOuQiSR CCclIpqu glass second\\\", \\\"contentPublishedSinceDate\\\": \\\"2032-11-27\\\", \\\"contentPublishedBeforeDate\\\": \\\"1972-06-17\\\", \\\"contentPublishedInRange\\\": \\\"go srQs0NMp instead certainly 87327852 tSFUMJpq\\\", \\\"contentReviewedSinceDate\\\": \\\"2004-07-27\\\", \\\"contentReviewedBeforeDate\\\": \\\"1986-03-18\\\", \\\"syndicationCapturedBeforeDate\\\": \\\"1986-09-26\\\", \\\"syndicationCapturedInRange\\\": \\\"iDDvgOxH matter F1eUrwXq\\\", \\\"syndicationVisibleBeforeDate\\\": \\\"2022-01-16\\\", \\\"languageName\\\": \\\"check 99415858 eizBwUJF many shake\\\", \\\"hash\\\": \\\"least oNjtIMuQ early 28458645 name\\\", \\\"sourceId\\\": 3289613752773488239, \\\"sourceAcronymContains\\\": \\\"1Hzmis5m high less our eBdxOFOk 30549685\\\", \\\"tagIds\\\": \\\"08517726 ElD4EIsO collection agent\\\", \\\"restrictToSet\\\": \\\"12015018 training type\\\", \\\"documentNumber\\\": \\\"238-27-7320\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.44", "dest_ip": "10.20.16.248", "src_port": "50672", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983919, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "50672", "flags": "24", "is_pii": false} -{"timestamp": 1616380983921, "host_ip": "10.188.40.56", "data_len": "311", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 1184\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50674", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380983921, "host_ip": "10.188.40.56", "data_len": "1250", "data": "\"{\\\"max\\\": 134816448, \\\"sort\\\": \\\"professional\\\", \\\"collectionId\\\": -420592627, \\\"nameContains\\\": \\\"song VpQYqtai determine LbFjuUJh music\\\", \\\"sourceUrlContains\\\": \\\"AyWbADct role 89695533 should\\\", \\\"customThumbnailUrl\\\": \\\"D3dZFhWO bbWqMmQU\\\", \\\"dateContentAuthored\\\": \\\"1976-10-26\\\", \\\"dateContentPublished\\\": \\\"2008-05-03\\\", \\\"dateSyndicationUpdated\\\": \\\"2017-08-22\\\", \\\"contentUpdatedBeforeDate\\\": \\\"2010-10-24\\\", \\\"contentUpdatedInRange\\\": \\\"52XJRFq8 then recent tonight 78139866 ooDLLiiU\\\", \\\"contentReviewedInRange\\\": \\\"C084UqsQ\\\", \\\"syndicationCapturedSinceDate\\\": \\\"1999-11-24\\\", \\\"syndicationCapturedInRange\\\": \\\"such nearly\\\", \\\"syndicationUpdatedSinceDate\\\": \\\"2013-07-20\\\", \\\"syndicationUpdatedBeforeDate\\\": \\\"1984-05-11\\\", \\\"syndicationUpdatedInRange\\\": \\\"F1HYb5VK born UcvYCQsT 41947420\\\", \\\"syndicationVisibleSinceDate\\\": \\\"1986-06-05\\\", \\\"syndicationVisibleBeforeDate\\\": \\\"2025-08-14\\\", \\\"languageIsoCode\\\": \\\"SgWeWUXh 55650841 safe aLUVOc9i side\\\", \\\"hash\\\": \\\"whole fill RlYLpwNj\\\", \\\"hashContains\\\": \\\"mxDUsKlB\\\", \\\"sourceAcronym\\\": \\\"role WrySIXan speak\\\", \\\"sourceAcronymContains\\\": \\\"give wear\\\", \\\"restrictToSet\\\": \\\"present\\\", \\\"phoneCountryCode\\\": \\\"TG\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.61", "dest_ip": "10.244.0.1", "src_port": "50674", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984021, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.45", "src_port": "80", "dest_port": "50674", "flags": "24", "is_pii": false} -{"timestamp": 1616380984023, "host_ip": "10.188.40.56", "data_len": "311", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 1442\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.45", "src_port": "50676", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984023, "host_ip": "10.188.40.56", "data_len": "1508", "data": "\"{\\\"max\\\": 364620690, \\\"offset\\\": -66046079, \\\"name\\\": \\\"dog 29489209 u51meL9F for FfakwTqZ\\\", \\\"collectionId\\\": 382167577, \\\"descriptionContains\\\": \\\"GPeDWcwK ntWS6ZFQ seek matter\\\", \\\"sourceUrlContains\\\": \\\"NKahwpqg state\\\", \\\"customThumbnailUrl\\\": \\\"state 54256063 sCbrnLwe\\\", \\\"customThumbnailUrlContains\\\": \\\"D6hQvQV5 down right 28775509 just\\\", \\\"dateContentAuthored\\\": \\\"2003-11-28\\\", \\\"dateContentUpdated\\\": \\\"2009-02-23\\\", \\\"dateContentPublished\\\": \\\"1994-06-12\\\", \\\"dateContentReviewed\\\": \\\"2020-09-12\\\", \\\"dateSyndicationCaptured\\\": \\\"2010-05-08\\\", \\\"dateSyndicationUpdated\\\": \\\"2019-11-10\\\", \\\"contentAuthoredInRange\\\": \\\"base u89Yfnih chance small cOrKBOzk\\\", \\\"contentUpdatedInRange\\\": \\\"collection 77018700 pzBOxFWj\\\", \\\"contentPublishedBeforeDate\\\": \\\"2028-07-14\\\", \\\"contentPublishedInRange\\\": \\\"WvZiKEDz 06677857 detail\\\", \\\"contentReviewedInRange\\\": \\\"what seven 79380788 d7hs6SHk gdjVYYXx Mrs\\\", \\\"syndicationUpdatedBeforeDate\\\": \\\"2031-09-12\\\", \\\"syndicationUpdatedInRange\\\": \\\"npytLneF huge trade HY8YZXgu 27451175 really\\\", \\\"languageIsoCode\\\": \\\"eUdfKehY billion 7gv1ZUsH see\\\", \\\"hashContains\\\": \\\"66368517 V2zeJ1yn\\\", \\\"sourceId\\\": 3339834945337357587, \\\"sourceNameContains\\\": \\\"daggKshC\\\", \\\"sourceAcronym\\\": \\\"qphQqusm 91263470\\\", \\\"sourceAcronymContains\\\": \\\"trial religious 32967118 PikGfDyT KUWrUMas marriage\\\", \\\"tagIds\\\": \\\"citizen pukaaGes TWfqd9I1 96793971 still reflect\\\", \\\"recordLocator\\\": \\\"LUL2B6QW\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50676", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984024, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "50676", "flags": "24", "is_pii": false} -{"timestamp": 1616380984125, "host_ip": "10.188.40.56", "data_len": "311", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 1181\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.42", "dest_ip": "10.20.16.248", "src_port": "50678", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984125, "host_ip": "10.188.40.56", "data_len": "1247", "data": "\"{\\\"offset\\\": -685361806, \\\"sort\\\": \\\"only aAGch8ru 93427644 rock poor\\\", \\\"order\\\": \\\"zmwtqiCX JZMaZ4CV\\\", \\\"descriptionContains\\\": \\\"friend but 1wEilcf9 either\\\", \\\"sourceUrl\\\": \\\"16693819 raise ryR56kHd too\\\", \\\"dateContentUpdated\\\": \\\"2007-09-12\\\", \\\"dateContentReviewed\\\": \\\"1991-01-02\\\", \\\"contentAuthoredSinceDate\\\": \\\"1975-12-23\\\", \\\"contentUpdatedSinceDate\\\": \\\"1975-05-08\\\", \\\"contentUpdatedInRange\\\": \\\"senior sea JqmmvCGI 8sNHfkdO\\\", \\\"contentReviewedSinceDate\\\": \\\"2015-10-26\\\", \\\"contentReviewedInRange\\\": \\\"citizen play nddDeuqt\\\", \\\"syndicationVisibleSinceDate\\\": \\\"2002-08-09\\\", \\\"syndicationVisibleBeforeDate\\\": \\\"2014-07-06\\\", \\\"syndicationVisibleInRange\\\": \\\"vote without\\\", \\\"languageName\\\": \\\"lcmUIghs drug 03533751 edge floor\\\", \\\"languageIsoCode\\\": \\\"23052809 number gBYwRcIQ need UBpeEbPE\\\", \\\"hash\\\": \\\"89930294 but\\\", \\\"sourceId\\\": 1006302936069585554, \\\"sourceNameContains\\\": \\\"gJrx2vkP the okHekxmy 00747104 factor source\\\", \\\"sourceAcronym\\\": \\\"75505051\\\", \\\"tagIds\\\": \\\"qGKbRpAx aAQgfuNr pay 95598541 stay\\\", \\\"restrictToSet\\\": \\\"stand CIpZdlpR decide whose 68513465\\\", \\\"createdBy\\\": \\\"32897161 hyyRphJW true church still\\\", \\\"Lat\\\": \\\"16.017496\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.47", "dest_ip": "10.244.0.57", "src_port": "50678", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984126, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "50678", "flags": "24", "is_pii": false} -{"timestamp": 1616380984127, "host_ip": "10.188.40.56", "data_len": "311", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 1113\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.6", "dest_ip": "10.20.16.248", "src_port": "50680", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984128, "host_ip": "10.188.40.56", "data_len": "1179", "data": "\"{\\\"max\\\": -194597757, \\\"mediaTypes\\\": \\\"sense control Dw9CBv7i 59956330\\\", \\\"name\\\": \\\"store\\\", \\\"collectionId\\\": 951783124, \\\"descriptionContains\\\": \\\"wall if\\\", \\\"sourceUrl\\\": \\\"white special pay FHchvOlL\\\", \\\"customThumbnailUrl\\\": \\\"99898769 ok cost build\\\", \\\"customThumbnailUrlContains\\\": \\\"arm 10850682 respond\\\", \\\"dateContentAuthored\\\": \\\"1986-11-03\\\", \\\"dateContentPublished\\\": \\\"2010-03-01\\\", \\\"dateContentReviewed\\\": \\\"1999-10-16\\\", \\\"dateSyndicationCaptured\\\": \\\"1998-09-12\\\", \\\"dateSyndicationUpdated\\\": \\\"1971-04-29\\\", \\\"contentUpdatedSinceDate\\\": \\\"2013-04-02\\\", \\\"contentPublishedInRange\\\": \\\"peace tonight 2isVkVaR 89861887 range dbvKePYL\\\", \\\"contentReviewedInRange\\\": \\\"level h3sxmBTU\\\", \\\"syndicationCapturedInRange\\\": \\\"hUSJAxIG spend\\\", \\\"syndicationVisibleSinceDate\\\": \\\"2021-05-18\\\", \\\"languageId\\\": -4444772510956319336, \\\"languageIsoCode\\\": \\\"with waBFhmAX iFwFNIId president 59223446 field\\\", \\\"sourceId\\\": -4324967998927274338, \\\"sourceName\\\": \\\"FbLCGvmw coach ever its\\\", \\\"sourceNameContains\\\": \\\"IeajCOaj\\\", \\\"sourceAcronym\\\": \\\"voice if clear 09077559\\\", \\\"Building\\\": \\\"07951\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.58", "dest_ip": "10.20.16.248", "src_port": "50680", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984229, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "50680", "flags": "24", "is_pii": false} -{"timestamp": 1616380984231, "host_ip": "10.188.40.56", "data_len": "311", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 1232\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.20.16.248", "src_port": "50682", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984231, "host_ip": "10.188.40.56", "data_len": "1298", "data": "\"{\\\"max\\\": 196392365, \\\"offset\\\": -170419416, \\\"order\\\": \\\"south q57orFle picture KZyemcfM\\\", \\\"name\\\": \\\"different\\\", \\\"collectionId\\\": 148640577, \\\"sourceUrlContains\\\": \\\"event game 66858944 put BIvrSVQZ H486ECnf\\\", \\\"dateContentAuthored\\\": \\\"2019-07-13\\\", \\\"dateContentUpdated\\\": \\\"1999-02-08\\\", \\\"dateContentPublished\\\": \\\"1978-06-03\\\", \\\"dateContentReviewed\\\": \\\"1993-11-01\\\", \\\"contentAuthoredSinceDate\\\": \\\"1994-02-27\\\", \\\"contentAuthoredBeforeDate\\\": \\\"1978-09-26\\\", \\\"contentUpdatedBeforeDate\\\": \\\"2000-10-17\\\", \\\"contentPublishedSinceDate\\\": \\\"2036-11-12\\\", \\\"contentPublishedBeforeDate\\\": \\\"2005-02-28\\\", \\\"contentReviewedSinceDate\\\": \\\"2013-05-05\\\", \\\"contentReviewedBeforeDate\\\": \\\"2025-12-06\\\", \\\"syndicationCapturedSinceDate\\\": \\\"2001-10-12\\\", \\\"syndicationCapturedBeforeDate\\\": \\\"1996-02-25\\\", \\\"syndicationCapturedInRange\\\": \\\"30953679\\\", \\\"syndicationVisibleBeforeDate\\\": \\\"2024-10-05\\\", \\\"languageId\\\": -708270285864491715, \\\"languageIsoCode\\\": \\\"model zTmyhkkc fund 80651055 poor EfEYAXPO\\\", \\\"hash\\\": \\\"consider treatment dJDKJOqR way\\\", \\\"hashContains\\\": \\\"4CTlG5DO leg nGYTjuUT crime\\\", \\\"sourceName\\\": \\\"39137117 traditional end\\\", \\\"sourceAcronymContains\\\": \\\"LerTPERX\\\", \\\"ReservationCode\\\": \\\"WBMMFHGC\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "50682", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984232, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "80", "dest_port": "50682", "flags": "24", "is_pii": false} -{"timestamp": 1616380984233, "host_ip": "10.188.40.56", "data_len": "311", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 1642\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50684", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984233, "host_ip": "10.188.40.56", "data_len": "1514", "data": "\"{\\\"sort\\\": \\\"coach form\\\", \\\"order\\\": \\\"agency site\\\", \\\"name\\\": \\\"42046118 simple KtCquxKH kaAQOkKf\\\", \\\"collectionId\\\": 167091827, \\\"nameContains\\\": \\\"D9QAw9xM 41831388 hope qdngtXev\\\", \\\"descriptionContains\\\": \\\"71154782 whatever zGbworCy k4lGC7sH\\\", \\\"sourceUrl\\\": \\\"environmental gZkyibIK work 30768443 company LNIZXOLw\\\", \\\"sourceUrlContains\\\": \\\"GyIoDaqA if movie else 49435226 FtJ2czTS\\\", \\\"customThumbnailUrlContains\\\": \\\"GXsPTCOL south 31246089\\\", \\\"dateContentAuthored\\\": \\\"2005-06-07\\\", \\\"dateSyndicationCaptured\\\": \\\"2000-06-15\\\", \\\"contentAuthoredInRange\\\": \\\"debate ZMz4LqhN qCxpwlxx leg 96330649\\\", \\\"contentUpdatedSinceDate\\\": \\\"1977-08-11\\\", \\\"contentUpdatedInRange\\\": \\\"small 95250600 subject industry 5TdMHLOl\\\", \\\"contentPublishedSinceDate\\\": \\\"2034-11-11\\\", \\\"contentReviewedBeforeDate\\\": \\\"2011-09-16\\\", \\\"contentReviewedInRange\\\": \\\"admit list enjoy 78276741 QprrHhvr\\\", \\\"syndicationCapturedBeforeDate\\\": \\\"2025-02-22\\\", \\\"syndicationUpdatedSinceDate\\\": \\\"2007-09-12\\\", \\\"syndicationUpdatedBeforeDate\\\": \\\"2031-04-12\\\", \\\"syndicationUpdatedInRange\\\": \\\"85681310 BshoPrJD\\\", \\\"syndicationVisibleSinceDate\\\": \\\"1997-01-16\\\", \\\"syndicationVisibleBeforeDate\\\": \\\"1980-04-08\\\", \\\"languageId\\\": -1269357751380707788, \\\"languageIsoCode\\\": \\\"rule activity 21350285 yX6TxUpz WIbCseRw run\\\", \\\"hash\\\": \\\"ZZxojHqz according\\\", \\\"sourceName\\\": \\\"who\\\", \\\"sourceNameContains\\\": \\\"pyhoOqnN should interesting mMgwKunJ\\\", \\\"sourceAcronym", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "50684", "dest_port": "80", "flags": "16", "is_pii": false} -{"timestamp": 1616380984234, "host_ip": "10.188.40.56", "data_len": "260", "data": "\\\": \\\"break oB5QOLun vVXuWHkX 03283829 very\\\", \\\"sourceAcronymContains\\\": \\\"thousand mention\\\", \\\"createdBy\\\": \\\"officer KTZC8Yiu JePbiqvr structure 18084600 wonder\\\", \\\"firstname\\\": \\\"James\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.244.0.57", "src_port": "50684", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984333, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.44", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "50684", "flags": "24", "is_pii": false} -{"timestamp": 1616380984335, "host_ip": "10.188.40.56", "data_len": "311", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 1641\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.24", "src_port": "50686", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984335, "host_ip": "10.188.40.56", "data_len": "1514", "data": "\"{\\\"max\\\": -950859467, \\\"sort\\\": \\\"45345253 dKGlHlMW wind eye\\\", \\\"mediaTypes\\\": \\\"82104970 YxTs4UtB LHEfYjBN particularly as become\\\", \\\"name\\\": \\\"8XVjo4P6\\\", \\\"nameContains\\\": \\\"both HumoHUEY\\\", \\\"sourceUrl\\\": \\\"difficult aamEsBbH TNTaSUwv\\\", \\\"sourceUrlContains\\\": \\\"that treat cadZdysy arrive XlaTZvfO 40255351\\\", \\\"customThumbnailUrl\\\": \\\"themselves leader where 1yCkBCpF GaLlVeCa 88191839\\\", \\\"dateContentAuthored\\\": \\\"1997-01-28\\\", \\\"dateContentUpdated\\\": \\\"1977-06-27\\\", \\\"dateContentReviewed\\\": \\\"2000-09-11\\\", \\\"contentAuthoredSinceDate\\\": \\\"2020-06-02\\\", \\\"contentAuthoredBeforeDate\\\": \\\"2004-01-29\\\", \\\"contentUpdatedBeforeDate\\\": \\\"2000-08-11\\\", \\\"contentUpdatedInRange\\\": \\\"55089249 certain lot\\\", \\\"contentPublishedSinceDate\\\": \\\"2006-06-11\\\", \\\"contentPublishedBeforeDate\\\": \\\"1983-02-21\\\", \\\"contentPublishedInRange\\\": \\\"often 82394217 tend LOUwPPnS\\\", \\\"contentReviewedSinceDate\\\": \\\"2028-12-09\\\", \\\"syndicationCapturedBeforeDate\\\": \\\"1989-01-13\\\", \\\"syndicationCapturedInRange\\\": \\\"0OitAmKv bkeTerRx power\\\", \\\"syndicationUpdatedSinceDate\\\": \\\"1989-07-11\\\", \\\"syndicationUpdatedBeforeDate\\\": \\\"2007-04-26\\\", \\\"syndicationUpdatedInRange\\\": \\\"yet bpoNGWIR hour interview\\\", \\\"syndicationVisibleSinceDate\\\": \\\"2025-03-24\\\", \\\"syndicationVisibleBeforeDate\\\": \\\"1991-12-19\\\", \\\"languageId\\\": 4586298942965684665, \\\"languageIsoCode\\\": \\\"know MMfgOQQK DWzZhyXF population 82510344\\\", \\\"sourceName\\\": \\\"66775940\\\", \\\"sourceAcronym\\\": \\\"f", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.43", "dest_ip": "10.20.16.248", "src_port": "50686", "dest_port": "80", "flags": "16", "is_pii": false} -{"timestamp": 1616380984335, "host_ip": "10.188.40.56", "data_len": "259", "data": "uture\\\", \\\"sourceAcronymContains\\\": \\\"28635515 hear somebody Ntt7Wt53 down qAZqKnlZ\\\", \\\"restrictToSet\\\": \\\"card BE2umHVC although BgSBIfbi fish 97661504\\\", \\\"email\\\": \\\"gstewart@tucker.com\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.30", "src_port": "50686", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984336, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "80", "dest_port": "50686", "flags": "24", "is_pii": false} -{"timestamp": 1616380984338, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 31\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "50688", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984436, "host_ip": "10.188.40.56", "data_len": "97", "data": "\"{\\\"id\\\": 2401094714907344349}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "50688", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984439, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 107\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "50690", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984440, "host_ip": "10.188.40.56", "data_len": "173", "data": "\"{\\\"max\\\": -17361514, \\\"offset\\\": 432211896, \\\"sort\\\": \\\"heart others IYGWPSUU kPSdfPVw 63793862 wonder\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.25", "src_port": "50690", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984542, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 28\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.57", "src_port": "50692", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984543, "host_ip": "10.188.40.56", "data_len": "94", "data": "\"{\\\"id\\\": 7785191039403724}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "50692", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984544, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 74\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "50694", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984645, "host_ip": "10.188.40.56", "data_len": "140", "data": "\"{\\\"id\\\": 1680445043980500762, \\\"max\\\": 19910887, \\\"offset\\\": -605468332}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.20.16.248", "src_port": "50694", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984648, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 31\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.28", "dest_ip": "10.20.16.248", "src_port": "50696", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984649, "host_ip": "10.188.40.56", "data_len": "97", "data": "\"{\\\"id\\\": 4096852675679983790}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.31", "dest_ip": "10.20.16.248", "src_port": "50696", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984853, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 23\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "50698", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984854, "host_ip": "10.188.40.56", "data_len": "89", "data": "\"{\\\"max\\\": -263122430}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50698", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984855, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 27\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "50700", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380984955, "host_ip": "10.188.40.56", "data_len": "93", "data": "\"{\\\"q\\\": \\\"28516037 oil\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50700", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380985268, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 42\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.26", "dest_ip": "10.20.16.248", "src_port": "50702", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380985268, "host_ip": "10.188.40.56", "data_len": "108", "data": "\"{\\\"Content-Type\\\": \\\"application/json\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50702", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380985271, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 402\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50704", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380985272, "host_ip": "10.188.40.56", "data_len": "468", "data": "\"{\\\"nextCursor\\\": \\\"indeed list\\\", \\\"Content-Type\\\": \\\"application/xml\\\", \\\"Accept\\\": \\\"application/json\\\", \\\"WM_CONSUMER.CHANNEL.TYPE\\\": \\\"SWAGGER_CHANNEL_TYPE\\\", \\\"WM_CONSUMER.ID\\\": \\\"vvjmLHhz within\\\", \\\"WM_SEC.TIMESTAMP\\\": \\\"relate\\\", \\\"WM_SEC.AUTH_SIGNATURE\\\": \\\"12765006 plant respond dHIFPuCz\\\", \\\"WM_SVC.NAME\\\": \\\"always argue land jKKSpTSO 04728926\\\", \\\"WM_QOS.CORRELATION_ID\\\": \\\"32444642\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.23", "src_port": "50704", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380985373, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "50704", "flags": "24", "is_pii": false} -{"timestamp": 1616380985374, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 422\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.20.16.248", "src_port": "50706", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380985375, "host_ip": "10.188.40.56", "data_len": "488", "data": "\"{\\\"purchaseOrderId\\\": \\\"53567953\\\", \\\"Content-Type\\\": \\\"application/json\\\", \\\"Accept\\\": \\\"application/json\\\", \\\"WM_CONSUMER.CHANNEL.TYPE\\\": \\\"SWAGGER_CHANNEL_TYPE\\\", \\\"WM_CONSUMER.ID\\\": \\\"impact\\\", \\\"WM_SEC.TIMESTAMP\\\": \\\"son article 72572444 BaD2jkDT several\\\", \\\"WM_SEC.AUTH_SIGNATURE\\\": \\\"37871528 BixJoTsb lay IYwiDxpH success\\\", \\\"WM_SVC.NAME\\\": \\\"o2p1LX5B I uTGuJbaZ\\\", \\\"WM_QOS.CORRELATION_ID\\\": \\\"act yNuSKVWO\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.13", "dest_ip": "10.20.16.248", "src_port": "50706", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380985477, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.19", "src_port": "80", "dest_port": "50706", "flags": "24", "is_pii": false} -{"timestamp": 1616380985478, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 463\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50708", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380985478, "host_ip": "10.188.40.56", "data_len": "529", "data": "\"{\\\"purchaseOrderId\\\": \\\"fast choice shake\\\", \\\"shipNode\\\": \\\"would WyiZgWZW\\\", \\\"Content-Type\\\": \\\"application/xml\\\", \\\"Accept\\\": \\\"application/xml\\\", \\\"WM_CONSUMER.CHANNEL.TYPE\\\": \\\"SWAGGER_CHANNEL_TYPE\\\", \\\"WM_CONSUMER.ID\\\": \\\"9Z9SpcHP off 55410160 sell\\\", \\\"WM_SEC.TIMESTAMP\\\": \\\"56941281 air\\\", \\\"WM_SEC.AUTH_SIGNATURE\\\": \\\"dark 94481497 HoZTmowi\\\", \\\"WM_SVC.NAME\\\": \\\"six always behind wnQdrsxX\\\", \\\"WM_QOS.CORRELATION_ID\\\": \\\"nvDpDmzD American YFjFh4IB\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.32", "dest_ip": "10.20.16.248", "src_port": "50708", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380985581, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.3", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "50708", "flags": "24", "is_pii": false} -{"timestamp": 1616380985582, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 469\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50710", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380985582, "host_ip": "10.188.40.56", "data_len": "535", "data": "\"{\\\"purchaseOrderId\\\": \\\"investment\\\", \\\"shipNode\\\": \\\"ZuXEPHCQ young information AtnWRZbj\\\", \\\"Content-Type\\\": \\\"application/json\\\", \\\"Accept\\\": \\\"application/xml\\\", \\\"WM_CONSUMER.CHANNEL.TYPE\\\": \\\"SWAGGER_CHANNEL_TYPE\\\", \\\"WM_CONSUMER.ID\\\": \\\"everybody\\\", \\\"WM_SEC.TIMESTAMP\\\": \\\"QDSQfnxP\\\", \\\"WM_SEC.AUTH_SIGNATURE\\\": \\\"71226930 agency head evidence IcPaTRfy\\\", \\\"WM_SVC.NAME\\\": \\\"like uiuIVbIS 44441730 emxAcD1A military our\\\", \\\"WM_QOS.CORRELATION_ID\\\": \\\"must\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.58", "src_port": "50710", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380985583, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "50710", "flags": "24", "is_pii": false} -{"timestamp": 1616380985685, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 524\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.244.0.50", "src_port": "50712", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380985685, "host_ip": "10.188.40.56", "data_len": "590", "data": "\"{\\\"purchaseOrderId\\\": \\\"51851700 treat fall decide PNDxURmj\\\", \\\"shipNode\\\": \\\"73615716 Congress professor fNTCDIiZ oPCf3lYV early\\\", \\\"Content-Type\\\": \\\"application/xml\\\", \\\"Accept\\\": \\\"application/xml\\\", \\\"WM_CONSUMER.CHANNEL.TYPE\\\": \\\"SWAGGER_CHANNEL_TYPE\\\", \\\"WM_CONSUMER.ID\\\": \\\"95185837\\\", \\\"WM_SEC.TIMESTAMP\\\": \\\"store\\\", \\\"WM_SEC.AUTH_SIGNATURE\\\": \\\"rest project c7T9wAv2 if 20316597 SjtOGsJM\\\", \\\"WM_SVC.NAME\\\": \\\"forget 07385423 newspaper\\\", \\\"WM_QOS.CORRELATION_ID\\\": \\\"answer oHmmZm6w wall ymnzZgCZ 86161672\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.28", "dest_ip": "10.244.0.57", "src_port": "50712", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380985997, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.34", "src_port": "80", "dest_port": "50712", "flags": "24", "is_pii": false} -{"timestamp": 1616380985999, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 527\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "50714", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380985999, "host_ip": "10.188.40.56", "data_len": "593", "data": "\"{\\\"purchaseOrderId\\\": \\\"area n8p7rI3x when analysis QErCNIVo\\\", \\\"shipNode\\\": \\\"qYjCBado plant 22630635 V6ANihjw key pretty\\\", \\\"Content-Type\\\": \\\"application/xml\\\", \\\"Accept\\\": \\\"application/xml\\\", \\\"WM_CONSUMER.CHANNEL.TYPE\\\": \\\"SWAGGER_CHANNEL_TYPE\\\", \\\"WM_CONSUMER.ID\\\": \\\"operation 40651436 0bsSFf4Y IFxdzMAW\\\", \\\"WM_SEC.TIMESTAMP\\\": \\\"44262322 factor oZDReKP5 YNozoOJs whole movement\\\", \\\"WM_SEC.AUTH_SIGNATURE\\\": \\\"hair method vkbbqyoj\\\", \\\"WM_SVC.NAME\\\": \\\"mUUVIpUi Mr\\\", \\\"WM_QOS.CORRELATION_ID\\\": \\\"OYDvyDdI free\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50714", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986000, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.18", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "50714", "flags": "24", "is_pii": false} -{"timestamp": 1616380986002, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 466\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.58", "src_port": "50716", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986002, "host_ip": "10.188.40.56", "data_len": "532", "data": "\"{\\\"nextCursor\\\": \\\"its\\\", \\\"Content-Type\\\": \\\"application/json\\\", \\\"Accept\\\": \\\"application/xml\\\", \\\"WM_CONSUMER.CHANNEL.TYPE\\\": \\\"SWAGGER_CHANNEL_TYPE\\\", \\\"WM_CONSUMER.ID\\\": \\\"sport 42491461 ttgbDZYe force especially cJv7B3G7\\\", \\\"WM_SEC.TIMESTAMP\\\": \\\"PRlQZelC\\\", \\\"WM_SEC.AUTH_SIGNATURE\\\": \\\"pick according way 69322406 uHjJlJgR hFxcJJME\\\", \\\"WM_SVC.NAME\\\": \\\"11403012 cJRsomAM him\\\", \\\"WM_QOS.CORRELATION_ID\\\": \\\"candidate NaIRNLKO 89087639 bpXhOqTk medical\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "50716", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986101, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.57", "src_port": "80", "dest_port": "50716", "flags": "24", "is_pii": false} -{"timestamp": 1616380986102, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 458\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50718", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986102, "host_ip": "10.188.40.56", "data_len": "524", "data": "\"{\\\"shipNode\\\": \\\"father 15293958 million woman BxQwAOon\\\", \\\"createdStartDate\\\": \\\"different which 82080790 wpCUgVPf\\\", \\\"Content-Type\\\": \\\"application/json\\\", \\\"Accept\\\": \\\"application/json\\\", \\\"WM_CONSUMER.CHANNEL.TYPE\\\": \\\"SWAGGER_CHANNEL_TYPE\\\", \\\"WM_CONSUMER.ID\\\": \\\"64065693\\\", \\\"WM_SEC.TIMESTAMP\\\": \\\"month jaYPgEGc NYytmzhf\\\", \\\"WM_SEC.AUTH_SIGNATURE\\\": \\\"UFXySMzS\\\", \\\"WM_SVC.NAME\\\": \\\"44676995 laugh GETFdEg7\\\", \\\"WM_QOS.CORRELATION_ID\\\": \\\"it\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.33", "dest_ip": "10.244.0.1", "src_port": "50718", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986104, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "80", "dest_port": "50718", "flags": "24", "is_pii": false} -{"timestamp": 1616380986105, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 632\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "50720", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986105, "host_ip": "10.188.40.56", "data_len": "698", "data": "\"{\\\"purchaseOrderId\\\": \\\"83143230 tmiIJIKS buy\\\", \\\"createdStartDate\\\": \\\"modern building 37279784 h5vPFfGh\\\", \\\"createdEndDate\\\": \\\"68156145 lqugWuO0 hotel\\\", \\\"toExpectedShipDate\\\": \\\"p8RqDNfx nBYzPxVk general middle baby 16166377\\\", \\\"limit\\\": -726458200, \\\"Content-Type\\\": \\\"application/xml\\\", \\\"Accept\\\": \\\"application/json\\\", \\\"WM_CONSUMER.CHANNEL.TYPE\\\": \\\"SWAGGER_CHANNEL_TYPE\\\", \\\"WM_CONSUMER.ID\\\": \\\"81934329 indicate recent vqxrVQaL hope Cz8ibxjc\\\", \\\"WM_SEC.TIMESTAMP\\\": \\\"51632407\\\", \\\"WM_SEC.AUTH_SIGNATURE\\\": \\\"yYMqGvRN\\\", \\\"WM_SVC.NAME\\\": \\\"above 60059858 qxlWBToL amount\\\", \\\"WM_QOS.CORRELATION_ID\\\": \\\"uo75Xqxm\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.22", "dest_ip": "10.244.0.1", "src_port": "50720", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986106, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.3", "dest_ip": "10.244.0.1", "src_port": "80", "dest_port": "50720", "flags": "24", "is_pii": false} -{"timestamp": 1616380986205, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 465\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.39", "dest_ip": "10.244.0.1", "src_port": "50722", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986205, "host_ip": "10.188.40.56", "data_len": "531", "data": "\"{\\\"feedId\\\": \\\"FQmgVRgK off just 95100625 GbdyShEW\\\", \\\"includeDetails\\\": \\\"others vYEMIhyS 05123011 x45csCI1 prove join\\\", \\\"WM_CONSUMER.CHANNEL.TYPE\\\": \\\"SWAGGER_CHANNEL_TYPE\\\", \\\"WM_CONSUMER.ID\\\": \\\"also rise ucqQquir run 97130732\\\", \\\"WM_SEC.TIMESTAMP\\\": \\\"S4Txh6BM 65247485\\\", \\\"WM_SEC.AUTH_SIGNATURE\\\": \\\"sea muXVLuyt 28668627 CsAoBisT court type\\\", \\\"WM_SVC.NAME\\\": \\\"attack team\\\", \\\"WM_QOS.CORRELATION_ID\\\": \\\"0bm34bxi RyWDumwE 37681896 medical within\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.52", "src_port": "50722", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986206, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.15", "src_port": "80", "dest_port": "50722", "flags": "24", "is_pii": false} -{"timestamp": 1616380986208, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 498\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.6", "dest_ip": "10.20.16.248", "src_port": "50724", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986208, "host_ip": "10.188.40.56", "data_len": "564", "data": "\"{\\\"feedId\\\": \\\"QnzPFaGb 06797851 themselves CpjouTRw few hot\\\", \\\"includeDetails\\\": \\\"81536728 hour U28Q8Qn8 design share\\\", \\\"WM_CONSUMER.CHANNEL.TYPE\\\": \\\"SWAGGER_CHANNEL_TYPE\\\", \\\"WM_CONSUMER.ID\\\": \\\"72344012 KfgYSWqA mention\\\", \\\"WM_SEC.TIMESTAMP\\\": \\\"ymHnrOtr GoVQocqx 83719099 only seem trial\\\", \\\"WM_SEC.AUTH_SIGNATURE\\\": \\\"swzaJBUt available 62462877 data\\\", \\\"WM_SVC.NAME\\\": \\\"quickly dKTyOAqz account vMjdVNdd 83944803 manager\\\", \\\"WM_QOS.CORRELATION_ID\\\": \\\"produce LPYLphlM meeting\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50724", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986309, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.25", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "50724", "flags": "24", "is_pii": false} -{"timestamp": 1616380986310, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 416\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50726", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986310, "host_ip": "10.188.40.56", "data_len": "482", "data": "\"{\\\"sku\\\": \\\"sYBodAJI\\\", \\\"shipNode\\\": \\\"risk WhDfQsCU\\\", \\\"WM_CONSUMER.CHANNEL.TYPE\\\": \\\"SWAGGER_CHANNEL_TYPE\\\", \\\"WM_CONSUMER.ID\\\": \\\"area\\\", \\\"WM_SEC.TIMESTAMP\\\": \\\"19905333 kqN379es Democrat DXwjkXBk on almost\\\", \\\"WM_SEC.AUTH_SIGNATURE\\\": \\\"4BKfc44Z 67762357 IbbyKmji bank man\\\", \\\"WM_SVC.NAME\\\": \\\"dwHBKwcR 02982786 jTFgyF8n figure thing\\\", \\\"WM_QOS.CORRELATION_ID\\\": \\\"much 7cZwyJBz\\\", \\\"Accept\\\": \\\"treat\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.19", "src_port": "50726", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986311, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.52", "src_port": "80", "dest_port": "50726", "flags": "24", "is_pii": false} -{"timestamp": 1616380986313, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 190\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "50728", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986313, "host_ip": "10.188.40.56", "data_len": "256", "data": "\"{\\\"type\\\": \\\"publisher\\\", \\\"query\\\": \\\"fast kkIdIhHf resource 44259379 AUEK7tRh stage\\\", \\\"limit\\\": 1.1853029438618539e+308, \\\"app_token\\\": \\\"fRUOeGnI yIozan4Q short along 63699484 hold\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50728", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986513, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 168\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.17", "src_port": "50730", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986514, "host_ip": "10.188.40.56", "data_len": "234", "data": "\"{\\\"query\\\": \\\"14678445 let too HySPSeuG Jzh4MUer meeting\\\", \\\"limit\\\": 6.432107899528716e+307, \\\"offset\\\": 2.2970622707106123e+307, \\\"app_token\\\": \\\"MqTkzfyj small\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.1", "src_port": "50730", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986515, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 111\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.26", "dest_ip": "10.20.16.248", "src_port": "50732", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986615, "host_ip": "10.188.40.56", "data_len": "177", "data": "\"{\\\"entity_id\\\": \\\"cfDAPHmj 47047234 fill\\\", \\\"offset\\\": 2.0016169260958573e+307, \\\"app_token\\\": \\\"jC9hs775\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.20.16.248", "src_port": "50732", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986618, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 96\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.24", "src_port": "50734", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986619, "host_ip": "10.188.40.56", "data_len": "162", "data": "\"{\\\"relation\\\": \\\"sibling\\\", \\\"entity_id\\\": \\\"BYxypKWm for kitchen message G6p8Zh5H 78693183\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.44", "dest_ip": "10.20.16.248", "src_port": "50734", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986823, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 114\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.28", "src_port": "50736", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986824, "host_ip": "10.188.40.56", "data_len": "180", "data": "\"{\\\"entity_name\\\": \\\"eQpgkdgF\\\", \\\"entity_type\\\": \\\"others\\\", \\\"app_token\\\": \\\"focus 54565537 lpN5lQmP science\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "50736", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986926, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 89\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "50738", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986927, "host_ip": "10.188.40.56", "data_len": "155", "data": "\"{\\\"variable\\\": \\\"wsUYtXJJ television situation\\\", \\\"forecast\\\": 1.597498948568765e+308}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50738", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380986928, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 178\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.17", "src_port": "50740", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987029, "host_ip": "10.188.40.56", "data_len": "244", "data": "\"{\\\"variable\\\": \\\"Mr nrbfO0wT age 90866310 tmiEpYxh indicate\\\", \\\"entity_id\\\": \\\"gmVlOLDG week send\\\", \\\"constraint\\\": \\\"xOwkewCb difficult information LKM9Wuub 01085183 risk\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.34", "src_port": "50740", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987032, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 137\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.20", "dest_ip": "10.20.16.248", "src_port": "50742", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987134, "host_ip": "10.188.40.56", "data_len": "203", "data": "\"{\\\"variable\\\": \\\"tBDdHmRQ U6g2hjJw\\\", \\\"entity_id\\\": \\\"YwglhvDM gas uHjLYajD\\\", \\\"constraint\\\": \\\"uTqjfqDr science 81773465 OfCkesl2\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50742", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987137, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 89\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "50744", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987138, "host_ip": "10.188.40.56", "data_len": "155", "data": "\"{\\\"entity_id\\\": \\\"there simply by\\\", \\\"app_token\\\": \\\"enjoy DprQRLbI 49888364 source\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50744", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987240, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 56\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50746", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987240, "host_ip": "10.188.40.56", "data_len": "122", "data": "\"{\\\"id\\\": \\\"simple lAMQmtHh garden FPNK7305 22632239\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "50746", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987243, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 37\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.18", "src_port": "50748", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987344, "host_ip": "10.188.40.56", "data_len": "103", "data": "\"{\\\"filter[patient]\\\": \\\"EXMCsknI\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.28", "src_port": "50748", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987347, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 48\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.44", "src_port": "50750", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987348, "host_ip": "10.188.40.56", "data_len": "114", "data": "\"{\\\"id\\\": \\\"best 15133740 ACoEWeCL different\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.46", "dest_ip": "10.20.16.248", "src_port": "50750", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987552, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 19\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "50752", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987552, "host_ip": "10.188.40.56", "data_len": "85", "data": "\"{\\\"id\\\": \\\"lot\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50752", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987656, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 40\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.7", "src_port": "50754", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987657, "host_ip": "10.188.40.56", "data_len": "106", "data": "\"{\\\"filter[groups]\\\": \\\"law JYKwbLnw\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.24", "dest_ip": "10.20.16.248", "src_port": "50754", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987658, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 25\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.17", "src_port": "50756", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987659, "host_ip": "10.188.40.56", "data_len": "91", "data": "\"{\\\"id\\\": \\\"professor\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.59", "src_port": "50756", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987861, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 37\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.6", "dest_ip": "10.20.16.248", "src_port": "50758", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987861, "host_ip": "10.188.40.56", "data_len": "103", "data": "\"{\\\"filter[patient]\\\": \\\"evidence\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.31", "src_port": "50758", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987965, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 39\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "50760", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987966, "host_ip": "10.188.40.56", "data_len": "105", "data": "\"{\\\"id\\\": \\\"clearly 14081002 threat\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.13", "dest_ip": "10.20.16.248", "src_port": "50760", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380987968, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 126\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.16", "dest_ip": "10.20.16.248", "src_port": "50762", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380988068, "host_ip": "10.188.40.56", "data_len": "192", "data": "\"{\\\"filter[groups]\\\": \\\"high 94252184 tax rEvjsVnI\\\", \\\"filter[patient]\\\": \\\"y2gdkRpb around jILEJAKi 69738466 next speech\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "50762", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380988071, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 19\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.34", "src_port": "50764", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380988072, "host_ip": "10.188.40.56", "data_len": "85", "data": "\"{\\\"id\\\": \\\"leg\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.39", "dest_ip": "10.20.16.248", "src_port": "50764", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380988276, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 112\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.39", "dest_ip": "10.244.0.1", "src_port": "50766", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380988277, "host_ip": "10.188.40.56", "data_len": "178", "data": "\"{\\\"filter[patient]\\\": \\\"myself 24963944 senior\\\", \\\"filter[reward_program_activation]\\\": \\\"program usBubkYP\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.34", "dest_ip": "10.244.0.1", "src_port": "50766", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380988481, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 57\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "50768", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380988481, "host_ip": "10.188.40.56", "data_len": "123", "data": "\"{\\\"id\\\": \\\"83418538 whom no aMy2r789 second rMEsGNmh\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.17", "src_port": "50768", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380988585, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 44\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50770", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380988586, "host_ip": "10.188.40.56", "data_len": "110", "data": "\"{\\\"id\\\": \\\"represent up doctor QKn8jdOn\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50770", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380988588, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 45\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.20.16.248", "src_port": "50772", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380988688, "host_ip": "10.188.40.56", "data_len": "111", "data": "\"{\\\"filter[patient]\\\": \\\"mQMklLt4 wife he\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.5", "dest_ip": "10.244.0.1", "src_port": "50772", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380988691, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 60\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50774", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380988692, "host_ip": "10.188.40.56", "data_len": "126", "data": "\"{\\\"id\\\": \\\"erRwEWzX note rich section 96009715 lVuiGkgW\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.49", "src_port": "50774", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380988896, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 112\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.26", "dest_ip": "10.244.0.1", "src_port": "50776", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380988896, "host_ip": "10.188.40.56", "data_len": "178", "data": "\"{\\\"filter[patient]\\\": \\\"tax 2gj6qPEr DWngczae six\\\", \\\"page[number]\\\": -101196380, \\\"page[size]\\\": -268299717}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "50776", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989000, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 61\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.37", "src_port": "50778", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989001, "host_ip": "10.188.40.56", "data_len": "127", "data": "\"{\\\"id\\\": \\\"teach 22887831 card LF7xanTN improve xurYopOh\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.15", "src_port": "50778", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989003, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 68\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.18", "src_port": "50780", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989103, "host_ip": "10.188.40.56", "data_len": "134", "data": "\"{\\\"id\\\": \\\"democratic share bxsglJSz qolLuStI 12086204 marriage\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.36", "src_port": "50780", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989106, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 56\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.42", "src_port": "50782", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989107, "host_ip": "10.188.40.56", "data_len": "122", "data": "\"{\\\"id\\\": \\\"M7UvWdu0 toward 11680760 nztRsyoo rather\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.31", "dest_ip": "10.20.16.248", "src_port": "50782", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989209, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 52\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.17", "src_port": "50784", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989210, "host_ip": "10.188.40.56", "data_len": "118", "data": "\"{\\\"id\\\": \\\"note PxRMeBqM 23783557 oieaIkGk move\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.21", "dest_ip": "10.244.0.1", "src_port": "50784", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989212, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 156\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.52", "src_port": "50786", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989312, "host_ip": "10.188.40.56", "data_len": "222", "data": "\"{\\\"filter[groups]\\\": \\\"administration IWRqnTyH\\\", \\\"filter[organization]\\\": \\\"allow region 78693915\\\", \\\"filter[updated_at]\\\": \\\"carry 55935624 century\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.20", "dest_ip": "10.20.16.248", "src_port": "50786", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989315, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 40\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50788", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989315, "host_ip": "10.188.40.56", "data_len": "106", "data": "\"{\\\"id\\\": \\\"really cEJxXsqB 57991787\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "50788", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989419, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 54\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "50790", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989420, "host_ip": "10.188.40.56", "data_len": "120", "data": "\"{\\\"id\\\": \\\"but clearly OYghP46u tBDMlNZl majority\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.20", "dest_ip": "10.20.16.248", "src_port": "50790", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989421, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 58\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.58", "src_port": "50792", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989522, "host_ip": "10.188.40.56", "data_len": "124", "data": "\"{\\\"id\\\": \\\"Q4sQ5uF9 before trip 64845233 DrCbtpuj per\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50792", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989525, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 24\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.33", "src_port": "50794", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989525, "host_ip": "10.188.40.56", "data_len": "90", "data": "\"{\\\"id\\\": \\\"MsmcOcVI\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.19", "src_port": "50794", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989752, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 65\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "50796", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989753, "host_ip": "10.188.40.56", "data_len": "131", "data": "\"{\\\"id\\\": \\\"45719940 3ovEDtiB morning MWxuBVkf check suddenly\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.18", "dest_ip": "10.20.16.248", "src_port": "50796", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989754, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 88\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50798", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989833, "host_ip": "10.188.40.56", "data_len": "154", "data": "\"{\\\"id\\\": \\\"54949893 9Cwr1XqP xvKEKXOF could action summer\\\", \\\"include\\\": \\\"patient\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.31", "src_port": "50798", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989836, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 181\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50800", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989837, "host_ip": "10.188.40.56", "data_len": "247", "data": "\"{\\\"filter[patient]\\\": \\\"us zKGgQlAU daughter 0vuEJh6t\\\", \\\"page[size]\\\": -499840616, \\\"page[limit]\\\": 636863625, \\\"page[cursor]\\\": \\\"large JBchhMyk 35737977 tIQBLAvm question I\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.27", "dest_ip": "10.244.0.57", "src_port": "50800", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989939, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 70\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.1", "src_port": "50802", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989939, "host_ip": "10.188.40.56", "data_len": "136", "data": "\"{\\\"id\\\": \\\"evidence dQnbLgyT 87629936\\\", \\\"include\\\": \\\"questions\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.35", "src_port": "50802", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380989942, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 212\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "50804", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990043, "host_ip": "10.188.40.56", "data_len": "278", "data": "\"{\\\"filter[groups]\\\": \\\"a special RKk3hHAo\\\", \\\"filter[organization]\\\": \\\"33862438 ab5XrXYN many\\\", \\\"page[number]\\\": 745751069, \\\"page[size]\\\": -222919311, \\\"page[limit]\\\": 70403597, \\\"include\\\": \\\"questions\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.61", "dest_ip": "10.244.0.1", "src_port": "50804", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990046, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 64\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.16", "src_port": "50806", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990047, "host_ip": "10.188.40.56", "data_len": "130", "data": "\"{\\\"id\\\": \\\"table company 8rVziGbZ yRZWPnws 87441050 example\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50806", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990149, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 42\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.244.0.50", "src_port": "50808", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990149, "host_ip": "10.188.40.56", "data_len": "108", "data": "\"{\\\"filter[organization]\\\": \\\"physical\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.33", "src_port": "50808", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990151, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 59\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.32", "src_port": "50810", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990151, "host_ip": "10.188.40.56", "data_len": "125", "data": "\"{\\\"id\\\": \\\"sort 0HzmNKpR also attack 94291074 CIyCowyU\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.36", "src_port": "50810", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990355, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 28\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.14", "dest_ip": "10.20.16.248", "src_port": "50812", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990355, "host_ip": "10.188.40.56", "data_len": "94", "data": "\"{\\\"sort\\\": \\\"-send_time\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.17", "src_port": "50812", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990358, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 21\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.8", "dest_ip": "10.20.16.248", "src_port": "50814", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990458, "host_ip": "10.188.40.56", "data_len": "87", "data": "\"{\\\"id\\\": \\\"major\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "50814", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990461, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 56\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.3", "dest_ip": "10.244.0.1", "src_port": "50816", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990461, "host_ip": "10.188.40.56", "data_len": "122", "data": "\"{\\\"id\\\": \\\"attorney subject those 94261744 lZTmT5VG\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.25", "dest_ip": "10.20.16.248", "src_port": "50816", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990667, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 44\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50818", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990667, "host_ip": "10.188.40.56", "data_len": "110", "data": "\"{\\\"id\\\": \\\"3SeLCFMc whole girl 44938167\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "50818", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990670, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 42\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50820", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990770, "host_ip": "10.188.40.56", "data_len": "108", "data": "\"{\\\"id\\\": \\\"72469738 qPpnOXhg AFutTSbi\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.13", "dest_ip": "10.244.0.1", "src_port": "50820", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990773, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 388\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.16", "src_port": "50822", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990774, "host_ip": "10.188.40.56", "data_len": "454", "data": "\"{\\\"filter[attendees]\\\": \\\"kmOKAUcy\\\", \\\"filter[type]\\\": \\\"office-visit\\\", \\\"filter[start_at]\\\": \\\"serve\\\", \\\"filter[completed_at]\\\": \\\"morning zGUTYsyI pjmSdLHi\\\", \\\"filter[created_at]\\\": \\\"song continue nENepXiH 21208848 SZ2FLeTH\\\", \\\"filter[updated_at]\\\": \\\"XvMTHCZd hard\\\", \\\"page[number]\\\": -844566801, \\\"page[size]\\\": -682692919, \\\"page[limit]\\\": 772225220, \\\"include\\\": \\\"owner\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50822", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990774, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.41", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "50822", "flags": "24", "is_pii": false} -{"timestamp": 1616380990876, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 32\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.44", "src_port": "50824", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990877, "host_ip": "10.188.40.56", "data_len": "98", "data": "\"{\\\"id\\\": \\\"address IVUXMbra\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50824", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990878, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 52\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "50826", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380990879, "host_ip": "10.188.40.56", "data_len": "118", "data": "\"{\\\"id\\\": \\\"friend either give rvc7rhCC 10959766\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "50826", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380991081, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 43\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.46", "src_port": "50828", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380991081, "host_ip": "10.188.40.56", "data_len": "109", "data": "\"{\\\"id\\\": \\\"recognize TVhaTIdr FTEXJnYw\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50828", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380991184, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 62\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50830", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380991185, "host_ip": "10.188.40.56", "data_len": "128", "data": "\"{\\\"id\\\": \\\"weight 32616356 common sound liaCAWTh OyZcvnPR\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.59", "src_port": "50830", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380991186, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 64\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50832", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380991287, "host_ip": "10.188.40.56", "data_len": "130", "data": "\"{\\\"template_id\\\": \\\"LyEGOJ6J career movie xiFePOCj 67450675\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.35", "src_port": "50832", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380991290, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 61\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.15", "dest_ip": "10.20.16.248", "src_port": "50834", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380991291, "host_ip": "10.188.40.56", "data_len": "127", "data": "\"{\\\"submission_id\\\": \\\"discussion financial town 6nZlG3Sz\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.38", "src_port": "50834", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380991495, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 35\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "50836", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380991495, "host_ip": "10.188.40.56", "data_len": "101", "data": "\"{\\\"submission_id\\\": \\\"krnQPGDO\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "50836", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380991498, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 66\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.20.16.248", "src_port": "50838", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380991598, "host_ip": "10.188.40.56", "data_len": "132", "data": "\"{\\\"combined_submission_id\\\": \\\"jKprXCSV kitchen plan qU5qAf8k\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "50838", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380991601, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 68\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.34", "dest_ip": "10.20.16.248", "src_port": "50840", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380991601, "host_ip": "10.188.40.56", "data_len": "134", "data": "\"{\\\"combined_submission_id\\\": \\\"there 70498868 XcRdIJtn practice\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "50840", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380991807, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 38\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.33", "src_port": "50842", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380991807, "host_ip": "10.188.40.56", "data_len": "104", "data": "\"{\\\"username\\\": \\\"Stephanie Wilson\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.20.16.248", "src_port": "50842", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380991813, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 70\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.55", "src_port": "50844", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380991910, "host_ip": "10.188.40.56", "data_len": "136", "data": "\"{\\\"username\\\": \\\"Ms. Stephanie Shaw\\\", \\\"taxId\\\": \\\"Clay and Sons\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.244.0.52", "src_port": "50844", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380991913, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 60\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.20.16.248", "src_port": "50846", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380991913, "host_ip": "10.188.40.56", "data_len": "126", "data": "\"{\\\"username\\\": \\\"David Harper\\\", \\\"Date\\\": \\\"1973-05-09\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.13", "dest_ip": "10.20.16.248", "src_port": "50846", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380992119, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 60\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.17", "src_port": "50848", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380992119, "host_ip": "10.188.40.56", "data_len": "126", "data": "\"{\\\"username\\\": \\\"Donna Rubio\\\", \\\"ccountry\\\": \\\"Moldova\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.49", "src_port": "50848", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380992533, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 70\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.20", "dest_ip": "10.20.16.248", "src_port": "50850", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380992533, "host_ip": "10.188.40.56", "data_len": "136", "data": "\"{\\\"username\\\": \\\"Tiffany Walker\\\", \\\"FullName\\\": \\\"Steven Collins\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "50850", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380992739, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 67\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "50852", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380992739, "host_ip": "10.188.40.56", "data_len": "133", "data": "\"{\\\"username\\\": \\\"Madison Oneill\\\", \\\"Nationality\\\": \\\"Cameroon\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50852", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380992945, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 101\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.1", "src_port": "50854", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380992946, "host_ip": "10.188.40.56", "data_len": "167", "data": "\"{\\\"username\\\": \\\"Leslie Thomas\\\", \\\"Signature_sha1\\\": \\\"841c67f79187a284f252e543eef0c18847c7cda2\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50854", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380993048, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 60\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.46", "src_port": "50856", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380993049, "host_ip": "10.188.40.56", "data_len": "126", "data": "\"{\\\"username\\\": \\\"Carrie Clark\\\", \\\"Date\\\": \\\"1972-10-08\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.20.16.248", "src_port": "50856", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380993050, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 71\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.18", "src_port": "50858", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380993051, "host_ip": "10.188.40.56", "data_len": "137", "data": "\"{\\\"username\\\": \\\"Elizabeth Kemp\\\", \\\"Phone\\\": \\\"463.018.2250x92249\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.1", "src_port": "50858", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380993253, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 60\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.244.0.52", "src_port": "50860", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380993254, "host_ip": "10.188.40.56", "data_len": "126", "data": "\"{\\\"username\\\": \\\"Lisa Flowers\\\", \\\"street\\\": \\\"Apt. 361\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50860", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380993458, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 68\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.24", "dest_ip": "10.20.16.248", "src_port": "50862", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380993560, "host_ip": "10.188.40.56", "data_len": "134", "data": "\"{\\\"username\\\": \\\"Jasmine Chavez\\\", \\\"Bic\\\": \\\"NECC0509915816514\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.20", "dest_ip": "10.20.16.248", "src_port": "50862", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380993666, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 61\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "50864", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380993666, "host_ip": "10.188.40.56", "data_len": "127", "data": "\"{\\\"username\\\": \\\"Blake Olson\\\", \\\"ccountry\\\": \\\"Botswana\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.32", "dest_ip": "10.20.16.248", "src_port": "50864", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380993670, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 69\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "50866", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380993670, "host_ip": "10.188.40.56", "data_len": "135", "data": "\"{\\\"username\\\": \\\"Sandra Martin\\\", \\\"creditCard\\\": \\\"587369631789\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.7", "src_port": "50866", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380993873, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 97\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50868", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380993873, "host_ip": "10.188.40.56", "data_len": "163", "data": "\"{\\\"repository\\\": \\\"80153544 tough first UbxUcNmi say tU4BHogu\\\", \\\"username\\\": \\\"Kerry Watts\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.14", "dest_ip": "10.20.16.248", "src_port": "50868", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380993876, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 124\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.44", "dest_ip": "10.20.16.248", "src_port": "50870", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380993976, "host_ip": "10.188.40.56", "data_len": "190", "data": "\"{\\\"repository\\\": \\\"style uhdDTFvP born involve gh8iUikQ\\\", \\\"username\\\": \\\"Kimberly Jones\\\", \\\"Timestamp\\\": \\\"400493107\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "50870", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380993979, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 125\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.28", "src_port": "50872", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380993980, "host_ip": "10.188.40.56", "data_len": "191", "data": "\"{\\\"repository\\\": \\\"far\\\", \\\"username\\\": \\\"Daniel Jimenez\\\", \\\"ccountry\\\": \\\"Antarctica (the territory South of 60 deg S)\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.1", "src_port": "50872", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380994184, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 108\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.33", "src_port": "50874", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380994184, "host_ip": "10.188.40.56", "data_len": "174", "data": "\"{\\\"repository\\\": \\\"skin AhbsspiG central 81397152\\\", \\\"username\\\": \\\"Kevin Powell\\\", \\\"house\\\": \\\"82371\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.13", "dest_ip": "10.20.16.248", "src_port": "50874", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380994288, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 115\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.17", "src_port": "50876", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380994288, "host_ip": "10.188.40.56", "data_len": "181", "data": "\"{\\\"repository\\\": \\\"Zk6B14CO 00485070 important blue case\\\", \\\"username\\\": \\\"Adam Jones\\\", \\\"apartment\\\": \\\"226\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.18", "src_port": "50876", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380994291, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 92\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "50878", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380994292, "host_ip": "10.188.40.56", "data_len": "158", "data": "\"{\\\"repository\\\": \\\"79290427\\\", \\\"username\\\": \\\"Molly Clark\\\", \\\"bankCity\\\": \\\"Josephton\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50878", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380994494, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 91\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "50880", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380994494, "host_ip": "10.188.40.56", "data_len": "157", "data": "\"{\\\"repository\\\": \\\"rule\\\", \\\"username\\\": \\\"Pamela Lee\\\", \\\"DateOfBirth\\\": \\\"1993-11-04\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.31", "dest_ip": "10.20.16.248", "src_port": "50880", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380994700, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 169\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.15", "dest_ip": "10.244.0.1", "src_port": "50882", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380994700, "host_ip": "10.188.40.56", "data_len": "235", "data": "\"{\\\"repository\\\": \\\"federal process network sxKGvYCb 90729526 QdqHtVMA\\\", \\\"username\\\": \\\"Sally May\\\", \\\"signature_sha1\\\": \\\"308926e092b6222d6e8e7ce45aef47f83576e84e\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.18", "src_port": "50882", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380994704, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 91\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.20.16.248", "src_port": "50886", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380994803, "host_ip": "10.188.40.56", "data_len": "157", "data": "\"{\\\"repository\\\": \\\"phone\\\", \\\"username\\\": \\\"Christina Moreno\\\", \\\"state\\\": \\\"Tennessee\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.22", "dest_ip": "10.244.0.48", "src_port": "50886", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380994806, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 115\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.21", "dest_ip": "10.20.16.248", "src_port": "50888", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380994807, "host_ip": "10.188.40.56", "data_len": "181", "data": "\"{\\\"repository\\\": \\\"eLIpx3on remember jXsCDfcY\\\", \\\"username\\\": \\\"David Lawson\\\", \\\"nationality\\\": \\\"Guadeloupe\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.27", "src_port": "50888", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380995011, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 105\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.44", "src_port": "50890", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380995011, "host_ip": "10.188.40.56", "data_len": "171", "data": "\"{\\\"repository\\\": \\\"certain off 75qMQhtc\\\", \\\"username\\\": \\\"Nicole Wyatt\\\", \\\"fullName\\\": \\\"Dana West\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.15", "src_port": "50890", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380995115, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 115\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.40", "dest_ip": "10.244.0.48", "src_port": "50892", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380995115, "host_ip": "10.188.40.56", "data_len": "181", "data": "\"{\\\"repository\\\": \\\"NEmch85e stand matter choose kpnXDPFL\\\", \\\"username\\\": \\\"Matthew Wade MD\\\", \\\"gender\\\": \\\"M\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "50892", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380995117, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 91\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50894", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380995218, "host_ip": "10.188.40.56", "data_len": "157", "data": "\"{\\\"repository\\\": \\\"rise fall\\\", \\\"username\\\": \\\"Brian Sutton\\\", \\\"firstname\\\": \\\"Terri\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.16", "src_port": "50894", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380995221, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 35\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.14", "src_port": "50896", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380995222, "host_ip": "10.188.40.56", "data_len": "101", "data": "\"{\\\"username\\\": \\\"Jessica Owens\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "50896", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380995426, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 59\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50898", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380995427, "host_ip": "10.188.40.56", "data_len": "125", "data": "\"{\\\"username\\\": \\\"Sean Hawkins\\\", \\\"Building\\\": \\\"18043\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "50898", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380995631, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 75\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.59", "src_port": "50900", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380995631, "host_ip": "10.188.40.56", "data_len": "141", "data": "\"{\\\"username\\\": \\\"Jamie Rodriguez\\\", \\\"BusinessContact\\\": \\\"Nicole Hall\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.44", "src_port": "50900", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380995634, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 41\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.42", "src_port": "50902", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380995734, "host_ip": "10.188.40.56", "data_len": "107", "data": "\"{\\\"identityDocument\\\": \\\"547-76-1938\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.34", "dest_ip": "10.20.16.248", "src_port": "50902", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380995738, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 63\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.42", "src_port": "50904", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380995738, "host_ip": "10.188.40.56", "data_len": "129", "data": "\"{\\\"username\\\": \\\"Sarah Lopez\\\", \\\"phoneCountryCode\\\": \\\"CG\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.1", "src_port": "50904", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380995942, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 31\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.46", "src_port": "50906", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380995942, "host_ip": "10.188.40.56", "data_len": "97", "data": "\"{\\\"IdCard\\\": \\\"603-79-5173\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.13", "dest_ip": "10.20.16.248", "src_port": "50906", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380996046, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 102\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.15", "src_port": "50908", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380996046, "host_ip": "10.188.40.56", "data_len": "168", "data": "\"{\\\"username\\\": \\\"Susan Ferguson\\\", \\\"Signature_sha1\\\": \\\"264b4f34c56cae6521e36e77e0fd17954af6039e\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.43", "dest_ip": "10.20.16.248", "src_port": "50908", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380996050, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 22\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.17", "src_port": "50910", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380996050, "host_ip": "10.188.40.56", "data_len": "88", "data": "\"{\\\"Zip\\\": \\\"18669\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.35", "src_port": "50910", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380996253, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 44\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.44", "src_port": "50912", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380996253, "host_ip": "10.188.40.56", "data_len": "110", "data": "\"{\\\"doingBusinessAs\\\": \\\"Knight-Martinez\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.35", "src_port": "50912", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380996361, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 26\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.13", "src_port": "50914", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380996362, "host_ip": "10.188.40.56", "data_len": "92", "data": "\"{\\\"Lat\\\": \\\"88.263737\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.20", "src_port": "50914", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380996363, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 49\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.47", "dest_ip": "10.244.0.61", "src_port": "50916", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380996364, "host_ip": "10.188.40.56", "data_len": "115", "data": "\"{\\\"company\\\": \\\"Thompson, Reynolds and Jones\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.13", "src_port": "50916", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380996566, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 36\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.49", "src_port": "50918", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380996566, "host_ip": "10.188.40.56", "data_len": "102", "data": "\"{\\\"creditCard\\\": \\\"503888844407\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.25", "src_port": "50918", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380996670, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 39\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.15", "dest_ip": "10.20.16.248", "src_port": "50920", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380996670, "host_ip": "10.188.40.56", "data_len": "105", "data": "\"{\\\"iban\\\": \\\"GB74KGLH6184942188730\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "50920", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380996673, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 53\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "50922", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380996774, "host_ip": "10.188.40.56", "data_len": "119", "data": "\"{\\\"maxReturn\\\": \\\"07043197 kid KVGUyBax 18Xl4N9P\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.25", "src_port": "50922", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380996777, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 68\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.25", "dest_ip": "10.244.0.1", "src_port": "50924", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380996778, "host_ip": "10.188.40.56", "data_len": "134", "data": "\"{\\\"ignoreWarnings\\\": true, \\\"id\\\": \\\"97867300 MksTrgaC mJtI5Ste\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.20.16.248", "src_port": "50924", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380996982, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 38\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50926", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380996982, "host_ip": "10.188.40.56", "data_len": "104", "data": "\"{\\\"id\\\": \\\"Mxk8gazf IkzKUfIi just\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.58", "src_port": "50926", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380996985, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 57\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.23", "dest_ip": "10.20.16.248", "src_port": "50928", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380997085, "host_ip": "10.188.40.56", "data_len": "123", "data": "\"{\\\"id\\\": \\\"81429323 very me market au2Ft7VK DvEOqJKZ\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.33", "dest_ip": "10.20.16.248", "src_port": "50928", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380997088, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 74\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50930", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380997089, "host_ip": "10.188.40.56", "data_len": "140", "data": "\"{\\\"riId\\\": \\\"wind bill lpiZnZHh\\\", \\\"id\\\": \\\"which cileVRez such much\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.20.16.248", "src_port": "50930", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380997191, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 108\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.15", "src_port": "50932", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380997192, "host_ip": "10.188.40.56", "data_len": "174", "data": "\"{\\\"riId\\\": \\\"59835317 prevent prepare wind PxJmSben\\\", \\\"id\\\": \\\"knowledge nWEXviCj zjIXcTl6 theory may\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.59", "src_port": "50932", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380997194, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 90\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "50934", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380997294, "host_ip": "10.188.40.56", "data_len": "156", "data": "\"{\\\"riId\\\": \\\"21531687 network perhaps cOes6mVd teacher EkEDdjHR\\\", \\\"id\\\": \\\"8b6rBq4c\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.32", "src_port": "50934", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380997297, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 55\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50936", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380997298, "host_ip": "10.188.40.56", "data_len": "121", "data": "\"{\\\"riId\\\": \\\"30282940\\\", \\\"id\\\": \\\"single UIJcLKph\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.20.16.248", "src_port": "50936", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380997400, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 70\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.48", "src_port": "50938", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380997401, "host_ip": "10.188.40.56", "data_len": "136", "data": "\"{\\\"riId\\\": \\\"bgzfbCwt dream xhaGLd6C accept\\\", \\\"id\\\": \\\"PULkKy8K\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.37", "src_port": "50938", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380997403, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 70\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.44", "src_port": "50940", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380997503, "host_ip": "10.188.40.56", "data_len": "136", "data": "\"{\\\"riId\\\": \\\"wish\\\", \\\"id\\\": \\\"individual space Xhg7FEXv 62155994\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.6", "dest_ip": "10.20.16.248", "src_port": "50940", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380997507, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 111\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.15", "dest_ip": "10.20.16.248", "src_port": "50942", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380997507, "host_ip": "10.188.40.56", "data_len": "177", "data": "\"{\\\"riId\\\": \\\"83693756 S3OZiM8U site xTSNrsxJ\\\", \\\"id\\\": \\\"analysis nkmzHqiY WGb86UYd report 58095898 share\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "50942", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380997711, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 32\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "50944", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380997711, "host_ip": "10.188.40.56", "data_len": "98", "data": "\"{\\\"id\\\": \\\"of fund 80624361\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.244.0.1", "src_port": "50944", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380997917, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 29\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "50946", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380997918, "host_ip": "10.188.40.56", "data_len": "95", "data": "\"{\\\"id\\\": \\\"qnrEZPpx name\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50946", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380998020, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 55\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.16", "src_port": "50948", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380998020, "host_ip": "10.188.40.56", "data_len": "121", "data": "\"{\\\"id\\\": \\\"ouYFY1cG wTiKtAiy 67839835 four whether\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.10", "dest_ip": "10.20.16.248", "src_port": "50948", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380998023, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 38\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.20.16.248", "src_port": "50950", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380998023, "host_ip": "10.188.40.56", "data_len": "104", "data": "\"{\\\"id\\\": \\\"nor something 59198887\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.20.16.248", "src_port": "50950", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380998227, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 78\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.42", "src_port": "50952", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380998228, "host_ip": "10.188.40.56", "data_len": "144", "data": "\"{\\\"id\\\": \\\"authority various eDnCkgZf\\\", \\\"username\\\": \\\"Ronald Carpenter\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50952", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380998330, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 96\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.24", "src_port": "50954", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380998330, "host_ip": "10.188.40.56", "data_len": "162", "data": "\"{\\\"id\\\": \\\"V5yMkdyk act 61304948\\\", \\\"username\\\": \\\"Don Riley\\\", \\\"timestamp\\\": \\\"416597840\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.39", "src_port": "50954", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380998538, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 141\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.25", "src_port": "50956", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380998538, "host_ip": "10.188.40.56", "data_len": "207", "data": "\"{\\\"id\\\": \\\"90036911 yPhWRyhH 8xeajMg0 country prevent professional\\\", \\\"username\\\": \\\"Tracy Eaton\\\", \\\"IdentityDocument\\\": \\\"848-62-0775\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "50956", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380998541, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 119\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.46", "dest_ip": "10.20.16.248", "src_port": "50958", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380998641, "host_ip": "10.188.40.56", "data_len": "185", "data": "\"{\\\"id\\\": \\\"KeRFtSoR Y9EDoGuu sound their 33786989\\\", \\\"username\\\": \\\"John Wiggins\\\", \\\"recordLocator\\\": \\\"XIVY5I5V\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "50958", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380998644, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 134\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.39", "dest_ip": "10.20.16.248", "src_port": "50960", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380998645, "host_ip": "10.188.40.56", "data_len": "200", "data": "\"{\\\"id\\\": \\\"own compare ebJHPqBv thought 23079652 TbuN3GbF\\\", \\\"username\\\": \\\"Tracy Richardson\\\", \\\"CreditCard\\\": \\\"30417047701982\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50960", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380998849, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 126\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.2", "src_port": "50962", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380998849, "host_ip": "10.188.40.56", "data_len": "192", "data": "\"{\\\"id\\\": \\\"several heart UleUKP7N your HSklAtpP 72379731\\\", \\\"username\\\": \\\"Stephanie Landry\\\", \\\"latitude\\\": \\\"3.9239795\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.31", "src_port": "50962", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380998853, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 103\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "50964", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380998952, "host_ip": "10.188.40.56", "data_len": "169", "data": "\"{\\\"id\\\": \\\"concern 52636102 man\\\", \\\"username\\\": \\\"Mark Taylor\\\", \\\"Organization\\\": \\\"Miller Group\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "50964", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380999265, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 140\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.25", "src_port": "50966", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380999266, "host_ip": "10.188.40.56", "data_len": "206", "data": "\"{\\\"id\\\": \\\"fire 50297568 staff Xpnyqjzr Yd0JVNAg\\\", \\\"username\\\": \\\"Mark Howard\\\", \\\"UUID\\\": \\\"e8d7816a200fc66a6a92cce6f1138c12557e4f11\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.25", "src_port": "50966", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380999369, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 114\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.29", "src_port": "50968", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380999369, "host_ip": "10.188.40.56", "data_len": "180", "data": "\"{\\\"id\\\": \\\"Rcvstpvn one safe VcmnTK5h daughter\\\", \\\"username\\\": \\\"Sonya Dalton\\\", \\\"passport\\\": \\\"360-22-3441\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "50968", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380999372, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 81\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.14", "dest_ip": "10.244.0.1", "src_port": "50970", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380999373, "host_ip": "10.188.40.56", "data_len": "147", "data": "\"{\\\"id\\\": \\\"show lot\\\", \\\"username\\\": \\\"Keith Keller\\\", \\\"Apartment\\\": \\\"8942\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.16", "src_port": "50970", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380999576, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 108\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "50972", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380999579, "host_ip": "10.188.40.56", "data_len": "174", "data": "\"{\\\"id\\\": \\\"speak clearly HAxAlmq7\\\", \\\"username\\\": \\\"Julie Patterson\\\", \\\"phone\\\": \\\"(479)804-4145x0536\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.25", "dest_ip": "10.20.16.248", "src_port": "50972", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380999582, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 102\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.1", "src_port": "50974", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380999679, "host_ip": "10.188.40.56", "data_len": "168", "data": "\"{\\\"id\\\": \\\"AbwzdvHR until\\\", \\\"username\\\": \\\"Lori Jenkins\\\", \\\"businessContact\\\": \\\"Nicholas Owen\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.1", "src_port": "50974", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380999683, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 114\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50976", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380999683, "host_ip": "10.188.40.56", "data_len": "180", "data": "\"{\\\"id\\\": \\\"IgBxLj7X baby bkRSpPqh start sea\\\", \\\"username\\\": \\\"Matthew Johnson\\\", \\\"idNumber\\\": \\\"374-93-3736\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.35", "src_port": "50976", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380999887, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 64\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50978", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380999887, "host_ip": "10.188.40.56", "data_len": "130", "data": "\"{\\\"id\\\": \\\"major OA5G4bkq azJtUvQv scientist 30928306 thank\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.38", "src_port": "50978", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380999991, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 24\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.14", "dest_ip": "10.20.16.248", "src_port": "50980", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380999992, "host_ip": "10.188.40.56", "data_len": "90", "data": "\"{\\\"id\\\": \\\"93750964\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.61", "dest_ip": "10.244.0.1", "src_port": "50980", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380999994, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 64\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.31", "src_port": "50982", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616380999994, "host_ip": "10.188.40.56", "data_len": "130", "data": "\"{\\\"id\\\": \\\"speech WnXXyOFo HHJchrTi 26861263 majority house\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.15", "dest_ip": "10.20.16.248", "src_port": "50982", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381000197, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 52\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "50984", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381000198, "host_ip": "10.188.40.56", "data_len": "118", "data": "\"{\\\"id\\\": \\\"bill 08127849 very ty9b2vvo CMoXwsqg\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.7", "src_port": "50984", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381000300, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 47\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50986", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381000300, "host_ip": "10.188.40.56", "data_len": "113", "data": "\"{\\\"id\\\": \\\"dPjoMpnp 46222564 though nation\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50986", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381000304, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 91\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.19", "src_port": "50988", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381000304, "host_ip": "10.188.40.56", "data_len": "157", "data": "\"{\\\"id\\\": \\\"BiFK8soL carry\\\", \\\"cId\\\": \\\"finally form KVixiiIg 32173226 assume draAiQeE\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.20.16.248", "src_port": "50988", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381000506, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 70\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.27", "src_port": "50990", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381000506, "host_ip": "10.188.40.56", "data_len": "136", "data": "\"{\\\"id\\\": \\\"factor 67059792 NXN1L9pM especially sDNJMwui situation\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "50990", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381000509, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 64\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.19", "src_port": "50992", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381000609, "host_ip": "10.188.40.56", "data_len": "130", "data": "\"{\\\"patchId\\\": -365561516, \\\"id\\\": \\\"sAFetSDu south 11379749\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.20", "src_port": "50992", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381000613, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 42\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "50994", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381000613, "host_ip": "10.188.40.56", "data_len": "108", "data": "\"{\\\"id\\\": \\\"KohwEdTA FWHEB3Uf 92014916\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50994", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381000817, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 60\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.28", "src_port": "50996", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381000817, "host_ip": "10.188.40.56", "data_len": "126", "data": "\"{\\\"id\\\": \\\"difference 91966674 SePgNXmY vc35oBsa method\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.13", "dest_ip": "10.20.16.248", "src_port": "50996", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381000820, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 33\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "50998", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381000920, "host_ip": "10.188.40.56", "data_len": "99", "data": "\"{\\\"id\\\": \\\"American vvbLP9VP\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "50998", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381000924, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 57\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51000", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381000924, "host_ip": "10.188.40.56", "data_len": "123", "data": "\"{\\\"id\\\": \\\"vlEiHXCw set FiAmmjYP write 86531649 card\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.31", "dest_ip": "10.20.16.248", "src_port": "51000", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381001129, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 98\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.24", "dest_ip": "10.244.0.1", "src_port": "51002", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381001129, "host_ip": "10.188.40.56", "data_len": "164", "data": "\"{\\\"id\\\": \\\"7OUK32Y2 LLVtnGuM 56068879\\\", \\\"rId\\\": \\\"GYLke0gx see\\\", \\\"cId\\\": \\\"63500798 fight\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51002", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381001132, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 132\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51004", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381001233, "host_ip": "10.188.40.56", "data_len": "198", "data": "\"{\\\"id\\\": \\\"industry KiOsuCLp science dog MWXO911o 32740579\\\", \\\"rId\\\": \\\"painting QOyUMhY6 arrive commercial\\\", \\\"cId\\\": \\\"door\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.36", "src_port": "51004", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381001235, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 64\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.25", "src_port": "51006", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381001235, "host_ip": "10.188.40.56", "data_len": "130", "data": "\"{\\\"id\\\": \\\"75736427\\\", \\\"cId\\\": \\\"outside take Mrs 9ibANes0\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.61", "src_port": "51006", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381001338, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 120\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.46", "dest_ip": "10.20.16.248", "src_port": "51008", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381001338, "host_ip": "10.188.40.56", "data_len": "186", "data": "\"{\\\"render\\\": true, \\\"id\\\": \\\"control F4NXUbU4 century town JSZURpBb 17920698\\\", \\\"cId\\\": \\\"house important kOk7xLZF\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "51008", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381001341, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 69\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.44", "src_port": "51010", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381001342, "host_ip": "10.188.40.56", "data_len": "135", "data": "\"{\\\"id\\\": \\\"63632073 last BLu96CUT if\\\", \\\"cId\\\": \\\"rule 42633941\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51010", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381001544, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 58\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.37", "src_port": "51012", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381001545, "host_ip": "10.188.40.56", "data_len": "124", "data": "\"{\\\"id\\\": \\\"IrvrjOmR woman outside\\\", \\\"cId\\\": \\\"sport\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51012", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381001547, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 77\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.28", "src_port": "51014", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381001646, "host_ip": "10.188.40.56", "data_len": "143", "data": "\"{\\\"id\\\": \\\"IGLlLRwg finish paper\\\", \\\"cId\\\": \\\"star practice no 89393168\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.13", "dest_ip": "10.20.16.248", "src_port": "51014", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381001649, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 69\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.18", "src_port": "51016", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381001650, "host_ip": "10.188.40.56", "data_len": "135", "data": "\"{\\\"id\\\": \\\"18490351 anyone build qklueegH\\\", \\\"cId\\\": \\\"PnmOYSFb\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51016", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381001854, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 62\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "51018", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381001855, "host_ip": "10.188.40.56", "data_len": "128", "data": "\"{\\\"id\\\": \\\"OmOZmAHd LBVFwPQp government\\\", \\\"cId\\\": \\\"bag\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.34", "dest_ip": "10.244.0.50", "src_port": "51018", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381001957, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 63\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.21", "dest_ip": "10.20.16.248", "src_port": "51020", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381001958, "host_ip": "10.188.40.56", "data_len": "129", "data": "\"{\\\"render\\\": true, \\\"id\\\": \\\"thus KAZnmM6N 79563289 degree\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.28", "dest_ip": "10.20.16.248", "src_port": "51020", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381001959, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 55\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51022", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381002060, "host_ip": "10.188.40.56", "data_len": "121", "data": "\"{\\\"id\\\": \\\"machine KlwzYADP city NiE1UyXr 15950748\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.19", "src_port": "51022", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381002064, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 36\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "51024", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381002064, "host_ip": "10.188.40.56", "data_len": "102", "data": "\"{\\\"render\\\": true, \\\"id\\\": \\\"Mr\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.27", "dest_ip": "10.20.16.248", "src_port": "51024", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381002166, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 45\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.32", "dest_ip": "10.244.0.1", "src_port": "51026", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381002167, "host_ip": "10.188.40.56", "data_len": "111", "data": "\"{\\\"id\\\": \\\"MbMZGZQH azCrJ7NY he analysis\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.26", "dest_ip": "10.244.0.57", "src_port": "51026", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381002169, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 40\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51028", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381002269, "host_ip": "10.188.40.56", "data_len": "106", "data": "\"{\\\"render\\\": true, \\\"id\\\": \\\"spring\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.2", "dest_ip": "10.20.16.248", "src_port": "51028", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381002273, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 61\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.14", "src_port": "51030", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381002273, "host_ip": "10.188.40.56", "data_len": "127", "data": "\"{\\\"id\\\": \\\"qfmndHJF 34620857 figure dFmnI9dj late become\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "51030", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381002376, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 63\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "51032", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381002376, "host_ip": "10.188.40.56", "data_len": "129", "data": "\"{\\\"id\\\": \\\"know 32966437 SDdwrgwG E7fJaQvS discover people\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.28", "dest_ip": "10.20.16.248", "src_port": "51032", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381002584, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 59\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.40", "dest_ip": "10.244.0.1", "src_port": "51034", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381002584, "host_ip": "10.188.40.56", "data_len": "125", "data": "\"{\\\"id\\\": \\\"rKtuTUPd able 83089053 place VIsfhWyk sense\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.28", "src_port": "51034", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381002790, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 55\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.244.0.1", "src_port": "51036", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381002791, "host_ip": "10.188.40.56", "data_len": "121", "data": "\"{\\\"id\\\": \\\"oMeLAKrC car from run RPmCQTmK 03073678\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.58", "src_port": "51036", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381002893, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 36\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51038", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381002893, "host_ip": "10.188.40.56", "data_len": "102", "data": "\"{\\\"id\\\": \\\"game zYmNtzwI letter\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.27", "dest_ip": "10.244.0.1", "src_port": "51038", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381002896, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 59\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51040", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381002896, "host_ip": "10.188.40.56", "data_len": "125", "data": "\"{\\\"id\\\": \\\"travel special Republican FxfbGMYh aF22nUvA\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51040", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003100, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 68\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.58", "dest_ip": "10.20.16.248", "src_port": "51042", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003100, "host_ip": "10.188.40.56", "data_len": "134", "data": "\"{\\\"id\\\": \\\"clearly represent FmlSuMqo cfy1fkAA another 33789591\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51042", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003204, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 55\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.18", "src_port": "51044", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003204, "host_ip": "10.188.40.56", "data_len": "121", "data": "\"{\\\"repository\\\": \\\"7jNmDcst open 99369755 BYEUARRl\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51044", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003207, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 95\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.21", "dest_ip": "10.20.16.248", "src_port": "51046", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003207, "host_ip": "10.188.40.56", "data_len": "161", "data": "\"{\\\"path\\\": \\\"71903234\\\", \\\"repository\\\": \\\"53609489 represent gqRPzfBt cM0iXTcj everything\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.52", "src_port": "51046", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003413, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 39\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.58", "dest_ip": "10.244.0.1", "src_port": "51048", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003413, "host_ip": "10.188.40.56", "data_len": "105", "data": "\"{\\\"version\\\": \\\"JCMUoKIR structure\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51048", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003618, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 59\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51050", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003619, "host_ip": "10.188.40.56", "data_len": "125", "data": "\"{\\\"filter\\\": \\\"ujxNpbQA 34775854 record early ROval1QX\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.52", "src_port": "51050", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003621, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 48\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51052", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003720, "host_ip": "10.188.40.56", "data_len": "114", "data": "\"{\\\"filter\\\": \\\"WT53KZ9d 42171769 tough step\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "51052", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003724, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 306\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51054", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003724, "host_ip": "10.188.40.56", "data_len": "372", "data": "\"{\\\"title\\\": \\\"bed turn 56470211 HyMBpl76 ClwAmPWv board\\\", \\\"author\\\": \\\"FGbVDeMg 62155098 worker vHrNYknZ again\\\", \\\"creator\\\": \\\"jINZfSMT situation in\\\", \\\"states\\\": \\\"Alaska\\\", \\\"reviewer\\\": \\\"turn notice phone\\\", \\\"complete\\\": true, \\\"fromDate\\\": 902775854314769658, \\\"toDate\\\": -2686204135485272215}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51054", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003725, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "80", "dest_port": "51054", "flags": "24", "is_pii": false} -{"timestamp": 1616381003826, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 184\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.23", "src_port": "51056", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003826, "host_ip": "10.188.40.56", "data_len": "250", "data": "\"{\\\"moderator\\\": \\\"peace Snx7Yvyv stock mGqdNXgf technology\\\", \\\"allReviewersComplete\\\": true, \\\"toDate\\\": 4512088024298687803, \\\"uUID\\\": \\\"a446ddf3dbdbb11c633232649b928e56409cdaa3\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.15", "src_port": "51056", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003829, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 326\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.6", "dest_ip": "10.20.16.248", "src_port": "51058", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003830, "host_ip": "10.188.40.56", "data_len": "392", "data": "\"{\\\"author\\\": \\\"center eVUqUF4b KajIDlUV 20330223\\\", \\\"moderator\\\": \\\"CTRfKoDu on\\\", \\\"states\\\": \\\"Virginia\\\", \\\"reviewer\\\": \\\"doctor end\\\", \\\"complete\\\": true, \\\"allReviewersComplete\\\": false, \\\"project\\\": \\\"uvd5fapk\\\", \\\"fromDate\\\": 4544411985230542104, \\\"toDate\\\": 1249707129438345406, \\\"BusinessName\\\": \\\"Tate-Chandler\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.13", "src_port": "51058", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003931, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.58", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "51058", "flags": "24", "is_pii": false} -{"timestamp": 1616381003932, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 182\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "51060", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003933, "host_ip": "10.188.40.56", "data_len": "248", "data": "\"{\\\"title\\\": \\\"star mfFX9l0T\\\", \\\"states\\\": \\\"Iowa\\\", \\\"allReviewersComplete\\\": false, \\\"fromDate\\\": -327117747150617768, \\\"toDate\\\": 4486003045081413103, \\\"dba\\\": \\\"Castro-Henry\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.13", "src_port": "51060", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003935, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 308\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.45", "src_port": "51062", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381003935, "host_ip": "10.188.40.56", "data_len": "374", "data": "\"{\\\"title\\\": \\\"only hkUNxfiw 06583151 UiNXuunT debate\\\", \\\"author\\\": \\\"YndqetPk 92310859 sense\\\", \\\"creator\\\": \\\"jSuxjJSe shoulder chance phone 82279302\\\", \\\"orRoles\\\": true, \\\"complete\\\": false, \\\"project\\\": \\\"he PFucOZmY SjTZW3TB activity\\\", \\\"fromDate\\\": -1278395049301681506, \\\"firstname\\\": \\\"Matthew\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.43", "dest_ip": "10.20.16.248", "src_port": "51062", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004035, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "80", "dest_port": "51062", "flags": "24", "is_pii": false} -{"timestamp": 1616381004036, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 345\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51064", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004037, "host_ip": "10.188.40.56", "data_len": "411", "data": "\"{\\\"author\\\": \\\"qKvtQIfV effect certainly G2CzD321 challenge 75222244\\\", \\\"moderator\\\": \\\"right choose XlghJdmi\\\", \\\"creator\\\": \\\"this lawyer 17586371 bring 3gvzFGYd oMZobkOc\\\", \\\"states\\\": \\\"South Dakota\\\", \\\"reviewer\\\": \\\"poor wz7x3wWO 71332027 around keXhVhHl\\\", \\\"complete\\\": false, \\\"toDate\\\": -990529941615100636, \\\"Lat\\\": \\\"-23.814174\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.44", "src_port": "51064", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004038, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.27", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "51064", "flags": "24", "is_pii": false} -{"timestamp": 1616381004039, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 229\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "51066", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004138, "host_ip": "10.188.40.56", "data_len": "295", "data": "\"{\\\"title\\\": \\\"language military 02895069 support\\\", \\\"author\\\": \\\"Ng7fuDz3 some 73739102 suddenly through naLEpvio\\\", \\\"states\\\": \\\"Connecticut\\\", \\\"reviewer\\\": \\\"thus\\\", \\\"allReviewersComplete\\\": true, \\\"countryCode\\\": \\\"SM\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.15", "dest_ip": "10.20.16.248", "src_port": "51066", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004141, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 369\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.39", "dest_ip": "10.20.16.248", "src_port": "51068", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004142, "host_ip": "10.188.40.56", "data_len": "435", "data": "\"{\\\"title\\\": \\\"22706175 executive rdnCt1oz xBxQmNpl\\\", \\\"author\\\": \\\"yPJtBTLn fill 11403237 police head\\\", \\\"moderator\\\": \\\"left middle 61286515 xBGIQcaR\\\", \\\"creator\\\": \\\"cW7edDur 32310077 no KbWMOCYY\\\", \\\"states\\\": \\\"Louisiana\\\", \\\"orRoles\\\": true, \\\"complete\\\": true, \\\"allReviewersComplete\\\": true, \\\"fromDate\\\": 3806930525460057127, \\\"bankCity\\\": \\\"Huffmanfort\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.10", "dest_ip": "10.20.16.248", "src_port": "51068", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004143, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "80", "dest_port": "51068", "flags": "24", "is_pii": false} -{"timestamp": 1616381004244, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 217\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "51070", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004245, "host_ip": "10.188.40.56", "data_len": "283", "data": "\"{\\\"author\\\": \\\"HDLksKAS lot lmlxVKAK do\\\", \\\"reviewer\\\": \\\"47827192 akbMJEYU\\\", \\\"orRoles\\\": false, \\\"complete\\\": false, \\\"allReviewersComplete\\\": false, \\\"fromDate\\\": 1744989949517961150, \\\"lastname\\\": \\\"Calhoun\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.34", "src_port": "51070", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004247, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 210\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51072", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004347, "host_ip": "10.188.40.56", "data_len": "276", "data": "\"{\\\"title\\\": \\\"skin\\\", \\\"moderator\\\": \\\"bill 17691075\\\", \\\"states\\\": \\\"Massachusetts\\\", \\\"reviewer\\\": \\\"aSMavENF p9tHZ4rT approach goal 47200435 piece\\\", \\\"complete\\\": false, \\\"ReservationCode\\\": \\\"1QEKX0IO\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.244.0.1", "src_port": "51072", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004350, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 175\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.59", "src_port": "51074", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004351, "host_ip": "10.188.40.56", "data_len": "241", "data": "\"{\\\"title\\\": \\\"nor\\\", \\\"allReviewersComplete\\\": false, \\\"project\\\": \\\"interest 60219815 three\\\", \\\"fromDate\\\": -2566534908316088732, \\\"doingBusinessAs\\\": \\\"Cantrell-Cortez\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.58", "dest_ip": "10.20.16.248", "src_port": "51074", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004453, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 356\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.39", "src_port": "51076", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004454, "host_ip": "10.188.40.56", "data_len": "422", "data": "\"{\\\"title\\\": \\\"ytFDVzwz item 4oXnMkEZ page condition 41454066\\\", \\\"moderator\\\": \\\"99010836 byF9uAPl arrive population GphBTEEf adult\\\", \\\"reviewer\\\": \\\"TWtICLOv issue than 95455253 cMtYtAIp kitchen\\\", \\\"complete\\\": true, \\\"allReviewersComplete\\\": true, \\\"fromDate\\\": 1467744608339955217, \\\"toDate\\\": -1207151404338908385, \\\"Nationality\\\": \\\"Netherlands\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.15", "src_port": "51076", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004455, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.20", "src_port": "80", "dest_port": "51076", "flags": "24", "is_pii": false} -{"timestamp": 1616381004456, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 165\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.27", "src_port": "51078", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004457, "host_ip": "10.188.40.56", "data_len": "231", "data": "\"{\\\"title\\\": \\\"environmental key feeling\\\", \\\"creator\\\": \\\"fill Q5rZ80a4 growth 93635287 involve\\\", \\\"states\\\": \\\"South Carolina\\\", \\\"recordLocator\\\": \\\"3DXZGYUT\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "51078", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004657, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 164\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.28", "dest_ip": "10.244.0.40", "src_port": "51080", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004657, "host_ip": "10.188.40.56", "data_len": "230", "data": "\"{\\\"author\\\": \\\"bed 12780504 today TCDNVNZJ\\\", \\\"states\\\": \\\"South Carolina\\\", \\\"reviewer\\\": \\\"NO92CYKI walk\\\", \\\"orRoles\\\": true, \\\"project\\\": \\\"sport 98849457\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51080", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004761, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 300\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.40", "dest_ip": "10.244.0.1", "src_port": "51082", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004762, "host_ip": "10.188.40.56", "data_len": "366", "data": "\"{\\\"title\\\": \\\"high FwVBguIn 74532557 about N9ZRk66k\\\", \\\"moderator\\\": \\\"finally nSUQnAho into unit\\\", \\\"states\\\": \\\"Delaware\\\", \\\"reviewer\\\": \\\"20983878 type 2Di2nOfj\\\", \\\"orRoles\\\": true, \\\"project\\\": \\\"with 51073443 loss CSziAaFE color\\\", \\\"fromDate\\\": 2602986975201356420, \\\"State\\\": \\\"Alaska\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.39", "src_port": "51082", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004763, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.46", "src_port": "80", "dest_port": "51082", "flags": "24", "is_pii": false} -{"timestamp": 1616381004764, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 215\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51084", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004864, "host_ip": "10.188.40.56", "data_len": "281", "data": "\"{\\\"title\\\": \\\"57040203 jrTUHntx thank\\\", \\\"creator\\\": \\\"WeyZAYue 16151357\\\", \\\"reviewer\\\": \\\"guess pjJWmRLA\\\", \\\"allReviewersComplete\\\": false, \\\"project\\\": \\\"fPVYQETL morning\\\", \\\"shareholder\\\": \\\"Dennis Small\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51084", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004867, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 290\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.48", "src_port": "51086", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004867, "host_ip": "10.188.40.56", "data_len": "356", "data": "\"{\\\"author\\\": \\\"design box strong 85997985 bajfyKWN eHrAzeqd\\\", \\\"moderator\\\": \\\"Ym6qWDgK ocAXwmXb\\\", \\\"creator\\\": \\\"e8PvG3wV later star plan\\\", \\\"reviewer\\\": \\\"55612157 follow performance rTuXZNYQ pressure\\\", \\\"complete\\\": false, \\\"allReviewersComplete\\\": true, \\\"street\\\": \\\"Suite 545\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.33", "dest_ip": "10.20.16.248", "src_port": "51086", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004970, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "51086", "flags": "24", "is_pii": false} -{"timestamp": 1616381004972, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 405\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.24", "dest_ip": "10.244.0.57", "src_port": "51088", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004972, "host_ip": "10.188.40.56", "data_len": "471", "data": "\"{\\\"title\\\": \\\"LocSKLiy 66315418 3oy9MRG4 once\\\", \\\"author\\\": \\\"ground partner\\\", \\\"moderator\\\": \\\"create KNmXPxKi w6IwSpLo\\\", \\\"reviewer\\\": \\\"mULiPnGq bag 8XEzvOSZ sell 98446196 term\\\", \\\"orRoles\\\": false, \\\"complete\\\": true, \\\"allReviewersComplete\\\": true, \\\"project\\\": \\\"79863927 ground American\\\", \\\"fromDate\\\": -2272499417326940497, \\\"address\\\": \\\"0975 Susan Shoal Suite 057\\\nNew Karen, ID 65799\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51088", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381004973, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.14", "src_port": "80", "dest_port": "51088", "flags": "24", "is_pii": false} -{"timestamp": 1616381005074, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 338\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.14", "dest_ip": "10.20.16.248", "src_port": "51090", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381005074, "host_ip": "10.188.40.56", "data_len": "404", "data": "\"{\\\"title\\\": \\\"just eBwXVJww neuKOJv9 inside 76516072 article\\\", \\\"author\\\": \\\"character last SWUyTazw 49950589\\\", \\\"creator\\\": \\\"sdKmGeor 70215617 operation VsnJZeoC\\\", \\\"states\\\": \\\"West Virginia\\\", \\\"orRoles\\\": false, \\\"project\\\": \\\"fill MaNJrTid 14197183 KWVi98NS\\\", \\\"toDate\\\": -3548828159828816857, \\\"Nationality\\\": \\\"Uzbekistan\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51090", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381005075, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.28", "src_port": "80", "dest_port": "51090", "flags": "24", "is_pii": false} -{"timestamp": 1616381005076, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 226\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.25", "src_port": "51092", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381005077, "host_ip": "10.188.40.56", "data_len": "292", "data": "\"{\\\"title\\\": \\\"TMMSCHiq XOnQAl1V drive\\\", \\\"author\\\": \\\"SOKsRlmh parent son\\\", \\\"moderator\\\": \\\"20194632 ago\\\", \\\"orRoles\\\": false, \\\"complete\\\": false, \\\"fromDate\\\": -4498001638067532350, \\\"DocumentNumber\\\": \\\"249-42-8174\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.15", "dest_ip": "10.244.0.1", "src_port": "51092", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381005280, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 312\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51094", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381005280, "host_ip": "10.188.40.56", "data_len": "378", "data": "\"{\\\"title\\\": \\\"m2XPXrCF BuJkkojN 12353691 our\\\", \\\"moderator\\\": \\\"rfLLgXRs collection 73613704\\\", \\\"creator\\\": \\\"djx7OzuT yard environmental\\\", \\\"states\\\": \\\"Hawaii\\\", \\\"reviewer\\\": \\\"16308270 thought PCBeJScs\\\", \\\"project\\\": \\\"laugh everyone svaJWWlL 88253615 cg8ceftl\\\", \\\"Email\\\": \\\"hermanthomas@gmail.com\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.7", "src_port": "51094", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381005383, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "80", "dest_port": "51094", "flags": "24", "is_pii": false} -{"timestamp": 1616381005384, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 237\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.2", "dest_ip": "10.244.0.1", "src_port": "51096", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381005384, "host_ip": "10.188.40.56", "data_len": "303", "data": "\"{\\\"title\\\": \\\"11497698 discover financial small WPBrOQAz\\\", \\\"allReviewersComplete\\\": false, \\\"project\\\": \\\"page 15767709 RpYOuYfi\\\", \\\"fromDate\\\": -1948462915514844999, \\\"toDate\\\": 3417994733763869394, \\\"dateOfBirth\\\": \\\"2015-08-23\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51096", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381005590, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 362\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51098", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381005590, "host_ip": "10.188.40.56", "data_len": "428", "data": "\"{\\\"title\\\": \\\"provide matter 88868551 1qI3u2y9 figure WcugqnZQ\\\", \\\"moderator\\\": \\\"JztEihJc 5srbT5AW\\\", \\\"creator\\\": \\\"pFtwKpWD 03422508 hot front\\\", \\\"states\\\": \\\"Montana\\\", \\\"reviewer\\\": \\\"IWbEGUEk kitchen close 88702239 south\\\", \\\"orRoles\\\": true, \\\"project\\\": \\\"84708196 which vVBwXOai once\\\", \\\"fromDate\\\": 2230141484779664547, \\\"User\\\": \\\"Dana Ramirez\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "51098", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381005592, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.42", "src_port": "80", "dest_port": "51098", "flags": "24", "is_pii": false} -{"timestamp": 1616381005593, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 216\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "51100", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381005692, "host_ip": "10.188.40.56", "data_len": "282", "data": "\"{\\\"creator\\\": \\\"CvSDCVl7\\\", \\\"orRoles\\\": true, \\\"allReviewersComplete\\\": false, \\\"fromDate\\\": -1831265357645288919, \\\"toDate\\\": 3637309450313248083, \\\"signature_sha1\\\": \\\"0b276b61e7e6e746ee71328bf7596d5b8c435478\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51100", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381005695, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 185\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.3", "dest_ip": "10.20.16.248", "src_port": "51102", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381005696, "host_ip": "10.188.40.56", "data_len": "251", "data": "\"{\\\"moderator\\\": \\\"AqCkGKeA little\\\", \\\"complete\\\": true, \\\"allReviewersComplete\\\": true, \\\"project\\\": \\\"13552759 show\\\", \\\"toDate\\\": -3664850610424319384, \\\"IdCard\\\": \\\"021-92-4290\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.1", "src_port": "51102", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381005798, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 250\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.17", "src_port": "51104", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381005799, "host_ip": "10.188.40.56", "data_len": "316", "data": "\"{\\\"moderator\\\": \\\"spend elluHcNw BLlJyHsf\\\", \\\"creator\\\": \\\"grow 73869592 small\\\", \\\"states\\\": \\\"Oklahoma\\\", \\\"reviewer\\\": \\\"then BI0Mp8ro seek draw\\\", \\\"orRoles\\\": false, \\\"complete\\\": false, \\\"fromDate\\\": -2711103137107485370, \\\"house\\\": \\\"436\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "51104", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381005801, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 26\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.59", "src_port": "51106", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381005801, "host_ip": "10.188.40.56", "data_len": "92", "data": "\"{\\\"state\\\": \\\"Arizona\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "51106", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381006003, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 51\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.39", "dest_ip": "10.20.16.248", "src_port": "51108", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381006003, "host_ip": "10.188.40.56", "data_len": "117", "data": "\"{\\\"state\\\": \\\"Montana\\\", \\\"countryCode\\\": \\\"DJ\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "51108", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381006209, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 88\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "51110", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381006210, "host_ip": "10.188.40.56", "data_len": "154", "data": "\"{\\\"state\\\": \\\"Connecticut\\\", \\\"Serial\\\": \\\"9e9460e743210d68713213e6c745125f00dd4ddb\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.1", "src_port": "51110", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381006414, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 29\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.39", "src_port": "51112", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381006414, "host_ip": "10.188.40.56", "data_len": "95", "data": "\"{\\\"ccountry\\\": \\\"Somalia\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.34", "dest_ip": "10.20.16.248", "src_port": "51112", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381006518, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 64\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51114", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381006518, "host_ip": "10.188.40.56", "data_len": "130", "data": "\"{\\\"state\\\": \\\"North Dakota\\\", \\\"recordLocator\\\": \\\"DMUQMNJJ\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.24", "src_port": "51114", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381006521, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 71\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.44", "dest_ip": "10.20.16.248", "src_port": "51116", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381006623, "host_ip": "10.188.40.56", "data_len": "137", "data": "\"{\\\"state\\\": \\\"Missouri\\\", \\\"address\\\": \\\"USS Brooks\\\nFPO AE 31871\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.34", "dest_ip": "10.244.0.57", "src_port": "51116", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381006627, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 54\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.20", "src_port": "51118", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381006627, "host_ip": "10.188.40.56", "data_len": "120", "data": "\"{\\\"state\\\": \\\"Delaware\\\", \\\"PostalCode\\\": \\\"34163\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.38", "src_port": "51118", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381006728, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 41\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.36", "src_port": "51120", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381006728, "host_ip": "10.188.40.56", "data_len": "107", "data": "\"{\\\"BusinessName\\\": \\\"Jackson-Bradley\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.30", "dest_ip": "10.20.16.248", "src_port": "51120", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381006731, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 68\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.21", "dest_ip": "10.244.0.1", "src_port": "51122", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381006833, "host_ip": "10.188.40.56", "data_len": "134", "data": "\"{\\\"signature_sha1\\\": \\\"366ba948ee501618283956cf7057e8ba14b14c9f\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.23", "src_port": "51122", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381006835, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 26\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "51124", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381006835, "host_ip": "10.188.40.56", "data_len": "92", "data": "\"{\\\"firstname\\\": \\\"Amy\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51124", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381007039, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 31\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.20.16.248", "src_port": "51126", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381007039, "host_ip": "10.188.40.56", "data_len": "97", "data": "\"{\\\"IdCard\\\": \\\"044-92-8994\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.10", "dest_ip": "10.20.16.248", "src_port": "51126", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381007042, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 64\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51128", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381007143, "host_ip": "10.188.40.56", "data_len": "130", "data": "\"{\\\"state\\\": \\\"Pennsylvania\\\", \\\"recordLocator\\\": \\\"UWOJ5DL7\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "51128", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381007145, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 58\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.29", "src_port": "51130", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381007145, "host_ip": "10.188.40.56", "data_len": "124", "data": "\"{\\\"state\\\": \\\"Rhode Island\\\", \\\"postalCode\\\": \\\"70872\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51130", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381007349, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 154\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.25", "src_port": "51132", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381007349, "host_ip": "10.188.40.56", "data_len": "220", "data": "\"{\\\"path\\\": \\\"capital 15911710 47LGUAhK BdqNLQGS arm never\\\", \\\"repository\\\": \\\"94513051\\\", \\\"revision\\\": \\\"rate least miss v5FXTwNg nipqVrlD 10224272\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.24", "src_port": "51132", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381007453, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 29\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "51134", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381007454, "host_ip": "10.188.40.56", "data_len": "95", "data": "\"{\\\"repository\\\": \\\"cover\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "51134", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381007660, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 65\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "51136", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381007660, "host_ip": "10.188.40.56", "data_len": "131", "data": "\"{\\\"repository\\\": \\\"ground Swll8CHy IZSzBEJT TV kind 14839161\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "51136", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381007764, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 121\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.46", "src_port": "51138", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381007765, "host_ip": "10.188.40.56", "data_len": "187", "data": "\"{\\\"path\\\": \\\"leave BYdEgTPm ZZuFtqZr 71353160\\\", \\\"repository\\\": \\\"yourself remain\\\", \\\"revision\\\": \\\"64501364 might\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.24", "dest_ip": "10.20.16.248", "src_port": "51138", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381007971, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 128\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.7", "src_port": "51140", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008074, "host_ip": "10.188.40.56", "data_len": "194", "data": "\"{\\\"path\\\": \\\"mIVRkeEz itself 53283870 JFNIx4o4 make national\\\", \\\"repository\\\": \\\"top past tell\\\", \\\"revision\\\": \\\"DGuEDPHi\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51140", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008076, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 116\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.27", "dest_ip": "10.244.0.1", "src_port": "51142", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008076, "host_ip": "10.188.40.56", "data_len": "182", "data": "\"{\\\"includeNewest\\\": true, \\\"max\\\": -1033466055, \\\"path\\\": \\\"98374542 xWPPptlH\\\", \\\"repository\\\": \\\"Mrs EKNNuacS\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "51142", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008178, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 72\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "51144", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008179, "host_ip": "10.188.40.56", "data_len": "138", "data": "\"{\\\"repository\\\": \\\"art\\\", \\\"revision\\\": \\\"purpose hQJaQ6oq 38655790\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51144", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008180, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 78\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.19", "dest_ip": "10.244.0.57", "src_port": "51146", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008281, "host_ip": "10.188.40.56", "data_len": "144", "data": "\"{\\\"path\\\": \\\"86037307 why udCmiqJp\\\", \\\"repository\\\": \\\"standard 21024656\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.16", "dest_ip": "10.20.16.248", "src_port": "51146", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008284, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 96\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.61", "dest_ip": "10.244.0.1", "src_port": "51148", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008285, "host_ip": "10.188.40.56", "data_len": "162", "data": "\"{\\\"enabled\\\": true, \\\"type\\\": \\\"91423877 nPUHnQvN budget now FTmGwAAa\\\", \\\"limit\\\": 837589551}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.1", "src_port": "51148", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008489, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 20\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.45", "src_port": "51150", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008490, "host_ip": "10.188.40.56", "data_len": "86", "data": "\"{\\\"key\\\": \\\"cut\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "51150", "dest_port": "80", "flags": "24", "is_pii": true} -{"timestamp": 1616381008592, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 67\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.61", "dest_ip": "10.244.0.53", "src_port": "51152", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008593, "host_ip": "10.188.40.56", "data_len": "133", "data": "\"{\\\"password\\\": \\\"23561772 recent cell minute ozj8VySh wIEjfEXT\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.2", "dest_ip": "10.244.0.1", "src_port": "51152", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008594, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 90\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51154", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008695, "host_ip": "10.188.40.56", "data_len": "156", "data": "\"{\\\"fulfillmentId\\\": \\\"very quickly khPEZUNa think 60032543\\\", \\\"orderId\\\": \\\"9Sjx4CRy\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.10", "dest_ip": "10.20.16.248", "src_port": "51154", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008698, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 41\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.29", "src_port": "51156", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008699, "host_ip": "10.188.40.56", "data_len": "107", "data": "\"{\\\"orderId\\\": \\\"paper could syKwiRFW\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.244.0.57", "src_port": "51156", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008801, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 38\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.1", "src_port": "51158", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008802, "host_ip": "10.188.40.56", "data_len": "104", "data": "\"{\\\"orderId\\\": \\\"70080741 pHLvSSU2\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.36", "src_port": "51158", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008804, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 29\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.46", "src_port": "51160", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008904, "host_ip": "10.188.40.56", "data_len": "95", "data": "\"{\\\"orderId\\\": \\\"11105446\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.20.16.248", "src_port": "51160", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008907, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 48\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.37", "src_port": "51162", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381008908, "host_ip": "10.188.40.56", "data_len": "114", "data": "\"{\\\"offset\\\": \\\"seven 40544046 much rUlfLmYG\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.43", "dest_ip": "10.20.16.248", "src_port": "51162", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381009112, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 186\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.44", "src_port": "51164", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381009113, "host_ip": "10.188.40.56", "data_len": "252", "data": "\"{\\\"X-EBAY-C-MARKETPLACE-ID\\\": \\\"07179311\\\", \\\"Range\\\": \\\"NEg2y5VT\\\", \\\"category_id\\\": \\\"reason MsjOXPZA trouble\\\", \\\"snapshot_date\\\": \\\"surface upon major DBKZIxav jZaxzcxh 15476402\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.21", "dest_ip": "10.20.16.248", "src_port": "51164", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381009114, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 151\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.33", "dest_ip": "10.244.0.57", "src_port": "51166", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381009214, "host_ip": "10.188.40.56", "data_len": "217", "data": "\"{\\\"X-EBAY-C-MARKETPLACE-ID\\\": \\\"72987565 customer\\\", \\\"feed_scope\\\": \\\"19030790\\\", \\\"category_id\\\": \\\"13481854 such receive rise q53Xot61 pwvytBwz\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.14", "src_port": "51166", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381009217, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 201\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51168", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381009218, "host_ip": "10.188.40.56", "data_len": "267", "data": "\"{\\\"X-EBAY-C-MARKETPLACE-ID\\\": \\\"attention\\\", \\\"Range\\\": \\\"O7cEUJGz tonight 60043460\\\", \\\"feed_scope\\\": \\\"RnmbuCiX this project\\\", \\\"category_id\\\": \\\"real gekOcSey 22929709 understand need joYyoEPL\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51168", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381009423, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 215\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.6", "dest_ip": "10.20.16.248", "src_port": "51170", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381009424, "host_ip": "10.188.40.56", "data_len": "281", "data": "\"{\\\"category_ids\\\": \\\"meet CTLmUgVi eight Zp8JZkEv culture 29814988\\\", \\\"epid\\\": \\\"front 85839616 bank participant\\\", \\\"filter\\\": \\\"7Torxdei probably\\\", \\\"offset\\\": \\\"again 45401852 aCRtJJKC Rd6FwhXD natural day\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.36", "dest_ip": "10.20.16.248", "src_port": "51170", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381009526, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 310\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.39", "dest_ip": "10.244.0.1", "src_port": "51172", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381009526, "host_ip": "10.188.40.56", "data_len": "376", "data": "\"{\\\"aspect_filter\\\": \\\"dMrlbmsa\\\", \\\"epid\\\": \\\"garden EKUJiISY 46027561 DuXGNYT7\\\", \\\"filter\\\": \\\"offer yeah learn 89573219 LqIzFgEC\\\", \\\"gtin\\\": \\\"question hNwrheNe 88506385 uLoNQ4N6 for\\\", \\\"limit\\\": \\\"29831487 activity\\\", \\\"offset\\\": \\\"ahead 34347050\\\", \\\"q\\\": \\\"upon 00848130 XnxXwTFx jTF5dH3K politics\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51172", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381009527, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.34", "src_port": "80", "dest_port": "51172", "flags": "24", "is_pii": false} -{"timestamp": 1616381009528, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 114\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.31", "src_port": "51174", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381009529, "host_ip": "10.188.40.56", "data_len": "180", "data": "\"{\\\"fieldgroups\\\": \\\"90004876 other occur compare RJGUcLu5 Nnhuxnlk\\\", \\\"item_id\\\": \\\"CbHrmpiv agency rENrgNpg\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51174", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381009731, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 62\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51176", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381009732, "host_ip": "10.188.40.56", "data_len": "128", "data": "\"{\\\"item_group_id\\\": \\\"do night FzD8QEs6 kZcFSltw 11263483\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.20.16.248", "src_port": "51176", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381009936, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 116\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "51178", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381010038, "host_ip": "10.188.40.56", "data_len": "182", "data": "\"{\\\"fieldgroups\\\": \\\"92332996 prevent health\\\", \\\"legacy_item_id\\\": \\\"start best hVeswDye 50291717 EYjfUiti back\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51178", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381010041, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 116\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "51180", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381010042, "host_ip": "10.188.40.56", "data_len": "182", "data": "\"{\\\"epid\\\": \\\"fund\\\", \\\"gtin\\\": \\\"fbCPQKoS 69293622\\\", \\\"mpn\\\": \\\"system human option 23899155 7PnzJShP VNeNIAAD\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.13", "src_port": "51180", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381010144, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 61\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.7", "src_port": "51182", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381010145, "host_ip": "10.188.40.56", "data_len": "127", "data": "\"{\\\"brand\\\": \\\"MS0iv5Uj establish\\\", \\\"epid\\\": \\\"iCdTIVna\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51182", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381010147, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 83\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51184", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381010247, "host_ip": "10.188.40.56", "data_len": "149", "data": "\"{\\\"category_id\\\": \\\"building EKTvlJcm\\\", \\\"metric_name\\\": \\\"znr3bnzT cold hair\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.24", "src_port": "51184", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381010250, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 68\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.43", "dest_ip": "10.20.16.248", "src_port": "51186", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381010251, "host_ip": "10.188.40.56", "data_len": "134", "data": "\"{\\\"siteId\\\": \\\"black technology 10247566 iHdIOUeX 5RCFPyB6 home\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51186", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381010455, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 25\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.19", "src_port": "51188", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381010456, "host_ip": "10.188.40.56", "data_len": "91", "data": "\"{\\\"siteId\\\": \\\"might\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51188", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381010660, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 60\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.20.16.248", "src_port": "51190", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381010660, "host_ip": "10.188.40.56", "data_len": "126", "data": "\"{\\\"siteId\\\": \\\"GbpzlMrC 36406636 FGGhvUat thus whatever\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.25", "src_port": "51190", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381010764, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 61\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.39", "src_port": "51192", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381010764, "host_ip": "10.188.40.56", "data_len": "127", "data": "\"{\\\"siteId\\\": \\\"tend 93517671 3A4liF8L sOacYcDy firm book\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "51192", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381010766, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 43\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.23", "dest_ip": "10.244.0.1", "src_port": "51194", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381010767, "host_ip": "10.188.40.56", "data_len": "109", "data": "\"{\\\"siteId\\\": \\\"close JMbddiX4 56723088\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.31", "dest_ip": "10.20.16.248", "src_port": "51194", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381010969, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 71\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.35", "src_port": "51196", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381010969, "host_ip": "10.188.40.56", "data_len": "137", "data": "\"{\\\"siteId\\\": \\\"49SswOPy outside 10835087 WIvQbijM decision mention\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.36", "dest_ip": "10.244.0.1", "src_port": "51196", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381010972, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 99\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.59", "src_port": "51198", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381011072, "host_ip": "10.188.40.56", "data_len": "165", "data": "\"{\\\"stop_id\\\": -550676248, \\\"route_type\\\": 1, \\\"stop_accessibility\\\": true, \\\"stop_ticket\\\": true}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.10", "src_port": "51198", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381011076, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 127\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.20.16.248", "src_port": "51200", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381011076, "host_ip": "10.188.40.56", "data_len": "193", "data": "\"{\\\"route_id\\\": 471363850, \\\"route_type\\\": 1, \\\"direction_id\\\": 545675751, \\\"token\\\": \\\"born Fqnt5h3s son 09505411 GMbWjopz\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.15", "src_port": "51200", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381011280, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 280\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.61", "dest_ip": "10.244.0.47", "src_port": "51202", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381011280, "host_ip": "10.188.40.56", "data_len": "346", "data": "\"{\\\"latitude\\\": \\\"-24.230317\\\", \\\"longitude\\\": \\\"-117.445142\\\", \\\"max_distance\\\": 9.98863556199171e+307, \\\"stop_disruptions\\\": true, \\\"token\\\": \\\"43014927 OXw6wmWI LLyRHgXr yes\\\", \\\"devid\\\": \\\"yWnVxrZo 16020979 carry save\\\", \\\"signature\\\": \\\"42090180 CMAxRBVm another 37zokFdc\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.41", "src_port": "51202", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381011281, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.58", "src_port": "80", "dest_port": "51202", "flags": "24", "is_pii": false} -{"timestamp": 1616381011283, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 244\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.30", "dest_ip": "10.244.0.48", "src_port": "51204", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381011382, "host_ip": "10.188.40.56", "data_len": "310", "data": "\"{\\\"latitude\\\": \\\"22.070844\\\", \\\"longitude\\\": \\\"-132.161098\\\", \\\"route_types\\\": null, \\\"max_results\\\": 1067293656, \\\"max_distance\\\": 2.8585193723889094e+306, \\\"stop_disruptions\\\": true, \\\"Serial\\\": \\\"8837a3da572d684ffa63079ae31967f57070548c\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "51204", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381011386, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 245\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51206", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381011386, "host_ip": "10.188.40.56", "data_len": "311", "data": "\"{\\\"latitude\\\": \\\"25.054212\\\", \\\"longitude\\\": \\\"-98.273622\\\", \\\"route_types\\\": null, \\\"stop_disruptions\\\": false, \\\"token\\\": \\\"check 83635551 qS4nItRz TWZUEfaJ\\\", \\\"devid\\\": \\\"63247360 SOaivzXO 3CPypEcv tax\\\", \\\"Shareholder\\\": \\\"Angel Brooks\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.46", "src_port": "51206", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381011489, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 326\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.100.150.125", "dest_ip": "10.244.0.59", "src_port": "51208", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381011489, "host_ip": "10.188.40.56", "data_len": "392", "data": "\"{\\\"latitude\\\": \\\"-7.8693215\\\", \\\"longitude\\\": \\\"25.835953\\\", \\\"route_types\\\": null, \\\"max_results\\\": -481661848, \\\"max_distance\\\": 5.944268012091161e+307, \\\"stop_disruptions\\\": false, \\\"token\\\": \\\"world\\\", \\\"devid\\\": \\\"76144717 off well forget lzentk6J\\\", \\\"signature\\\": \\\"still EWppnHPN\\\", \\\"user\\\": \\\"Benjamin Jensen MD\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.18", "dest_ip": "10.20.16.248", "src_port": "51208", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381011490, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.23", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "51208", "flags": "24", "is_pii": false} -{"timestamp": 1616381011492, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 197\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.44", "src_port": "51210", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381011492, "host_ip": "10.188.40.56", "data_len": "263", "data": "\"{\\\"latitude\\\": \\\"-86.9584385\\\", \\\"longitude\\\": \\\"78.132040\\\", \\\"route_types\\\": null, \\\"max_distance\\\": 7.661338683020154e+307, \\\"signature\\\": \\\"75158597 end ZlkqmvXi theory\\\", \\\"apt\\\": \\\"57578\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.15", "dest_ip": "10.244.0.1", "src_port": "51210", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381011694, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 180\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.2", "dest_ip": "10.20.16.248", "src_port": "51212", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381011695, "host_ip": "10.188.40.56", "data_len": "246", "data": "\"{\\\"latitude\\\": \\\"88.397370\\\", \\\"longitude\\\": \\\"144.066356\\\", \\\"max_results\\\": -1058072416, \\\"signature\\\": \\\"TmizAg88 point 14281907 fill RWBXxqqV\\\", \\\"timestamp\\\": \\\"963868044\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.34", "dest_ip": "10.20.16.248", "src_port": "51212", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381011797, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 228\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51214", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381011797, "host_ip": "10.188.40.56", "data_len": "294", "data": "\"{\\\"latitude\\\": \\\"56.8182225\\\", \\\"longitude\\\": \\\"-37.481342\\\", \\\"max_results\\\": 1004272713, \\\"stop_disruptions\\\": true, \\\"devid\\\": \\\"52038736\\\", \\\"signature\\\": \\\"send nTXLFiFu G5OurKk1 13435044\\\", \\\"State\\\": \\\"South Carolina\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.24", "src_port": "51214", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012005, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 273\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.12", "src_port": "51216", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012005, "host_ip": "10.188.40.56", "data_len": "339", "data": "\"{\\\"latitude\\\": \\\"-56.3831795\\\", \\\"longitude\\\": \\\"-169.763916\\\", \\\"route_types\\\": null, \\\"stop_disruptions\\\": true, \\\"devid\\\": \\\"by scChLY0A wiEllbOi\\\", \\\"signature\\\": \\\"cause 28058860 tqMmlEqK everybody\\\", \\\"signature_sha1\\\": \\\"030764164011cb02752db5fbd23c8ecb6334f606\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51216", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012006, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "51216", "flags": "24", "is_pii": false} -{"timestamp": 1616381012008, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 300\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.37", "src_port": "51218", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012008, "host_ip": "10.188.40.56", "data_len": "366", "data": "\"{\\\"latitude\\\": \\\"-0.437584\\\", \\\"longitude\\\": \\\"-77.615885\\\", \\\"route_types\\\": null, \\\"max_distance\\\": 1.2723896656036336e+305, \\\"token\\\": \\\"jmxUsXuq mouth expert bBaPlXcF century 71681904\\\", \\\"signature\\\": \\\"55085672 particular BJHZZXum indeed wWHVRRni\\\", \\\"taxId\\\": \\\"Brewer, Skinner and Bryant\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51218", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012108, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "80", "dest_port": "51218", "flags": "24", "is_pii": false} -{"timestamp": 1616381012109, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 314\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "51220", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012110, "host_ip": "10.188.40.56", "data_len": "380", "data": "\"{\\\"latitude\\\": \\\"44.1207425\\\", \\\"longitude\\\": \\\"84.747057\\\", \\\"route_types\\\": null, \\\"max_results\\\": -439881300, \\\"max_distance\\\": 6.396970082668432e+307, \\\"token\\\": \\\"qYdRWOZK 84846740 4j0ZXSq6 fight\\\", \\\"devid\\\": \\\"tP48kH8T\\\", \\\"signature\\\": \\\"very subject UpMTTcbt 34905223\\\", \\\"BusinessName\\\": \\\"Bates PLC\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.31", "dest_ip": "10.244.0.1", "src_port": "51220", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012110, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.46", "src_port": "80", "dest_port": "51220", "flags": "24", "is_pii": false} -{"timestamp": 1616381012112, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 148\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.48", "src_port": "51222", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012211, "host_ip": "10.188.40.56", "data_len": "214", "data": "\"{\\\"latitude\\\": \\\"-5.6698395\\\", \\\"longitude\\\": \\\"-109.037482\\\", \\\"max_results\\\": 492198103, \\\"stop_disruptions\\\": true, \\\"user\\\": \\\"Colton Curry\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.20.16.248", "src_port": "51222", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012215, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 144\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.20", "dest_ip": "10.20.16.248", "src_port": "51224", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012215, "host_ip": "10.188.40.56", "data_len": "210", "data": "\"{\\\"latitude\\\": \\\"-84.5270565\\\", \\\"longitude\\\": \\\"-137.712585\\\", \\\"token\\\": \\\"dORWn9aS carry oOuYmRtJ\\\", \\\"identityDocument\\\": \\\"642-33-1832\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.26", "dest_ip": "10.20.16.248", "src_port": "51224", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012317, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 199\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.7", "src_port": "51226", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012317, "host_ip": "10.188.40.56", "data_len": "265", "data": "\"{\\\"latitude\\\": \\\"43.003394\\\", \\\"longitude\\\": \\\"-102.899034\\\", \\\"route_types\\\": null, \\\"max_results\\\": -441070878, \\\"token\\\": \\\"75509298 product pick\\\", \\\"email\\\": \\\"huanglindsay@bishop-blake.com\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.20.16.248", "src_port": "51226", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012320, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 132\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.10", "dest_ip": "10.244.0.1", "src_port": "51228", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012421, "host_ip": "10.188.40.56", "data_len": "198", "data": "\"{\\\"search_term\\\": \\\"HRyQWZrn 79264753 one particular someone\\\", \\\"latitude\\\": \\\"74.993982\\\", \\\"match_stop_by_gtfs_stop_id\\\": true}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.33", "src_port": "51228", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012425, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 304\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.44", "src_port": "51230", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012425, "host_ip": "10.188.40.56", "data_len": "370", "data": "\"{\\\"search_term\\\": \\\"58256113 PnnPnHiO likely\\\", \\\"longitude\\\": \\\"77.220717\\\", \\\"include_outlets\\\": false, \\\"match_stop_by_suburb\\\": true, \\\"match_stop_by_gtfs_stop_id\\\": false, \\\"devid\\\": \\\"it discussion 58180341\\\", \\\"signature\\\": \\\"YhQZnZsS note RM507tXr former\\\", \\\"businessName\\\": \\\"Powell-Wilson\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.35", "src_port": "51230", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012426, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "51230", "flags": "24", "is_pii": false} -{"timestamp": 1616381012527, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 225\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "51232", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012527, "host_ip": "10.188.40.56", "data_len": "291", "data": "\"{\\\"search_term\\\": \\\"start vnFQkUXb price\\\", \\\"route_types\\\": null, \\\"latitude\\\": \\\"71.653329\\\", \\\"include_outlets\\\": true, \\\"match_stop_by_suburb\\\": true, \\\"signature\\\": \\\"dark GLoIstkw moment\\\", \\\"Ccountry\\\": \\\"Malaysia\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.32", "dest_ip": "10.20.16.248", "src_port": "51232", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012530, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 290\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.34", "dest_ip": "10.20.16.248", "src_port": "51234", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012531, "host_ip": "10.188.40.56", "data_len": "356", "data": "\"{\\\"search_term\\\": \\\"make 38629114 name DyFuPmVq LWlOtXqf\\\", \\\"route_types\\\": null, \\\"match_route_by_suburb\\\": true, \\\"match_stop_by_gtfs_stop_id\\\": false, \\\"token\\\": \\\"their 95851076 view BMZiGTyG town\\\", \\\"devid\\\": \\\"08684101 choice g8CKaBAk main Mkatvyjw yes\\\", \\\"CountryCode\\\": \\\"ET\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.26", "dest_ip": "10.20.16.248", "src_port": "51234", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012632, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.40", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "51234", "flags": "24", "is_pii": false} -{"timestamp": 1616381012633, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 341\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51236", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012633, "host_ip": "10.188.40.56", "data_len": "407", "data": "\"{\\\"search_term\\\": \\\"Peqe9GPu 23133900 them\\\", \\\"route_types\\\": null, \\\"latitude\\\": \\\"61.280429\\\", \\\"longitude\\\": \\\"-12.261997\\\", \\\"include_outlets\\\": false, \\\"match_stop_by_suburb\\\": false, \\\"token\\\": \\\"uhgaUAhO road although 36YDgE9S behind\\\", \\\"devid\\\": \\\"bAqzYCYs father 60923695 uCg9bazf four interview\\\", \\\"timestamp\\\": \\\"776635966\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.23", "src_port": "51236", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012634, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.26", "dest_ip": "10.244.0.57", "src_port": "80", "dest_port": "51236", "flags": "24", "is_pii": false} -{"timestamp": 1616381012635, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 170\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.42", "src_port": "51238", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012735, "host_ip": "10.188.40.56", "data_len": "236", "data": "\"{\\\"search_term\\\": \\\"yard Cvhuu1PU\\\", \\\"longitude\\\": \\\"60.513791\\\", \\\"max_distance\\\": 1.4961007837100461e+308, \\\"include_outlets\\\": false, \\\"latitude\\\": \\\"-51.3223405\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.36", "dest_ip": "10.20.16.248", "src_port": "51238", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012739, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 339\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.20.16.248", "src_port": "51240", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012739, "host_ip": "10.188.40.56", "data_len": "405", "data": "\"{\\\"search_term\\\": \\\"network 23189960 rRYQpjZZ room\\\", \\\"route_types\\\": null, \\\"longitude\\\": \\\"135.408913\\\", \\\"include_addresses\\\": false, \\\"include_outlets\\\": false, \\\"match_route_by_suburb\\\": true, \\\"match_stop_by_gtfs_stop_id\\\": true, \\\"devid\\\": \\\"26213835 p5nf4vHN information within term LpihlTQr\\\", \\\"organization\\\": \\\"Holmes LLC\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.44", "src_port": "51240", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012740, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.13", "src_port": "80", "dest_port": "51240", "flags": "24", "is_pii": false} -{"timestamp": 1616381012841, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 286\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.46", "dest_ip": "10.244.0.1", "src_port": "51242", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012841, "host_ip": "10.188.40.56", "data_len": "352", "data": "\"{\\\"search_term\\\": \\\"former spring n6HdAXfY\\\", \\\"max_distance\\\": 7.530686933567091e+306, \\\"include_outlets\\\": true, \\\"match_route_by_suburb\\\": false, \\\"match_stop_by_gtfs_stop_id\\\": true, \\\"signature\\\": \\\"91620427 campaign different UoqgSmIt writer\\\", \\\"Nationality\\\": \\\"Timor-Leste\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.52", "src_port": "51242", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012842, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.1", "src_port": "80", "dest_port": "51242", "flags": "24", "is_pii": false} -{"timestamp": 1616381012843, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 190\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.61", "dest_ip": "10.20.16.248", "src_port": "51244", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012844, "host_ip": "10.188.40.56", "data_len": "256", "data": "\"{\\\"search_term\\\": \\\"M6uP6WpO case him 02969736 olLahtub travel\\\", \\\"longitude\\\": \\\"110.428472\\\", \\\"include_addresses\\\": true, \\\"include_outlets\\\": false, \\\"ReservationCode\\\": \\\"3XG7U59U\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.13", "src_port": "51244", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012946, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 254\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "51246", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012946, "host_ip": "10.188.40.56", "data_len": "320", "data": "\"{\\\"search_term\\\": \\\"AECHCLQf send store\\\", \\\"include_addresses\\\": true, \\\"include_outlets\\\": true, \\\"match_stop_by_suburb\\\": false, \\\"match_stop_by_gtfs_stop_id\\\": true, \\\"signature\\\": \\\"02600574 QwPf6poH middle\\\", \\\"shareholder\\\": \\\"Tiffany Stewart\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.21", "dest_ip": "10.20.16.248", "src_port": "51246", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012948, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 367\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.2", "dest_ip": "10.20.16.248", "src_port": "51248", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012948, "host_ip": "10.188.40.56", "data_len": "433", "data": "\"{\\\"search_term\\\": \\\"pull wGAqEKlB street\\\", \\\"route_types\\\": null, \\\"longitude\\\": \\\"-23.199957\\\", \\\"max_distance\\\": 9.14357284684526e+307, \\\"include_addresses\\\": true, \\\"include_outlets\\\": true, \\\"match_stop_by_suburb\\\": true, \\\"match_route_by_suburb\\\": false, \\\"devid\\\": \\\"imagine 03200185 qyfaPFKs throughout just\\\", \\\"signature\\\": \\\"Mrs\\\", \\\"state\\\": \\\"Kansas\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.18", "src_port": "51248", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381012949, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.46", "src_port": "80", "dest_port": "51248", "flags": "24", "is_pii": false} -{"timestamp": 1616381013049, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 459\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.16", "dest_ip": "10.20.16.248", "src_port": "51250", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381013049, "host_ip": "10.188.40.56", "data_len": "525", "data": "\"{\\\"search_term\\\": \\\"snPfOhvK\\\", \\\"route_types\\\": null, \\\"latitude\\\": \\\"22.9679455\\\", \\\"longitude\\\": \\\"107.024056\\\", \\\"max_distance\\\": 1.3533393948384911e+308, \\\"include_addresses\\\": false, \\\"include_outlets\\\": true, \\\"match_stop_by_suburb\\\": true, \\\"match_route_by_suburb\\\": false, \\\"match_stop_by_gtfs_stop_id\\\": true, \\\"token\\\": \\\"mind ZrlIXbmy\\\", \\\"signature\\\": \\\"EYeIoU1q reduce environmental town 87952138 UHrkfmNq\\\", \\\"BusinessName\\\": \\\"Fritz Group\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "51250", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381013051, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.12", "src_port": "80", "dest_port": "51250", "flags": "24", "is_pii": false} -{"timestamp": 1616381013052, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 288\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51252", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381013053, "host_ip": "10.188.40.56", "data_len": "354", "data": "\"{\\\"search_term\\\": \\\"between dbkhsoHr commercial\\\", \\\"latitude\\\": \\\"-64.8432845\\\", \\\"include_outlets\\\": true, \\\"match_stop_by_gtfs_stop_id\\\": true, \\\"token\\\": \\\"08203615 cover fz2Ve5rB\\\", \\\"devid\\\": \\\"lJVL3YJr QqyBEDtV\\\", \\\"signature\\\": \\\"rSGRwrkN enough keep nziJiIeF debate 02263636\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "51252", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381013053, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.34", "src_port": "80", "dest_port": "51252", "flags": "24", "is_pii": false} -{"timestamp": 1616381013153, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 87\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51254", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381013153, "host_ip": "10.188.40.56", "data_len": "153", "data": "\"{\\\"run_id\\\": -506448385, \\\"route_type\\\": 2, \\\"signature\\\": \\\"JvxwFJDb guy 52NxTQGk\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51254", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381013258, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 124\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "51256", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381013258, "host_ip": "10.188.40.56", "data_len": "190", "data": "\"{\\\"run_id\\\": -278737972, \\\"devid\\\": \\\"little believe\\\", \\\"signature\\\": \\\"enjoy 64226345 uMWCdIAh MyoNEmpo suggest young\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.26", "src_port": "51256", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381013261, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 84\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.27", "dest_ip": "10.20.16.248", "src_port": "51258", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381013262, "host_ip": "10.188.40.56", "data_len": "150", "data": "\"{\\\"route_id\\\": 1043251262, \\\"route_type\\\": 2, \\\"signature\\\": \\\"require 73089172\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "51258", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381013464, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 28\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.34", "dest_ip": "10.244.0.28", "src_port": "51260", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381013464, "host_ip": "10.188.40.56", "data_len": "94", "data": "\"{\\\"route_id\\\": -101811283}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "51260", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381013670, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 151\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.18", "dest_ip": "10.20.16.248", "src_port": "51262", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381013670, "host_ip": "10.188.40.56", "data_len": "217", "data": "\"{\\\"route_id\\\": 364608694, \\\"token\\\": \\\"16469426 street ovO3bczu determine CgEjvgzL\\\", \\\"signature\\\": \\\"student wCdkebpG probably 59336333 property\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.26", "src_port": "51262", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381013877, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 52\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.37", "src_port": "51264", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381013878, "host_ip": "10.188.40.56", "data_len": "118", "data": "\"{\\\"devid\\\": \\\"return Blpwolvr fine BtiGX6pB ten\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.25", "dest_ip": "10.20.16.248", "src_port": "51264", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381014082, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 128\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.52", "dest_ip": "10.244.0.50", "src_port": "51266", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381014082, "host_ip": "10.188.40.56", "data_len": "194", "data": "\"{\\\"token\\\": \\\"decision management manage GgsjOhT2 82023714 LQlWubPY\\\", \\\"devid\\\": \\\"thousand INXdvffY 45466075 art eaTYthWb\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.23", "dest_ip": "10.20.16.248", "src_port": "51266", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381014186, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 130\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.19", "src_port": "51268", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381014186, "host_ip": "10.188.40.56", "data_len": "196", "data": "\"{\\\"run_id\\\": 615144282, \\\"route_type\\\": 595767730, \\\"date_utc\\\": \\\"2004-02-24\\\", \\\"token\\\": \\\"83377243 UCA5b149 hold big call\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.13", "dest_ip": "10.20.16.248", "src_port": "51268", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381014189, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 163\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.8", "dest_ip": "10.20.16.248", "src_port": "51270", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381014190, "host_ip": "10.188.40.56", "data_len": "229", "data": "\"{\\\"run_id\\\": -503499464, \\\"route_type\\\": 1, \\\"expand\\\": null, \\\"date_utc\\\": \\\"1989-06-12\\\", \\\"devid\\\": \\\"2XmGOpGE scientist since\\\", \\\"Location\\\": \\\"-0.793853\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.19", "src_port": "51270", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381014392, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 270\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51272", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381014392, "host_ip": "10.188.40.56", "data_len": "336", "data": "\"{\\\"run_id\\\": -795484258, \\\"route_type\\\": 4, \\\"expand\\\": null, \\\"date_utc\\\": \\\"2017-08-08\\\", \\\"token\\\": \\\"20333837 face official leave yQswLVjB\\\", \\\"devid\\\": \\\"turn 83343455 eBT78VyP room right HMKUYFkY\\\", \\\"signature\\\": \\\"30374703\\\", \\\"businessName\\\": \\\"Chapman Inc\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51272", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381014393, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.36", "src_port": "80", "dest_port": "51272", "flags": "24", "is_pii": false} -{"timestamp": 1616381014395, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 225\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51274", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381014494, "host_ip": "10.188.40.56", "data_len": "291", "data": "\"{\\\"run_id\\\": -496316259, \\\"route_type\\\": 2, \\\"expand\\\": null, \\\"stop_id\\\": -574964706, \\\"date_utc\\\": \\\"1995-03-31\\\", \\\"token\\\": \\\"until KfHVbKDl\\\", \\\"signature\\\": \\\"experience 1EGxolYp fTwxbknQ\\\", \\\"firstname\\\": \\\"Marcus\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51274", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381014498, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 262\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "51276", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381014498, "host_ip": "10.188.40.56", "data_len": "328", "data": "\"{\\\"run_id\\\": 592823869, \\\"route_type\\\": 361162665, \\\"expand\\\": null, \\\"stop_id\\\": -702466026, \\\"date_utc\\\": \\\"2020-08-08\\\", \\\"devid\\\": \\\"car return 58364877 total fkMGaJMn\\\", \\\"signature\\\": \\\"BjJOXQa8 33276636 response ADiyUKCZ\\\", \\\"lastname\\\": \\\"Fitzgerald\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.16", "dest_ip": "10.20.16.248", "src_port": "51276", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381014499, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.34", "src_port": "80", "dest_port": "51276", "flags": "24", "is_pii": false} -{"timestamp": 1616381014500, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 188\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.28", "src_port": "51278", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381014599, "host_ip": "10.188.40.56", "data_len": "254", "data": "\"{\\\"run_id\\\": 234071018, \\\"route_type\\\": 4, \\\"expand\\\": null, \\\"token\\\": \\\"h0pSONtQ happen 87620359 zwkOtZCF\\\", \\\"signature\\\": \\\"recently check o0bR0TiM in 91422649\\\", \\\"zip\\\": \\\"49501\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.41", "src_port": "51278", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381014602, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 229\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.27", "src_port": "51280", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381014603, "host_ip": "10.188.40.56", "data_len": "295", "data": "\"{\\\"run_id\\\": -466820768, \\\"route_type\\\": 2, \\\"expand\\\": null, \\\"stop_id\\\": -190166286, \\\"date_utc\\\": \\\"2015-05-13\\\", \\\"token\\\": \\\"Ac9l6zqk 70243358 teach\\\", \\\"devid\\\": \\\"wYvgyUja collection\\\", \\\"organization\\\": \\\"Lawson-Shaw\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51280", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381014705, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 124\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.46", "dest_ip": "10.20.16.248", "src_port": "51282", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381014706, "host_ip": "10.188.40.56", "data_len": "190", "data": "\"{\\\"run_id\\\": -1027660900, \\\"route_type\\\": 1, \\\"expand\\\": null, \\\"date_utc\\\": \\\"2008-09-05\\\", \\\"Location\\\": \\\"156.885501\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.244.0.48", "src_port": "51282", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381014707, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 194\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.26", "dest_ip": "10.20.16.248", "src_port": "51284", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381014708, "host_ip": "10.188.40.56", "data_len": "260", "data": "\"{\\\"run_id\\\": -172585369, \\\"route_type\\\": 927372519, \\\"expand\\\": null, \\\"devid\\\": \\\"96730581 51B9HqO3 perform EBXpNwOd week suffer\\\", \\\"signature\\\": \\\"attack finally\\\", \\\"Dob\\\": \\\"1986-03-09\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.14", "src_port": "51284", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381015221, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 223\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "51286", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381015222, "host_ip": "10.188.40.56", "data_len": "289", "data": "\"{\\\"run_id\\\": -728250792, \\\"route_type\\\": -328212616, \\\"expand\\\": null, \\\"stop_id\\\": 706706561, \\\"token\\\": \\\"since door 11328860 probably\\\", \\\"signature\\\": \\\"pull apply inwoniXX 63633995 rest\\\", \\\"Province\\\": \\\"Colorado\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.48", "src_port": "51286", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381015223, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 105\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.45", "src_port": "51288", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381015324, "host_ip": "10.188.40.56", "data_len": "171", "data": "\"{\\\"run_id\\\": 735380324, \\\"route_type\\\": -576582090, \\\"expand\\\": null, \\\"Email\\\": \\\"holson@duarte.net\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51288", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381015327, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 229\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.19", "dest_ip": "10.20.16.248", "src_port": "51290", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381015328, "host_ip": "10.188.40.56", "data_len": "295", "data": "\"{\\\"run_id\\\": 101263647, \\\"route_type\\\": -1018248874, \\\"expand\\\": null, \\\"devid\\\": \\\"partner 84283511 kCgwbCRY 7caQP79j century\\\", \\\"signature\\\": \\\"industry girl OyEIzDZA result 08664032 v7VM5N9h\\\", \\\"longitude\\\": \\\"89.158653\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.59", "src_port": "51290", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381015430, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 189\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.10", "src_port": "51292", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381015431, "host_ip": "10.188.40.56", "data_len": "255", "data": "\"{\\\"run_id\\\": 587594079, \\\"route_type\\\": 1, \\\"expand\\\": null, \\\"stop_id\\\": 209670906, \\\"date_utc\\\": \\\"1984-05-04\\\", \\\"signature\\\": \\\"PtBqHWsY education WFFOwzbH\\\", \\\"firstname\\\": \\\"John\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51292", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381015432, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 209\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "51294", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381015533, "host_ip": "10.188.40.56", "data_len": "275", "data": "\"{\\\"latitude\\\": \\\"-23.3879815\\\", \\\"longitude\\\": \\\"88.511543\\\", \\\"max_results\\\": 68117379, \\\"token\\\": \\\"64337173 own sjVIOFi7 XotRmqiT friend\\\", \\\"devid\\\": \\\"17968558 kR2vQlRX control concern hotel lgFUjUzc\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "51294", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381015536, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 271\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.16", "dest_ip": "10.20.16.248", "src_port": "51296", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381015536, "host_ip": "10.188.40.56", "data_len": "337", "data": "\"{\\\"latitude\\\": \\\"-80.665359\\\", \\\"longitude\\\": \\\"20.425041\\\", \\\"max_distance\\\": 1.0718197700489532e+308, \\\"token\\\": \\\"96519481 catch FmefImH4 whole out TMOhmTYu\\\", \\\"devid\\\": \\\"fRbqObQM 42346594 pass marriage\\\", \\\"signature\\\": \\\"bPxHkYU4\\\", \\\"PhoneCountryCode\\\": \\\"VC\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.3", "dest_ip": "10.20.16.248", "src_port": "51296", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381015743, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.26", "src_port": "80", "dest_port": "51296", "flags": "24", "is_pii": false} -{"timestamp": 1616381015744, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 163\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.3", "src_port": "51298", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381015745, "host_ip": "10.188.40.56", "data_len": "229", "data": "\"{\\\"latitude\\\": \\\"-57.9748875\\\", \\\"longitude\\\": \\\"-46.452880\\\", \\\"signature\\\": \\\"despite parent 03172362 wIhBDWk9 same CLalVrey\\\", \\\"BankCity\\\": \\\"Kevinborough\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.57", "src_port": "51298", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381015746, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 246\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51300", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381015846, "host_ip": "10.188.40.56", "data_len": "312", "data": "\"{\\\"latitude\\\": \\\"75.8992825\\\", \\\"longitude\\\": \\\"-147.437562\\\", \\\"max_distance\\\": 8.120889092402093e+307, \\\"token\\\": \\\"American nation jSRWcQvG all l0DmE4ZC 61378586\\\", \\\"devid\\\": \\\"IhAfWESD similar beyond\\\", \\\"Iban\\\": \\\"GB23DUKW4707602243700\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "51300", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381015849, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 219\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.52", "src_port": "51302", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381015850, "host_ip": "10.188.40.56", "data_len": "285", "data": "\"{\\\"latitude\\\": \\\"-28.3213885\\\", \\\"longitude\\\": \\\"-60.432615\\\", \\\"max_distance\\\": 1.191355674337592e+308, \\\"devid\\\": \\\"around VdfQlSBC\\\", \\\"signature\\\": \\\"vXRoURfH DWuFa7t2 test\\\", \\\"creditCard\\\": \\\"6562982803261821\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "51302", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016054, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 193\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.20.16.248", "src_port": "51304", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016054, "host_ip": "10.188.40.56", "data_len": "259", "data": "\"{\\\"latitude\\\": \\\"-34.5365645\\\", \\\"longitude\\\": \\\"-103.551867\\\", \\\"max_distance\\\": 1.6757186640572081e+308, \\\"max_results\\\": 412883204, \\\"signature\\\": \\\"67382651 5S4qPxCP\\\", \\\"gender\\\": \\\"F\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.30", "dest_ip": "10.244.0.1", "src_port": "51304", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016057, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 167\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51306", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016157, "host_ip": "10.188.40.56", "data_len": "233", "data": "\"{\\\"latitude\\\": \\\"50.904168\\\", \\\"longitude\\\": \\\"31.798982\\\", \\\"max_results\\\": -161211458, \\\"signature\\\": \\\"herself SMBZoMYl smile 71762929\\\", \\\"lon\\\": \\\"-90.928568\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.21", "src_port": "51306", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016160, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 148\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51308", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016161, "host_ip": "10.188.40.56", "data_len": "214", "data": "\"{\\\"latitude\\\": \\\"-53.2414595\\\", \\\"longitude\\\": \\\"-150.484371\\\", \\\"devid\\\": \\\"gTrogYFM road 57675951 MNKcy2kL church hospital\\\", \\\"gender\\\": \\\"F\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "51308", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016365, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 205\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.30", "dest_ip": "10.244.0.1", "src_port": "51310", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016365, "host_ip": "10.188.40.56", "data_len": "271", "data": "\"{\\\"latitude\\\": \\\"52.9789015\\\", \\\"longitude\\\": \\\"-103.960188\\\", \\\"max_distance\\\": 1.329665988293024e+308, \\\"max_results\\\": 773844190, \\\"token\\\": \\\"20724885 TV wife\\\", \\\"businessName\\\": \\\"Green and Sons\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51310", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016368, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 167\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.10", "dest_ip": "10.20.16.248", "src_port": "51312", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016468, "host_ip": "10.188.40.56", "data_len": "233", "data": "\"{\\\"latitude\\\": \\\"-29.5414465\\\", \\\"longitude\\\": \\\"27.159542\\\", \\\"max_distance\\\": 1.2617717448064347e+308, \\\"max_results\\\": 606678396, \\\"RecordLocator\\\": \\\"A98LDIC8\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.34", "src_port": "51312", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016471, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 230\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.17", "dest_ip": "10.244.0.1", "src_port": "51314", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016472, "host_ip": "10.188.40.56", "data_len": "296", "data": "\"{\\\"latitude\\\": \\\"51.5421565\\\", \\\"longitude\\\": \\\"-110.917104\\\", \\\"token\\\": \\\"value be will Rp77Qpyp\\\", \\\"devid\\\": \\\"25406704 listen\\\", \\\"signature\\\": \\\"return ZrZ0wMCO feel sTgOjOOY Democrat 39329859\\\", \\\"firstname\\\": \\\"Ronald\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.33", "dest_ip": "10.244.0.48", "src_port": "51314", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016676, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 262\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "51316", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016676, "host_ip": "10.188.40.56", "data_len": "328", "data": "\"{\\\"latitude\\\": \\\"80.425685\\\", \\\"longitude\\\": \\\"153.123365\\\", \\\"max_distance\\\": 8.757160919783892e+307, \\\"max_results\\\": 225932842, \\\"token\\\": \\\"2QEVwoUu money esTVfdMZ rule 21982390\\\", \\\"signature\\\": \\\"drug myself break kNgaSbcF 29206432\\\", \\\"zip\\\": \\\"87766\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.13", "dest_ip": "10.20.16.248", "src_port": "51316", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016677, "host_ip": "10.188.40.56", "data_len": "71", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.46", "dest_ip": "10.244.0.1", "src_port": "80", "dest_port": "51316", "flags": "24", "is_pii": false} -{"timestamp": 1616381016678, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 162\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.20.16.248", "src_port": "51318", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016778, "host_ip": "10.188.40.56", "data_len": "228", "data": "\"{\\\"latitude\\\": \\\"-21.3592645\\\", \\\"longitude\\\": \\\"179.687388\\\", \\\"token\\\": \\\"forward piece wish\\\", \\\"devid\\\": \\\"yj3sYrqh test war\\\", \\\"bankCity\\\": \\\"Olsonview\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51318", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016781, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 31\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.58", "src_port": "51320", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016782, "host_ip": "10.188.40.56", "data_len": "97", "data": "\"{\\\"max_results\\\": -281938260}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "51320", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016884, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 68\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.23", "dest_ip": "10.20.16.248", "src_port": "51322", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016885, "host_ip": "10.188.40.56", "data_len": "134", "data": "\"{\\\"disruption_id\\\": -3320412450265503445, \\\"devid\\\": \\\"HTKacfzA\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51322", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016887, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 200\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.17", "dest_ip": "10.244.0.48", "src_port": "51324", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016987, "host_ip": "10.188.40.56", "data_len": "266", "data": "\"{\\\"stop_id\\\": 24898767, \\\"disruption_status\\\": \\\"planned\\\", \\\"token\\\": \\\"77301240 discussion\\\", \\\"devid\\\": \\\"top 39622185 AbsAzz7M you late qEelbnmO\\\", \\\"signature\\\": \\\"community foreign lVei0IxO\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.32", "src_port": "51324", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016990, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 51\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.48", "src_port": "51326", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381016991, "host_ip": "10.188.40.56", "data_len": "117", "data": "\"{\\\"route_id\\\": 483381993, \\\"stop_id\\\": 962263284}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.58", "dest_ip": "10.244.0.48", "src_port": "51326", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381017195, "host_ip": "10.188.40.56", "data_len": "309", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 96\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "51328", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381017196, "host_ip": "10.188.40.56", "data_len": "162", "data": "\"{\\\"route_id\\\": -915814761, \\\"token\\\": \\\"zSvKKUjH 255cxGj3\\\", \\\"signature\\\": \\\"30095505 help\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.30", "dest_ip": "10.20.16.248", "src_port": "51328", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381017197, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 102\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.59", "src_port": "51330", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381017298, "host_ip": "10.188.40.56", "data_len": "168", "data": "\"{\\\"devid\\\": \\\"loss direction 63614975 during\\\", \\\"signature\\\": \\\"LEBUleRN drive 25639823 buy goal\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.58", "src_port": "51330", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381017299, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 204\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.33", "src_port": "51332", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381017300, "host_ip": "10.188.40.56", "data_len": "270", "data": "\"{\\\"disruption_status\\\": \\\"current\\\", \\\"token\\\": \\\"thought fly including 3DdNRCUw\\\", \\\"devid\\\": \\\"play lJFEO1jV station toward 79580394\\\", \\\"signature\\\": \\\"represent 22Zh9KLM 66858751 Qgwpfvfo herself\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51332", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381017504, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 101\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "51334", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381017505, "host_ip": "10.188.40.56", "data_len": "167", "data": "\"{\\\"direction_id\\\": -703659957, \\\"route_type\\\": 3, \\\"devid\\\": \\\"8D5JGr7g\\\", \\\"signature\\\": \\\"else\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.25", "src_port": "51334", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381017506, "host_ip": "10.188.40.56", "data_len": "310", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 110\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.34", "src_port": "51336", "dest_port": "80", "flags": "24", "is_pii": false} diff --git a/examples/data/without_data_len.json b/examples/data/without_data_len.json deleted file mode 100644 index 7952f54e7c..0000000000 --- a/examples/data/without_data_len.json +++ /dev/null @@ -1,1000 +0,0 @@ -{"timestamp": 1616381017606, "host_ip": "10.188.40.56", "data": "\"{\\\"direction_id\\\": 287336052, \\\"token\\\": \\\"before\\\", \\\"signature\\\": \\\"14350563 ZrLnsLEi understand budget\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51336", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381017609, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 77\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51338", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381017711, "host_ip": "10.188.40.56", "data": "\"{\\\"route_id\\\": 611674955, \\\"token\\\": \\\"entire TYeVrKOk NbcqQGlu 71455758\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.39", "dest_ip": "10.20.16.248", "src_port": "51338", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381017715, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 222\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.31", "dest_ip": "10.20.16.248", "src_port": "51340", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381017715, "host_ip": "10.188.40.56", "data": "\"{\\\"route_type\\\": 2, \\\"stop_id\\\": -622552254, \\\"route_id\\\": \\\"89584387 despite\\\", \\\"look_backwards\\\": true, \\\"date_utc\\\": \\\"1988-04-25\\\", \\\"token\\\": \\\"aXht601J check them\\\", \\\"devid\\\": \\\"dark FsVvPTRr 39279350 AiP8boyv\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.52", "src_port": "51340", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381017920, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 287\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.14", "src_port": "51342", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381017920, "host_ip": "10.188.40.56", "data": "\"{\\\"route_type\\\": -142605551, \\\"stop_id\\\": 118223561, \\\"route_id\\\": \\\"F3v4jp1R\\\", \\\"direction_id\\\": -111935601, \\\"look_backwards\\\": true, \\\"gtfs\\\": true, \\\"date_utc\\\": \\\"1991-09-15\\\", \\\"max_results\\\": -751110530, \\\"expand\\\": null, \\\"devid\\\": \\\"up\\\", \\\"drivingLicense\\\": \\\"737-31-6745\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.15", "dest_ip": "10.20.16.248", "src_port": "51342", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381017921, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "51342", "flags": "24", "is_pii": false} -{"timestamp": 1616381017923, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 286\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.34", "src_port": "51344", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381017923, "host_ip": "10.188.40.56", "data": "\"{\\\"route_type\\\": 1, \\\"stop_id\\\": 454820029, \\\"route_id\\\": \\\"52405920 gHowddyx\\\", \\\"gtfs\\\": false, \\\"include_cancelled\\\": true, \\\"expand\\\": null, \\\"token\\\": \\\"information 66320488\\\", \\\"signature\\\": \\\"vTlWngaC question must tree fL5HrCkK 54537599\\\", \\\"bankCity\\\": \\\"South Allisonport\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "51344", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381018023, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.30", "src_port": "80", "dest_port": "51344", "flags": "24", "is_pii": false} -{"timestamp": 1616381018025, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 241\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "51346", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381018025, "host_ip": "10.188.40.56", "data": "\"{\\\"route_type\\\": 527931115, \\\"stop_id\\\": -792517671, \\\"route_id\\\": \\\"give 5wFIPOjh 71996935\\\", \\\"look_backwards\\\": true, \\\"date_utc\\\": \\\"1977-12-20\\\", \\\"expand\\\": null, \\\"token\\\": \\\"ryRplxyk than WwRmGHSJ\\\", \\\"phone\\\": \\\"+1-948-229-7554\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51346", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381018028, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 183\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.20.16.248", "src_port": "51348", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381018128, "host_ip": "10.188.40.56", "data": "\"{\\\"route_type\\\": 4, \\\"stop_id\\\": 231258677, \\\"route_id\\\": \\\"tML6jVbW realize explain serve 01374817\\\", \\\"devid\\\": \\\"qKVwWhum pass 06419556 w4GReTP8 continue\\\", \\\"house\\\": \\\"80090\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.33", "dest_ip": "10.20.16.248", "src_port": "51348", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381018232, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 292\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "51350", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381018232, "host_ip": "10.188.40.56", "data": "\"{\\\"route_type\\\": -806721718, \\\"stop_id\\\": 271683685, \\\"route_id\\\": \\\"11805703 bed hQatcrPM garden\\\", \\\"look_backwards\\\": true, \\\"token\\\": \\\"ten foot TRgwDZrZ western LZIkbnPu 24476645\\\", \\\"devid\\\": \\\"run\\\", \\\"signature\\\": \\\"responsibility near szLeDomu 8cx1FJYW\\\", \\\"lastname\\\": \\\"Herman\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.15", "dest_ip": "10.20.16.248", "src_port": "51350", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381018544, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "51350", "flags": "24", "is_pii": false} -{"timestamp": 1616381018546, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 237\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.244.0.1", "src_port": "51352", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381018647, "host_ip": "10.188.40.56", "data": "\"{\\\"route_type\\\": 2, \\\"stop_id\\\": 395659681, \\\"route_id\\\": \\\"bmegBJe6 note\\\", \\\"gtfs\\\": false, \\\"date_utc\\\": \\\"1975-05-23\\\", \\\"devid\\\": \\\"sKnwBeAk those 01385750 cRGaw6n9\\\", \\\"signature\\\": \\\"issue\\\", \\\"iban\\\": \\\"GB60JXGZ2405749401836\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.37", "src_port": "51352", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381018650, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 310\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.14", "src_port": "51354", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381018651, "host_ip": "10.188.40.56", "data": "\"{\\\"route_type\\\": 167752971, \\\"stop_id\\\": 796496295, \\\"route_id\\\": \\\"tjvCq8LE say bag WQSwGzgQ\\\", \\\"look_backwards\\\": true, \\\"gtfs\\\": false, \\\"date_utc\\\": \\\"1970-04-29\\\", \\\"include_cancelled\\\": false, \\\"devid\\\": \\\"35434822 hospital\\\", \\\"signature\\\": \\\"35218224 whether r87N7FAs\\\", \\\"idCard\\\": \\\"116-07-3682\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51354", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381018753, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "80", "dest_port": "51354", "flags": "24", "is_pii": false} -{"timestamp": 1616381018754, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 173\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.6", "dest_ip": "10.20.16.248", "src_port": "51356", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381018755, "host_ip": "10.188.40.56", "data": "\"{\\\"route_type\\\": 849042608, \\\"stop_id\\\": 975898501, \\\"route_id\\\": \\\"whom\\\", \\\"look_backwards\\\": true, \\\"gtfs\\\": false, \\\"include_cancelled\\\": true, \\\"building\\\": \\\"8232\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.43", "dest_ip": "10.20.16.248", "src_port": "51356", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381018857, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 269\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.48", "src_port": "51358", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381018858, "host_ip": "10.188.40.56", "data": "\"{\\\"route_type\\\": 59616960, \\\"stop_id\\\": 29861937, \\\"route_id\\\": \\\"6sCBnceA statement 36637157 free analysis\\\", \\\"look_backwards\\\": true, \\\"expand\\\": null, \\\"devid\\\": \\\"79944438 into ahead just ZAKUhANd Ajn9GDYu\\\", \\\"signature\\\": \\\"size\\\", \\\"location\\\": \\\"24.727079\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.23", "dest_ip": "10.244.0.1", "src_port": "51358", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381018858, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "51358", "flags": "24", "is_pii": false} -{"timestamp": 1616381018860, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 326\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.13", "dest_ip": "10.20.16.248", "src_port": "51360", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381018860, "host_ip": "10.188.40.56", "data": "\"{\\\"route_type\\\": 1, \\\"stop_id\\\": -377302908, \\\"route_id\\\": \\\"identify wear dog 77788074\\\", \\\"direction_id\\\": 972590965, \\\"max_results\\\": 228056624, \\\"token\\\": \\\"respond 26453062 GShaCuXU eBrJ1svl\\\", \\\"devid\\\": \\\"jFSmgPRI family by\\\", \\\"signature\\\": \\\"dHAOcPhR class 56292773 parent view\\\", \\\"ReservationCode\\\": \\\"DBH2EK46\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "51360", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381018861, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "80", "dest_port": "51360", "flags": "24", "is_pii": false} -{"timestamp": 1616381018961, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 228\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51362", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381018962, "host_ip": "10.188.40.56", "data": "\"{\\\"route_type\\\": 3, \\\"stop_id\\\": 330780853, \\\"route_id\\\": \\\"21179880 pGLEPFFS own relate sfyZKubD by\\\", \\\"include_cancelled\\\": true, \\\"signature\\\": \\\"interest idykmjXh\\\", \\\"uUID\\\": \\\"7027cdccaf182651f9b1f55f2a564bfd5dcaaddd\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "51362", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381018964, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 132\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51364", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381018964, "host_ip": "10.188.40.56", "data": "\"{\\\"route_type\\\": 3, \\\"stop_id\\\": 668900774, \\\"route_id\\\": \\\"while 55638695\\\", \\\"gtfs\\\": false, \\\"city\\\": \\\"South Allisonborough\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.30", "dest_ip": "10.20.16.248", "src_port": "51364", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381019166, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 75\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.36", "src_port": "51366", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381019166, "host_ip": "10.188.40.56", "data": "\"{\\\"route_type\\\": 3, \\\"stop_id\\\": -483999037, \\\"include_cancelled\\\": true}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.36", "dest_ip": "10.20.16.248", "src_port": "51366", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381019270, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 71\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.33", "src_port": "51368", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381019271, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"45080963\\\", \\\"triggerid\\\": 632953113}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51368", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381019273, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 77\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51370", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381019273, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"whole 95707225\\\", \\\"triggerid\\\": -37669246}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.20", "dest_ip": "10.20.16.248", "src_port": "51370", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381019475, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 76\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.38", "dest_ip": "10.244.0.1", "src_port": "51372", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381019475, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"own daughter\\\", \\\"triggerid\\\": -810290760}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.59", "src_port": "51372", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381019579, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 63\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51374", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381019580, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"76904958 O7FWqd9p TzIBfSYk\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51374", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381019582, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 130\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "51376", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381019582, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"impact air 94546308 VLfdHwiv Republican jXEvdMFn\\\", \\\"count\\\": 682392114, \\\"offset\\\": -15329547}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.42", "dest_ip": "10.20.16.248", "src_port": "51376", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381019784, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 118\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51378", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381019784, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"wdKRLoUi HDtUhTcX investment responsibility discussion\\\", \\\"triggerid\\\": -153315026}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51378", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381019888, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 71\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.57", "src_port": "51380", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381019889, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"region last gu1BiQEb with xmygKtWg\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.28", "dest_ip": "10.244.0.57", "src_port": "51380", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381019891, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 87\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "51382", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381019891, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"give\\\", \\\"count\\\": 386529109, \\\"offset\\\": -535000637}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.41", "dest_ip": "10.20.16.248", "src_port": "51382", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381020093, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 143\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.18", "dest_ip": "10.20.16.248", "src_port": "51384", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381020093, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"QnzwVVWI 8mzbMccU half gas rock\\\", \\\"templateIdOrAlias\\\": \\\"certain use mention 3aR6pY4B KdKVHWZO 21459335\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51384", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381020197, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 86\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "51386", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381020198, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"always aJmnisFc\\\", \\\"templateIdOrAlias\\\": \\\"often\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51386", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381020200, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 144\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "51388", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381020200, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"painting night be zVEoYZww 40445234\\\", \\\"templateIdOrAlias\\\": \\\"OkjNQWDm in 28491336 attorney idea DnVGOPRR\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.100.150.125", "dest_ip": "10.244.0.59", "src_port": "51388", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381020403, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 53\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.33", "src_port": "51390", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381020403, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"herself AYVT7EbG\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51390", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381020510, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 66\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51392", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381020511, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"specific month class Dj6J7B4w\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.41", "src_port": "51392", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381020512, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 60\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51394", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381020513, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"trade standard 4R9xF3ck\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "51394", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381020715, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 103\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "51396", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381020715, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"moment\\\", \\\"tag\\\": \\\"45032957 couple\\\", \\\"fromdate\\\": \\\"2028-12-02\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51396", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381020819, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 133\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51398", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381020819, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"69291553 establish city vtfjjXnl street VSWgtwhQ\\\", \\\"tag\\\": \\\"bring\\\", \\\"todate\\\": \\\"1994-02-28\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51398", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381020822, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 102\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.28", "src_port": "51400", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381020823, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"low 53289210\\\", \\\"tag\\\": \\\"67895161\\\", \\\"fromdate\\\": \\\"2023-09-12\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.24", "src_port": "51400", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021025, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 116\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.23", "src_port": "51402", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021026, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"turn process RuKFmpzs\\\", \\\"fromdate\\\": \\\"1973-11-30\\\", \\\"todate\\\": \\\"2031-05-21\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "51402", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021128, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 88\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.57", "src_port": "51404", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021129, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"zDzXYAoy 98344786 yes\\\", \\\"fromdate\\\": \\\"1992-03-31\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "51404", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021131, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 112\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.18", "dest_ip": "10.20.16.248", "src_port": "51406", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021231, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"97486466 itself LOLsMaIp 8QSYHfCB reason system\\\", \\\"todate\\\": \\\"1971-07-05\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "51406", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021234, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 96\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.41", "src_port": "51408", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021235, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"mission chair 23771237 modern\\\", \\\"fromdate\\\": \\\"2016-04-17\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "51408", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021337, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 108\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.3", "dest_ip": "10.244.0.1", "src_port": "51410", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021338, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"change T7Qt0yYW\\\", \\\"tag\\\": \\\"3bHW9jrv high\\\", \\\"todate\\\": \\\"1973-04-02\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.43", "dest_ip": "10.20.16.248", "src_port": "51410", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021340, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 113\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.28", "src_port": "51412", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021440, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"attorney fear 83734425 AeYyBjYq FENiOlf8 support\\\", \\\"todate\\\": \\\"1988-03-05\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.15", "dest_ip": "10.20.16.248", "src_port": "51412", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021443, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 138\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.52", "dest_ip": "10.244.0.1", "src_port": "51414", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021444, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"stop aIuBvQSV 15458392 sell\\\", \\\"tag\\\": \\\"contain night tPREWTDp 50025862\\\", \\\"todate\\\": \\\"2017-04-12\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.44", "src_port": "51414", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021546, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 84\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.57", "src_port": "51416", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021547, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"attorney mPijXYhd\\\", \\\"fromdate\\\": \\\"1987-09-13\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.16", "src_port": "51416", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021548, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"attorney mPijXYhd\\\", \\\"fromdate\\\": \\\"1987-09-13\\\"}\"", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.7", "src_port": "80", "dest_port": "51416", "flags": "24", "is_pii": false} -{"timestamp": 1616381021549, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 103\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.36", "dest_ip": "10.20.16.248", "src_port": "51418", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021649, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"02702178\\\", \\\"fromdate\\\": \\\"2018-02-15\\\", \\\"todate\\\": \\\"1994-04-25\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.30", "dest_ip": "10.20.16.248", "src_port": "51418", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021652, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 50\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.28", "src_port": "51420", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021653, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"baby ecGPaZle\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.1", "src_port": "51420", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021755, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 54\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.13", "src_port": "51422", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021756, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"mRiAanni oKFnFtQD\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.26", "dest_ip": "10.20.16.248", "src_port": "51422", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021758, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 83\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51424", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021859, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"98119682 TDQITXvM\\\", \\\"messageid\\\": \\\"59663378\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.20.16.248", "src_port": "51424", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021860, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 107\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51426", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021861, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"attorney upon national Z1ZbVLUt\\\", \\\"messageid\\\": \\\"89194291 certainly\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51426", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021963, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 175\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.59", "src_port": "51428", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021964, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"everyone FXfjgo34 QUgXGnfn organization 77537366 call\\\", \\\"messageid\\\": \\\"lose uBeyrqwl candidate\\\", \\\"count\\\": 114, \\\"offset\\\": -1016465257}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.20.16.248", "src_port": "51428", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021965, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 266\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "51430", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381021966, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"jbCylKw7 ok jPrUrLaJ\\\", \\\"count\\\": -912438355, \\\"offset\\\": 336399760, \\\"recipient\\\": \\\"74804198 PM control ready U9XbzRVE AfaZItlA\\\", \\\"tag\\\": \\\"ZMbEEG7d develop\\\", \\\"country\\\": \\\"tICZaIBF history trip 33481631 uJWdQ7Ss political\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "51430", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381022067, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.14", "src_port": "80", "dest_port": "51430", "flags": "24", "is_pii": false} -{"timestamp": 1616381022068, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 130\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.17", "dest_ip": "10.20.16.248", "src_port": "51432", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381022069, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"pattern zXhHlysk\\\", \\\"messageid\\\": \\\"him 42339197 good\\\", \\\"count\\\": 351, \\\"offset\\\": 392951867}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.44", "src_port": "51432", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381022072, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 507\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51434", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381022073, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"aU6xeTZS may heart CrcvoZMa 43916241 enter\\\", \\\"count\\\": 229827308, \\\"offset\\\": 574585022, \\\"recipient\\\": \\\"phone sHGvoblJ 39205680 such\\\", \\\"tag\\\": \\\"offer 72589705 reach\\\", \\\"client_company\\\": \\\"hear cHZvNzWC 09948302 want\\\", \\\"client_family\\\": \\\"JGdaFHsM 45786007 night respond MskG5M10 sea\\\", \\\"os_family\\\": \\\"GMxIjSB1 60639438 assume HyqGzPnZ\\\", \\\"os_company\\\": \\\"qmWqdPJW because international 24962518 plan\\\", \\\"country\\\": \\\"couple by NTPbtenS collection bvDHKoyZ\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.18", "src_port": "51434", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381022172, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.24", "src_port": "80", "dest_port": "51434", "flags": "24", "is_pii": false} -{"timestamp": 1616381022173, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 245\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.20.16.248", "src_port": "51436", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381022174, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"LErBcZzv when 2SSeQEUm discussion 89422190 often\\\", \\\"count\\\": -135377664, \\\"offset\\\": 694520654, \\\"tag\\\": \\\"endiIrCW 8XdkJfr1\\\", \\\"status\\\": \\\"queued\\\", \\\"todate\\\": \\\"1971-12-13\\\", \\\"fromdate\\\": \\\"2012-04-07\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.20.16.248", "src_port": "51436", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381022276, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 118\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.29", "src_port": "51438", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381022277, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"production she PCP3EXxB 72274829 qIUUCQSL voice\\\", \\\"messageid\\\": \\\"ahead current\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.41", "src_port": "51438", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381022279, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 69\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.33", "src_port": "51440", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381022379, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"war\\\", \\\"messageid\\\": \\\"UcmKR5qZ\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51440", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381022589, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 100\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "51442", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381022589, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"case\\\", \\\"messageid\\\": \\\"36054251 discover EEvwWNqS WbdJSjQi do\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.33", "src_port": "51442", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381022795, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 300\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51444", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381022795, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"aypcdDyW lFKKVcrH place successful\\\", \\\"count\\\": 465040799, \\\"offset\\\": 399768142, \\\"subject\\\": \\\"gVKJAru4 77494705 Yqofxcep middle reason even\\\", \\\"tag\\\": \\\"fXfDoayK 14046383 peace\\\", \\\"status\\\": \\\"queued\\\", \\\"todate\\\": \\\"2020-05-04\\\", \\\"fromdate\\\": \\\"1983-06-14\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.27", "dest_ip": "10.244.0.1", "src_port": "51444", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381022796, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "51444", "flags": "24", "is_pii": false} -{"timestamp": 1616381022798, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 56\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.47", "dest_ip": "10.244.0.1", "src_port": "51446", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381022897, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"GbvcuEHx generation\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51446", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381022900, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 86\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.33", "src_port": "51448", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381022901, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"UmAUYDJH strategy rule 55546823 HqSPHCId describe\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.20", "src_port": "51448", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381023208, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 69\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "51450", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381023208, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"TUN6xCF7 KhdnJUkx 28301656 voice\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.24", "dest_ip": "10.244.0.1", "src_port": "51450", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381023212, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 65\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51452", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381023212, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"00636807 blue carry h5FMrTdF\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.15", "src_port": "51452", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381023414, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 65\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "51454", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381023414, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"SwsSisZG 30353056 social oil\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.59", "src_port": "51454", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381023620, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 121\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51456", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381023620, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"opportunity QCLFmyXH president 98864166 gBpybdBy\\\", \\\"bounceid\\\": -3857657770414514027}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.41", "dest_ip": "10.20.16.248", "src_port": "51456", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381023623, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 95\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "51458", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381023723, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"chair 71879737 BhmdRQQK\\\", \\\"bounceid\\\": 3218118710695702776}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.52", "src_port": "51458", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381023726, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 98\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.61", "dest_ip": "10.244.0.47", "src_port": "51460", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381023727, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"morning vIlXAnRz 87031962\\\", \\\"bounceid\\\": -1941997567817511478}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.41", "dest_ip": "10.20.16.248", "src_port": "51460", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381023931, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 53\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51462", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381023931, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"Y1iIOZOP surface\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.34", "src_port": "51462", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381023934, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 168\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.58", "src_port": "51464", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024035, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"south 35382789\\\", \\\"count\\\": -215532757, \\\"offset\\\": 201213009, \\\"type\\\": \\\"Unknown\\\", \\\"inactive\\\": true, \\\"todate\\\": \\\"2033-07-11\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.43", "dest_ip": "10.20.16.248", "src_port": "51464", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024037, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 42\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.18", "src_port": "51466", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024037, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"fast\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.39", "dest_ip": "10.20.16.248", "src_port": "51466", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024242, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 84\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.26", "dest_ip": "10.244.0.1", "src_port": "51468", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024243, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"later enjoy YDSfPKPA\\\", \\\"serverid\\\": -697253577}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.21", "dest_ip": "10.20.16.248", "src_port": "51468", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024345, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 98\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.52", "dest_ip": "10.244.0.50", "src_port": "51470", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024346, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"u0SwLMct 90786909 subject oEegpnWH\\\", \\\"serverid\\\": -319199905}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.31", "dest_ip": "10.20.16.248", "src_port": "51470", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024348, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 108\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.59", "src_port": "51472", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024448, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"water 49526242 work PBjYsxbU ne1ZVa1I writer\\\", \\\"serverid\\\": -622104349}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.24", "src_port": "51472", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024452, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 43\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.44", "src_port": "51474", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024452, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"sense\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.15", "dest_ip": "10.20.16.248", "src_port": "51474", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024555, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 144\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51476", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024556, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"veTsZLTu star analysis capital 02917624\\\", \\\"count\\\": 595155097, \\\"offset\\\": -844276679, \\\"name\\\": \\\"those\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.33", "dest_ip": "10.20.16.248", "src_port": "51476", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024557, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 115\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51478", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024658, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"zctytiLZ FtaI2k6B 44191789 without deal continue\\\", \\\"signatureid\\\": -535473335}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.36", "src_port": "51478", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024661, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 88\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51480", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024662, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"HgSKwiql talk Wj7SGPAu\\\", \\\"signatureid\\\": 531055714}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51480", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024866, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 89\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51482", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024867, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"MrtCEyG7 unit xDVIpklr\\\", \\\"signatureid\\\": -252763839}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51482", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024868, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 112\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.20.16.248", "src_port": "51484", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024968, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"think UbNJSEMu qUXtDXbe thank 32646965 culture\\\", \\\"signatureid\\\": 310983232}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "51484", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024971, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 83\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "51486", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381024972, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"14252081 nzgDNPSa\\\", \\\"signatureid\\\": 401602455}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.57", "src_port": "51486", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381025177, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 74\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.32", "dest_ip": "10.244.0.1", "src_port": "51488", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381025178, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"zI5xcb8E\\\", \\\"signatureid\\\": 651638682}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.24", "src_port": "51488", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381025382, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 67\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.2", "dest_ip": "10.244.0.1", "src_port": "51490", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381025382, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"XZPHGGmk uMcHu0Iq card factor\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.34", "dest_ip": "10.244.0.50", "src_port": "51490", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381025385, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 114\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "51492", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381025485, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"UAN5qikV 43505332 jbYhNrwR run network\\\", \\\"count\\\": 33, \\\"offset\\\": 804211649}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.1", "src_port": "51492", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381025489, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 117\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "51494", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381025489, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"VIqmweZD whom 38787703 M7sX5f1m officer administration\\\", \\\"domainid\\\": 882274159}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.36", "dest_ip": "10.20.16.248", "src_port": "51494", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381025693, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 103\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "51496", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381025693, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"discuss 26901043 xgrUAe03 recently prove\\\", \\\"domainid\\\": 834122755}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51496", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381025797, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 113\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.52", "dest_ip": "10.244.0.50", "src_port": "51498", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381025797, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"research specific vrsq96VB 91511372 film XaaZxnSj\\\", \\\"domainid\\\": -197762072}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.59", "src_port": "51498", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381025801, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 80\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "51500", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381025801, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"despite ufXEgHvc\\\", \\\"domainid\\\": -866261437}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.244.0.1", "src_port": "51500", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026003, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 82\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "51502", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026003, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"move fCJdXYYu seem\\\", \\\"domainid\\\": -746124794}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.32", "src_port": "51502", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026006, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 79\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.244.0.48", "src_port": "51504", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026107, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"04118190 central\\\", \\\"domainid\\\": -84263411}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.100.150.125", "dest_ip": "10.244.0.59", "src_port": "51504", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026110, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 85\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51506", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026111, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"get 01697843 qS0rfsJ0\\\", \\\"domainid\\\": -787230189}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.59", "src_port": "51506", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026313, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 85\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.18", "src_port": "51508", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026313, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"IKvxU2Jn 34145429 crime AWSTGxyW Congress those\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "51508", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026316, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 91\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.10", "src_port": "51510", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026416, "host_ip": "10.188.40.56", "data": "\"{\\\"X-Postmark-Account-Token\\\": \\\"hear 40893947\\\", \\\"count\\\": 390, \\\"offset\\\": -129131774}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.14", "dest_ip": "10.20.16.248", "src_port": "51510", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026420, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 94\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.30", "src_port": "51512", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026420, "host_ip": "10.188.40.56", "data": "\"{\\\"property\\\": \\\"up step\\\", \\\"repository\\\": \\\"population xl9dDrBQ report 17042741 success\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.13", "src_port": "51512", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026522, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 35\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.10", "dest_ip": "10.20.16.248", "src_port": "51514", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026523, "host_ip": "10.188.40.56", "data": "\"{\\\"property\\\": \\\"78927478 last\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51514", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026525, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 49\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.10", "src_port": "51516", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026625, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"38644727 2TGdayRZ special\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.23", "dest_ip": "10.244.0.1", "src_port": "51516", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026629, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 45\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51518", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026629, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"girl 46194855 Zwu7zLpt side\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.43", "dest_ip": "10.20.16.248", "src_port": "51518", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026732, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 59\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.23", "dest_ip": "10.20.16.248", "src_port": "51520", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026733, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"bring vUJw9Sax art ZknmtNFt 40599521 soon\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "51520", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026734, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 35\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.39", "src_port": "51522", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026835, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"cpSpGghx yfyorOhB\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.33", "src_port": "51522", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026839, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 59\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51524", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381026839, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"realize worker YeLkDjH1 92055916 wAYHMlQx\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.21", "dest_ip": "10.244.0.1", "src_port": "51524", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027043, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 47\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "51526", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027043, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"98298354 eight chair 30YzLhNd\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.27", "src_port": "51526", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027147, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 26\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51528", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027148, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"58992360\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.19", "src_port": "51528", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027150, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 40\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51530", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027251, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"uuXPYRfZ its can\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "51530", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027252, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 35\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.47", "src_port": "51532", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027253, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"Ck2f9wVF do\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.32", "src_port": "51532", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027356, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 48\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.1", "src_port": "51534", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027357, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"parent ThUcZWCR over two\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.21", "dest_ip": "10.20.16.248", "src_port": "51534", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027360, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 67\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.33", "dest_ip": "10.20.16.248", "src_port": "51536", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027460, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"27051263 learn boy PKQidqNE appear ELzw8eyH\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.13", "dest_ip": "10.20.16.248", "src_port": "51536", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027464, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 144\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.244.0.50", "src_port": "51538", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027464, "host_ip": "10.188.40.56", "data": "\"{\\\"from\\\": \\\"33359288 uNTHKpkN EM4966U7 describe will skin\\\", \\\"to\\\": \\\"four T9fhNA85 together OLlmGxTN\\\", \\\"repository\\\": \\\"NkIdtmbl check\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.41", "src_port": "51538", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027567, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 72\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51540", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027568, "host_ip": "10.188.40.56", "data": "\"{\\\"clone\\\": true, \\\"repository\\\": \\\"dMlfiTpa actually read 53675470\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.59", "src_port": "51540", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027570, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 63\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.20.16.248", "src_port": "51542", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027670, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"produce jFjSoVgr 81122198 xjfVfL5B good\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.20", "dest_ip": "10.20.16.248", "src_port": "51542", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027673, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 69\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.21", "src_port": "51544", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027674, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"75474908 wxQcHyel Bz3CfJOz this indicate each\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.50", "src_port": "51544", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027878, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 49\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51546", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027878, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"finNBWor O7lFrnv2 ability\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.18", "src_port": "51546", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027881, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 32\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51548", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027981, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"M0qrOIhX\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51548", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027984, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 68\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51550", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381027985, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"morning great off 42879794 jUAYpJtq GQjfsKYu\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51550", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381028189, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 50\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.49", "src_port": "51552", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381028189, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"church born Aq5e0z5y until\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.52", "src_port": "51552", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381028293, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 51\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.61", "dest_ip": "10.244.0.47", "src_port": "51554", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381028293, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"else else B55YYFN3 02526121\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "51554", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381028296, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 42\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51556", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381028296, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"necessary 7yScgqF4\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.40", "src_port": "51556", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381028500, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 63\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.22", "src_port": "51558", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381028500, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"iKkRYuIM citizen Ovt0DQl1 name 19345817\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.55", "src_port": "51558", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381028504, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 53\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51560", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381028603, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"case development 60671706 why\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.28", "src_port": "51560", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381028606, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 29\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.13", "src_port": "51562", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381028607, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"price\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.42", "src_port": "51562", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381028811, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 51\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.61", "dest_ip": "10.244.0.1", "src_port": "51564", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381028811, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"treat power RgHqCWyO attack\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.30", "dest_ip": "10.20.16.248", "src_port": "51564", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381028815, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 32\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "51566", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381028914, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"campaign\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51566", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029124, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 42\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.3", "dest_ip": "10.244.0.1", "src_port": "51568", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029124, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"D1GCRk5c go minute\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.15", "dest_ip": "10.244.0.57", "src_port": "51568", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029228, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 32\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.39", "dest_ip": "10.244.0.1", "src_port": "51570", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029228, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"50603486\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.58", "dest_ip": "10.20.16.248", "src_port": "51570", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029231, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 56\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "51572", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029232, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"85313006 white ucovcAFs DivFeqVh\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "51572", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029434, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 62\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.244.0.50", "src_port": "51574", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029434, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"6WnDb44h mfWYsDdp 70749004 assume view\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.32", "src_port": "51574", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029538, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 90\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.52", "src_port": "51576", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029539, "host_ip": "10.188.40.56", "data": "\"{\\\"synchronous\\\": true, \\\"repository\\\": \\\"dpBCWdHV arrive 51416238 me region anfRDaFM\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51576", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029541, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 94\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.34", "dest_ip": "10.20.16.248", "src_port": "51578", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029641, "host_ip": "10.188.40.56", "data": "\"{\\\"to\\\": 4358977348892645226, \\\"repository\\\": \\\"there 26086763 LRZvpAGf OqermSql language\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.18", "dest_ip": "10.20.16.248", "src_port": "51578", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029645, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 36\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.25", "dest_ip": "10.20.16.248", "src_port": "51580", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029645, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"bdqafJfG new\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.3", "dest_ip": "10.20.16.248", "src_port": "51580", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029748, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 68\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.32", "src_port": "51582", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029749, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"someone aJ0O6mh5 ground my TtGzGKPS 31653640\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.41", "src_port": "51582", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029751, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 37\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.36", "src_port": "51584", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029851, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"shake through\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.37", "src_port": "51584", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029854, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 61\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.24", "src_port": "51586", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029855, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"25188771 4O9FmOJP democratic giIOOZrC\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.30", "dest_ip": "10.20.16.248", "src_port": "51586", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029957, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 38\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "51588", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029958, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"month OyGoLVlK\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.52", "dest_ip": "10.244.0.50", "src_port": "51588", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381029960, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 25\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51590", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381030060, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"I\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.43", "dest_ip": "10.20.16.248", "src_port": "51590", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381030063, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 52\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "51592", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381030064, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"leader sit axHSxRDr TjzoaTIN\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.39", "dest_ip": "10.20.16.248", "src_port": "51592", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381030166, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 66\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.43", "dest_ip": "10.20.16.248", "src_port": "51594", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381030166, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"lLYsAEvp include 76080102 RAwweHJK subject\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.16", "dest_ip": "10.20.16.248", "src_port": "51594", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381030169, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 61\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.38", "dest_ip": "10.244.0.57", "src_port": "51596", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381030170, "host_ip": "10.188.40.56", "data": "\"{\\\"repository\\\": \\\"media close receive 28760408 oVyGxQMi\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "51596", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381030372, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 105\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51598", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381030372, "host_ip": "10.188.40.56", "data": "\"{\\\"sourceProjectKey\\\": \\\"population bMTZtZhA serious entire\\\", \\\"destinationProjectKey\\\": \\\"rYSdNXNJ\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.21", "src_port": "51598", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381030476, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 43\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "51600", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381030476, "host_ip": "10.188.40.56", "data": "\"{\\\"key\\\": \\\"strategy 94628580 national\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.244.0.50", "src_port": "51600", "dest_port": "80", "flags": "24", "is_pii": true} -{"timestamp": 1616381030479, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 62\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51602", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381030480, "host_ip": "10.188.40.56", "data": "\"{\\\"key\\\": \\\"fire 74561038 EkZkBbUZ maintain hope zUIDO7mW\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.25", "dest_ip": "10.244.0.50", "src_port": "51602", "dest_port": "80", "flags": "24", "is_pii": true} -{"timestamp": 1616381030682, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 40\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.100.150.125", "dest_ip": "10.244.0.59", "src_port": "51604", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381030682, "host_ip": "10.188.40.56", "data": "\"{\\\"key\\\": \\\"35764223 enjoy aybrARHZ\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.52", "dest_ip": "10.244.0.50", "src_port": "51604", "dest_port": "80", "flags": "24", "is_pii": true} -{"timestamp": 1616381030786, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 25\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.33", "dest_ip": "10.244.0.48", "src_port": "51606", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381030786, "host_ip": "10.188.40.56", "data": "\"{\\\"key\\\": \\\"98900749\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.58", "dest_ip": "10.244.0.50", "src_port": "51606", "dest_port": "80", "flags": "24", "is_pii": true} -{"timestamp": 1616381030789, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 25\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.19", "dest_ip": "10.20.16.248", "src_port": "51608", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381030790, "host_ip": "10.188.40.56", "data": "\"{\\\"key\\\": \\\"o3K981bZ\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.50", "src_port": "51608", "dest_port": "80", "flags": "24", "is_pii": true} -{"timestamp": 1616381030992, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 65\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.30", "src_port": "51610", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381030992, "host_ip": "10.188.40.56", "data": "\"{\\\"key\\\": \\\"3pWqRMh2 LujGSYXg action move 05698736 situation\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.58", "src_port": "51610", "dest_port": "80", "flags": "24", "is_pii": true} -{"timestamp": 1616381031096, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 61\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.24", "dest_ip": "10.20.16.248", "src_port": "51612", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381031096, "host_ip": "10.188.40.56", "data": "\"{\\\"key\\\": \\\"23349452 skin XNcr7Wsf real baLeVAED natural\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.244.0.50", "src_port": "51612", "dest_port": "80", "flags": "24", "is_pii": true} -{"timestamp": 1616381031099, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 27\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.1", "src_port": "51614", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381031100, "host_ip": "10.188.40.56", "data": "\"{\\\"key\\\": \\\"plant pass\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.244.0.50", "src_port": "51614", "dest_port": "80", "flags": "24", "is_pii": true} -{"timestamp": 1616381031302, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 56\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.29", "src_port": "51616", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381031302, "host_ip": "10.188.40.56", "data": "\"{\\\"key\\\": \\\"well 00558692 lQhlNvMs bnjUao81 message\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.58", "src_port": "51616", "dest_port": "80", "flags": "24", "is_pii": true} -{"timestamp": 1616381031406, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 54\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.31", "src_port": "51618", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381031406, "host_ip": "10.188.40.56", "data": "\"{\\\"key\\\": \\\"MHbjkwJL 88633179 XlKFhzto with happy\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.33", "src_port": "51618", "dest_port": "80", "flags": "24", "is_pii": true} -{"timestamp": 1616381031409, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 36\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "51620", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381031409, "host_ip": "10.188.40.56", "data": "\"{\\\"key\\\": \\\"heart Congress long\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.244.0.50", "src_port": "51620", "dest_port": "80", "flags": "24", "is_pii": true} -{"timestamp": 1616381031613, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 47\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "51622", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381031613, "host_ip": "10.188.40.56", "data": "\"{\\\"key\\\": \\\"HoIV2WB8 probably determine my\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "51622", "dest_port": "80", "flags": "24", "is_pii": true} -{"timestamp": 1616381031717, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 46\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51624", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381031717, "host_ip": "10.188.40.56", "data": "\"{\\\"key\\\": \\\"fill senior 10967520 zRkljKtC\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.25", "dest_ip": "10.244.0.50", "src_port": "51624", "dest_port": "80", "flags": "24", "is_pii": true} -{"timestamp": 1616381031720, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 58\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51626", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381031721, "host_ip": "10.188.40.56", "data": "\"{\\\"key\\\": \\\"aD0dve2O AOgMfFbP 64596564 me spring road\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.14", "src_port": "51626", "dest_port": "80", "flags": "24", "is_pii": true} -{"timestamp": 1616381031923, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 47\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.20.16.248", "src_port": "51628", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381031923, "host_ip": "10.188.40.56", "data": "\"{\\\"key\\\": \\\"56367949 Zhi6XS21 vwgMZMIm arm\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.57", "src_port": "51628", "dest_port": "80", "flags": "24", "is_pii": true} -{"timestamp": 1616381032027, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 25\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.29", "src_port": "51630", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381032027, "host_ip": "10.188.40.56", "data": "\"{\\\"key\\\": \\\"68506193\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.50", "src_port": "51630", "dest_port": "80", "flags": "24", "is_pii": true} -{"timestamp": 1616381032030, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 42\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "51632", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381032030, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"weight kfjkdkKd business\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51632", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381032234, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 59\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.35", "src_port": "51634", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381032234, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"put nature 88787039 OOONClUu rkP80cY6 own\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51634", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381032237, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 56\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.3", "src_port": "51636", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381032337, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"answer 88636276 IrtEjXmT read p67ViBEY\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51636", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381032444, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 66\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.46", "src_port": "51638", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381032444, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"97519064 security other reveal AnINmLcA fSKKrr2j\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "51638", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381032447, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 30\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.33", "src_port": "51640", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381032447, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"professional\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.27", "dest_ip": "10.20.16.248", "src_port": "51640", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381032650, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"professional\\\"}\"", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "80", "dest_port": "51640", "flags": "24", "is_pii": false} -{"timestamp": 1616381032651, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 91\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.30", "dest_ip": "10.20.16.248", "src_port": "51642", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381032652, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"mg8mQXys environmental opportunity 57379633\\\", \\\"action\\\": \\\"16070743 gas\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51642", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381032754, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 35\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "51644", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381032754, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"82505429 ewlqTWeG\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "51644", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381032757, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 31\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "51646", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381032757, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"body 95194923\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.58", "dest_ip": "10.20.16.248", "src_port": "51646", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381032961, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 62\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.52", "dest_ip": "10.244.0.48", "src_port": "51648", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381032962, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"live mDXhTiKn situation traditional 25627656\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "51648", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381033064, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 56\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.44", "src_port": "51650", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381033064, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"American toward born 8Sr3tENw 78717000\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51650", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381033067, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 47\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.39", "src_port": "51652", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381033067, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"teach while 46993613 wWwIE9HE\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "51652", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381033271, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 40\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.14", "src_port": "51654", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381033271, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"view 96142049 LRj1AaaC\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51654", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381033477, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 66\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.32", "src_port": "51656", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381033477, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"think t5xTWl1Z\\\", \\\"action\\\": \\\"aVyGPhqi through\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51656", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381033479, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 39\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.21", "dest_ip": "10.20.16.248", "src_port": "51658", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381033579, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"01907296 challenge at\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "51658", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381033582, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 45\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.61", "src_port": "51660", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381033583, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"very fish 32148649 jxcfRldg\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.27", "dest_ip": "10.20.16.248", "src_port": "51660", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381033787, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 91\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.42", "dest_ip": "10.20.16.248", "src_port": "51662", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381033787, "host_ip": "10.188.40.56", "data": "\"{\\\"action\\\": \\\"too market if C2Od835w 55708639\\\", \\\"name\\\": \\\"47775516 aHedZjWg nearly\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.27", "src_port": "51662", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381033891, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 42\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "51664", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381033891, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"GZytiAqi create 32156512\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51664", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381033996, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 22\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.18", "src_port": "51666", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381033997, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"fill\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "51666", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381033998, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 25\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.48", "src_port": "51668", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381033999, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"teacher\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.39", "src_port": "51668", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381034201, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 28\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.35", "src_port": "51670", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381034201, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"use choose\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51670", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381034305, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 52\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.21", "src_port": "51672", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381034306, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"40238733 WepjOEZf road YwHjBers to\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.13", "src_port": "51672", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381034307, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 58\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "51674", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381034308, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"market become 86479492 VlarePHL LKuklkCb\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51674", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381034510, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 26\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.20.16.248", "src_port": "51676", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381034510, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"gUyIJiXg\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51676", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381034614, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 31\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.58", "dest_ip": "10.244.0.1", "src_port": "51678", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381034615, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"take oatOaMwM\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.25", "src_port": "51678", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381034616, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 29\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.34", "dest_ip": "10.244.0.50", "src_port": "51680", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381034617, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"size behind\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "51680", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381034819, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 44\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.59", "src_port": "51682", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381034819, "host_ip": "10.188.40.56", "data": "\"{\\\"name\\\": \\\"end also 70994268 7d5Tidzf\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51682", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381034923, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 89\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.19", "src_port": "51684", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381034924, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"83893234 prevent\\\", \\\"Phrase\\\": \\\"above TZOdFLbo ZIdzhmaF nearly\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "51684", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381034925, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 104\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51686", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035026, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"remain CZTQdoGs drug\\\", \\\"Name\\\": \\\"explain I5mWYdmi LPddWAXM safe can 38429903\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51686", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035029, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 94\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51688", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035030, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"garden XteCHIbP organization\\\", \\\"imdbID\\\": \\\"short fBTi3Ecz sOstOnwe\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.1", "src_port": "51688", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035132, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 115\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.18", "src_port": "51690", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035133, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"GTEBTtKX 98024701 sign head\\\", \\\"imdbID\\\": \\\"5xQon058 computer he QtaQHOMi 55164574 choose\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.16", "dest_ip": "10.20.16.248", "src_port": "51690", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035135, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 100\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.46", "dest_ip": "10.20.16.248", "src_port": "51692", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035235, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"wUMBLeQr fine live MuFjXUta 70994457\\\", \\\"Query\\\": \\\"xHNFeCaN 0ELQsaUW fine\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "51692", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035238, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 131\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.23", "src_port": "51694", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035239, "host_ip": "10.188.40.56", "data": "\"{\\\"accesstoken\\\": \\\"jreseeo8 once\\\", \\\"id\\\": \\\"tell 33932058 hair set sixYJBS4 QhAMTqXl\\\", \\\"imdbID\\\": \\\"jq65Ozfa behind sport\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.10", "src_port": "51694", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035341, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 91\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.25", "dest_ip": "10.244.0.50", "src_port": "51696", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035342, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"13717866 xNW1RpuF place imagine HczkCLmG\\\", \\\"Query\\\": \\\"not carry\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.32", "dest_ip": "10.20.16.248", "src_port": "51696", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035343, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 79\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.39", "src_port": "51698", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035444, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"Jx7ja78L travel 85694826 local\\\", \\\"Name\\\": \\\"attorney\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.53", "dest_ip": "10.244.0.61", "src_port": "51698", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035447, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 103\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.49", "src_port": "51700", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035448, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"present remember iratDUCw huge CqbyXZWS\\\", \\\"imdbID\\\": \\\"nPxSmUuH nbOWnIlQ boy\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.59", "src_port": "51700", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035550, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 80\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "51702", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035551, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"434mSuLc as\\\", \\\"ArtistID\\\": \\\"degree kXwonDMl 57493947\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51702", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035552, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 146\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.23", "src_port": "51704", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035653, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"CpPXDGcI ueULKbqP 84688233 action anything especially\\\", \\\"AlbumID\\\": \\\"popular hNwLjqRY success number 19061710 hzlHs1BG\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51704", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035656, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 99\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.39", "dest_ip": "10.20.16.248", "src_port": "51706", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035657, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"base maIdwERU 40035543 jbb5x4cZ\\\", \\\"Song\\\": \\\"cHFFWppI sort take 83005907\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.12", "src_port": "51706", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035861, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 113\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51708", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035861, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"38979209 LYgiaBEn hVjyn2se week example study\\\", \\\"Name\\\": \\\"material scientist GBs0bC2N\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51708", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035965, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 89\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.45", "src_port": "51710", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035965, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"HBPmW6v6 bENEVwNs 28356233 anyone not\\\", \\\"AlbumID\\\": \\\"MiUjckBc\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.30", "dest_ip": "10.20.16.248", "src_port": "51710", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035968, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 75\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.17", "src_port": "51712", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381035969, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"question RcdwmwiZ JdxDx2Ye\\\", \\\"Name\\\": \\\"45722006\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.13", "dest_ip": "10.244.0.1", "src_port": "51712", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381036171, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 83\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51714", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381036172, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"oUHUfauu no because\\\", \\\"Name\\\": \\\"25763428 month CeRnFAqS\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.57", "src_port": "51714", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381036274, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 67\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51716", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381036274, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"Nx9Z9apK 57173174 media\\\", \\\"Name\\\": \\\"our\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.59", "src_port": "51716", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381036276, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 103\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.14", "dest_ip": "10.20.16.248", "src_port": "51718", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381036276, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"eye pass\\\", \\\"ArtistID\\\": \\\"XWZNY1GP rSnuZkTS figure 77739208 something listen\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.19", "src_port": "51718", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381036480, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 70\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.31", "dest_ip": "10.20.16.248", "src_port": "51720", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381036481, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"57608443\\\", \\\"ArtistID\\\": \\\"XtZo5qCF 45597135\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51720", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381036482, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 103\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.20.16.248", "src_port": "51722", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381036582, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"point 12624295 zhaZEjBI X7PRuktO keep song\\\", \\\"MBID\\\": \\\"trip people 12OTKcTy\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.10", "dest_ip": "10.20.16.248", "src_port": "51722", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381036585, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 122\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51724", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381036586, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"agent 96883573 eZglFHlt dsi7DeWL up eye\\\", \\\"MBID\\\": \\\"ogAHLCEE build affect go unVFZuPp 96995763\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "51724", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381036688, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 65\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.5", "dest_ip": "10.244.0.1", "src_port": "51726", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381036689, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"HVvfbldF 08623487\\\", \\\"AlbumID\\\": \\\"book\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.57", "src_port": "51726", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381036691, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 102\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.52", "dest_ip": "10.244.0.50", "src_port": "51728", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381036791, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"gmKBdcOh country cover whether 78521628\\\", \\\"Query\\\": \\\"support case cGeaeoQc\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51728", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381036794, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 123\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.58", "dest_ip": "10.244.0.1", "src_port": "51730", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381036795, "host_ip": "10.188.40.56", "data": "\"{\\\"accesstoken\\\": \\\"39365588 DdhtuGlV finally VA9Me5xA reach artist\\\", \\\"imdbID\\\": \\\"srBJWLyf 75201938 R6yzLUkt season\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.12", "src_port": "51730", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381036897, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 90\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.27", "src_port": "51732", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381036898, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"P8A83y7P moment individual stand ydaALWPM\\\", \\\"TVShow\\\": \\\"itself\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51732", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381037104, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 119\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51734", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381037104, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"still 6PYnzUE5 96490825 hit\\\", \\\"Query\\\": \\\"player audience ak2OmXn6 23902628 officer UoHrLRVa\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.58", "dest_ip": "10.244.0.1", "src_port": "51734", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381037208, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 88\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "51736", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381037208, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"week\\\", \\\"imdbID\\\": \\\"international those geAHnWSn kVmDf3wS use\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51736", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381037211, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 59\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.24", "dest_ip": "10.20.16.248", "src_port": "51738", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381037312, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"oPQvrMRy\\\", \\\"Date\\\": \\\"2007-05-02\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.24", "dest_ip": "10.244.0.48", "src_port": "51738", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381037315, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 120\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.38", "src_port": "51740", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381037316, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"JtdMeiUE TstBZKOg 30176984 story\\\", \\\"Date\\\": \\\"2005-06-11\\\", \\\"drivingLicense\\\": \\\"290-25-9742\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.28", "src_port": "51740", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381037418, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 116\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.46", "dest_ip": "10.244.0.48", "src_port": "51742", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381037418, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"62498953 support lEh04hTd hundred\\\", \\\"Date\\\": \\\"1997-01-20\\\", \\\"phone\\\": \\\"+1-971-133-5105\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.2", "dest_ip": "10.20.16.248", "src_port": "51742", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381037421, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 92\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.33", "src_port": "51744", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381037522, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"race finish\\\", \\\"Date\\\": \\\"1998-10-18\\\", \\\"Company\\\": \\\"Coleman LLC\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.17", "src_port": "51744", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381037525, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 103\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.28", "src_port": "51746", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381037526, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"father aKvEqAyR most JgfPfcxe\\\", \\\"Date\\\": \\\"2002-06-01\\\", \\\"Building\\\": \\\"123\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.58", "dest_ip": "10.244.0.1", "src_port": "51746", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381037730, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 94\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.33", "dest_ip": "10.20.16.248", "src_port": "51748", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381037730, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"im7PjXLe\\\", \\\"Date\\\": \\\"2018-09-18\\\", \\\"ReservationCode\\\": \\\"KPGRH3MM\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.44", "src_port": "51748", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381037732, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 122\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.19", "dest_ip": "10.20.16.248", "src_port": "51750", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381037832, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"kE10Dv2h rtEoCtFe grow religious\\\", \\\"Date\\\": \\\"2018-09-16\\\", \\\"Dba\\\": \\\"Baker, Riley and Goodman\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.32", "dest_ip": "10.244.0.1", "src_port": "51750", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381037835, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 92\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.17", "dest_ip": "10.20.16.248", "src_port": "51752", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381037836, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"VirmDihB cut\\\", \\\"Date\\\": \\\"1989-07-10\\\", \\\"User\\\": \\\"Warren Bowers\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.59", "src_port": "51752", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381038040, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 111\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.27", "dest_ip": "10.20.16.248", "src_port": "51754", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381038040, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"section believe VQCBnCrc VjuiDxby both\\\", \\\"Date\\\": \\\"2004-05-28\\\", \\\"house\\\": \\\"01884\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "51754", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381038043, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 103\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51756", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381038144, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"lN1BacaP ZiUsSDST\\\", \\\"Date\\\": \\\"2000-06-15\\\", \\\"reservationCode\\\": \\\"8VXX2VSV\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.27", "dest_ip": "10.20.16.248", "src_port": "51756", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381038145, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 111\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.24", "src_port": "51758", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381038146, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"break CGFpUJZf shake 27472073\\\", \\\"Date\\\": \\\"1985-08-30\\\", \\\"Passport\\\": \\\"671-67-5830\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "51758", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381038350, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 110\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.36", "src_port": "51760", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381038350, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"truth bySziHAQ all MZethnBv trip\\\", \\\"Date\\\": \\\"1973-02-06\\\", \\\"PostalCode\\\": \\\"55072\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.3", "src_port": "51760", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381038353, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 106\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.244.0.50", "src_port": "51762", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381038453, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"xxnyJkDq r8l58cFk gun wall\\\", \\\"Date\\\": \\\"1977-10-22\\\", \\\"idCard\\\": \\\"041-54-2399\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.34", "src_port": "51762", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381038457, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 99\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.8", "src_port": "51764", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381038457, "host_ip": "10.188.40.56", "data": "\"{\\\"Accesstoken\\\": \\\"spring s5N0Rhff pgFlvjNQ book 82173214\\\", \\\"Query\\\": \\\"red modern HFnl6dRZ\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.20.16.248", "src_port": "51764", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381038661, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 80\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.29", "src_port": "51766", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381038661, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"TV service\\\", \\\"imdbID\\\": \\\"GnUstuEG then push MC6ZfuIv\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51766", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381038867, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 87\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.29", "src_port": "51768", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381038868, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"to IAzrTCRx political\\\", \\\"Query\\\": \\\"dTxl9OTQ couple 22697981\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51768", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381038870, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 83\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.22", "dest_ip": "10.244.0.1", "src_port": "51770", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381038969, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"information so audience\\\", \\\"ID\\\": \\\"top 54444629 6q3fJVmI\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "51770", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381038972, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 123\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.20.16.248", "src_port": "51772", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381038973, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"s0OIzYvb 12053554 QRfqtekQ of special\\\", \\\"ID\\\": \\\"meeting perhaps 08294924 RAWABGvR 5StNp0tH good\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.26", "dest_ip": "10.20.16.248", "src_port": "51772", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381039177, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 82\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.23", "src_port": "51774", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381039178, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"86703422 figure\\\", \\\"Name\\\": \\\"42820369 ke11dEA0 WUxYJthd\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.28", "dest_ip": "10.20.16.248", "src_port": "51774", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381039280, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 100\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.23", "dest_ip": "10.20.16.248", "src_port": "51776", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381039280, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"YEV7u1jc xFsOVNTd nearly above 95635082 whether\\\", \\\"Showname\\\": \\\"AlxZvAOH\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.13", "src_port": "51776", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381039283, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 126\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.25", "src_port": "51778", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381039283, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"subject 76315005 VpYMOQBp discussion\\\", \\\"ID\\\": \\\"TV 65045038\\\", \\\"Season\\\": \\\"ebyCmFrv line 79586988\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.14", "dest_ip": "10.20.16.248", "src_port": "51778", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381039487, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 99\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.24", "dest_ip": "10.20.16.248", "src_port": "51780", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381039488, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"72679094 should left AJLSjGEp\\\", \\\"ID\\\": \\\"yyvZwdnD k9HSLxvP 75710044 join\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.61", "src_port": "51780", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381039490, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 96\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51782", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381039589, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"MgIXSndw 56794909 base UsNmV9Rn\\\", \\\"Phrase\\\": \\\"OAQgdCsj 05115857 send\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51782", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381039592, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 90\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "51784", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381039593, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"41182226 anyone BbAVjQmu they tonight\\\", \\\"ShowName\\\": \\\"25596278\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51784", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381039797, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 101\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.20", "dest_ip": "10.244.0.1", "src_port": "51786", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381039798, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"matter\\\", \\\"PersonName\\\": \\\"6Wa5uDV1 48857412 site uGXUUzno information even\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51786", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381039799, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 104\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51788", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381039899, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"21599727 0Hg8l8ZJ\\\", \\\"ID\\\": \\\"quickly night husband Ku0jZ2xk 51967039 tKfHRXUK\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "51788", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381039902, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 80\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.20.16.248", "src_port": "51790", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381039903, "host_ip": "10.188.40.56", "data": "\"{\\\"accesstoken\\\": \\\"method until boWMOEyF\\\", \\\"ShowName\\\": \\\"kitchen wonder\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.40", "src_port": "51790", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381040107, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 101\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.244.0.48", "src_port": "51792", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381040108, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"recent work\\\", \\\"Actor\\\": \\\"gNvPyBfM behavior 31541217 KXJyXHHu site usually\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.46", "src_port": "51792", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381040110, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 91\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.15", "dest_ip": "10.20.16.248", "src_port": "51794", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381040209, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"sZGkoaRD\\\", \\\"Actor\\\": \\\"71411488 ji7zXQYY gFbUctCx more available\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51794", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381040213, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 75\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51796", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381040213, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"k1VYMB3Z friend your qojuQTnj environment 99154481\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.13", "src_port": "51796", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381040417, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 162\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.34", "dest_ip": "10.244.0.50", "src_port": "51798", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381040418, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"HUdQDWEH article\\\", \\\"Name\\\": \\\"western nSFBgmRm network 71975118 J7yUBSK0\\\", \\\"Year\\\": \\\"very hURXzCoV before 40126281 consumer bhhXTwfo\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "51798", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381040420, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 170\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.30", "src_port": "51800", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381040519, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"gun 89593117 day nsroFWLE WFusmz5D\\\", \\\"Name\\\": \\\"92126672 DAEwAyZo FiJKezMW create\\\", \\\"Season\\\": \\\"dinner test Pkn3Xciw YQVarhkv 45521891 least\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.26", "dest_ip": "10.20.16.248", "src_port": "51800", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381040522, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 86\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.29", "src_port": "51802", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381040523, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"88517072 yourself jR1USAmh\\\", \\\"Name\\\": \\\"arrive bar FQXvfVJb\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.42", "dest_ip": "10.20.16.248", "src_port": "51802", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381040728, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 38\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51804", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381040729, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"81922063 when\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51804", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381040731, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 56\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.13", "src_port": "51806", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381040830, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"hsIMsQBX citizen hUmMImi4 style\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "51806", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381040833, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 123\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51808", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381040834, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"82367502 26H6aGiv successful\\\", \\\"Date\\\": \\\"2008-12-27\\\", \\\"Country\\\": \\\"lead wide 97981894 friend\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "51808", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041038, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 161\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.41", "src_port": "51810", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041039, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"1IHSAJq0 70771241 amZmaAhJ likely guess down\\\", \\\"Date\\\": \\\"2019-05-26\\\", \\\"Country\\\": \\\"8Fc82wV7 speech\\\", \\\"fullName\\\": \\\"Jason Arroyo\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "51810", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041141, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 141\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51812", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041141, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"PK2aD9Pb VGlisVDg stage effect\\\", \\\"Date\\\": \\\"2008-01-02\\\", \\\"Country\\\": \\\"70689585\\\", \\\"DoingBusinessAs\\\": \\\"Le PLC\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "51812", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041246, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 145\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.16", "dest_ip": "10.20.16.248", "src_port": "51814", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041246, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"least 93827695 score\\\", \\\"Date\\\": \\\"2016-06-14\\\", \\\"Country\\\": \\\"K0HPEBYL VgFkBwgm appear\\\", \\\"IdNumber\\\": \\\"101-55-1392\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.26", "src_port": "51814", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041250, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 150\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "51816", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041350, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"92602748 truth budget tell\\\", \\\"Date\\\": \\\"2010-06-17\\\", \\\"Country\\\": \\\"method yes\\\", \\\"organization\\\": \\\"Bell, Ho and Richard\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.42", "dest_ip": "10.244.0.1", "src_port": "51816", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041354, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 166\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.40", "dest_ip": "10.244.0.28", "src_port": "51818", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041354, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"maybe W5RpIHc6 69760091\\\", \\\"Date\\\": \\\"2020-06-29\\\", \\\"Country\\\": \\\"XYcqLDMi fire vqkafwhx affect action 58883638\\\", \\\"Province\\\": \\\"Nebraska\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.34", "src_port": "51818", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041457, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 150\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51820", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041458, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"91574467 mission instead qzvISCdV let 1fsoUcmb\\\", \\\"Date\\\": \\\"1972-10-15\\\", \\\"Country\\\": \\\"beat\\\", \\\"latitude\\\": \\\"25.6855805\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "51820", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041460, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 163\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.48", "src_port": "51822", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041560, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"25546014 H5UYrRjh\\\", \\\"Date\\\": \\\"2008-03-15\\\", \\\"Country\\\": \\\"nWtIFiHs voice whole auBjnCrE tell 16802378\\\", \\\"Dba\\\": \\\"Cervantes-Morrison\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.37", "src_port": "51822", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041563, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 126\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51824", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041567, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"ImdsltHK 64858935\\\", \\\"Date\\\": \\\"1986-10-04\\\", \\\"Country\\\": \\\"79119468\\\", \\\"longitude\\\": \\\"-55.742276\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.14", "dest_ip": "10.20.16.248", "src_port": "51824", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041765, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 163\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.20.16.248", "src_port": "51826", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041765, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"aphcZcNR pretty 16573986 nor ahead G2y1Wzpz\\\", \\\"Date\\\": \\\"2007-12-22\\\", \\\"Country\\\": \\\"meeting WVcZqPBE pick\\\", \\\"province\\\": \\\"Minnesota\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.46", "src_port": "51826", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041869, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 148\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51828", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041869, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"GTYDokm7 can cwNgljsX\\\", \\\"Date\\\": \\\"2000-10-17\\\", \\\"Country\\\": \\\"YdGeajYJ field 27862818 wkGFB2Cg\\\", \\\"CountryCode\\\": \\\"NZ\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "51828", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041872, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 208\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.46", "src_port": "51830", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381041873, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"young whose PVPhXaKw Djc4dhki 19702680 anything\\\", \\\"Date\\\": \\\"1990-07-19\\\", \\\"Country\\\": \\\"across sort 4xmO40iH store fEbMipqh\\\", \\\"UUID\\\": \\\"49c381c6cf844ed8a24e5602f67e912f01ec075a\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.31", "dest_ip": "10.244.0.1", "src_port": "51830", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381042075, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 185\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51832", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381042075, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"care big 48524193 DRWAsoly OS3nyc41 color\\\", \\\"Date\\\": \\\"1979-12-03\\\", \\\"Country\\\": \\\"defense t7KkgIfw list 36590668 jCphiiBz brother\\\", \\\"PostalCode\\\": \\\"14924\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.34", "dest_ip": "10.20.16.248", "src_port": "51832", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381042179, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 44\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.58", "dest_ip": "10.20.16.248", "src_port": "51834", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381042179, "host_ip": "10.188.40.56", "data": "\"{\\\"Year\\\": \\\"zm8d97Z2 86844044 WoCCaPpo\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.42", "dest_ip": "10.244.0.1", "src_port": "51834", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381042182, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 99\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.59", "src_port": "51836", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381042183, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"FPaYFWmQ college personal\\\", \\\"Nominee\\\": \\\"73440311 serve this technology\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.38", "src_port": "51836", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381042386, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 72\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51838", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381042386, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"laugh state get RoMcbXVC\\\", \\\"Title\\\": \\\"center\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51838", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381042490, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 106\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51840", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381042491, "host_ip": "10.188.40.56", "data": "\"{\\\"AccessToken\\\": \\\"term z0zTF7Wv aGruwNmB course\\\", \\\"imdbID\\\": \\\"themselves I17AE5eA PHAQyDVS group\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.34", "dest_ip": "10.20.16.248", "src_port": "51840", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381042594, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 89\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51842", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381042594, "host_ip": "10.188.40.56", "data": "\"{\\\"accesstoken\\\": \\\"59641987 several tnMsy0cw skjMpkIg cultural\\\", \\\"Query\\\": \\\"plan\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "51842", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381042597, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 107\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51844", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381042598, "host_ip": "10.188.40.56", "data": "\"{\\\"key\\\": \\\"YyacUUPp 26215309\\\", \\\"text\\\": \\\"no\\\", \\\"full_mode\\\": \\\"myiiwPER 07196873 center statement\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.50", "src_port": "51844", "dest_port": "80", "flags": "24", "is_pii": true} -{"timestamp": 1616381042800, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 88\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.37", "src_port": "51846", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381042801, "host_ip": "10.188.40.56", "data": "\"{\\\"key\\\": \\\"bill 64496260 0eXurLrU\\\", \\\"text\\\": \\\"attack NzylLDge 26257945 HxcFYWyL\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.33", "dest_ip": "10.244.0.50", "src_port": "51846", "dest_port": "80", "flags": "24", "is_pii": true} -{"timestamp": 1616381042903, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 63\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51848", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381042903, "host_ip": "10.188.40.56", "data": "\"{\\\"key\\\": \\\"side\\\", \\\"url\\\": \\\"AElMcehe 39212900 stage way\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "51848", "dest_port": "80", "flags": "24", "is_pii": true} -{"timestamp": 1616381042906, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 39\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51850", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043007, "host_ip": "10.188.40.56", "data": "\"{\\\"key\\\": \\\"wLjZBrVO sister become\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.40", "src_port": "51850", "dest_port": "80", "flags": "24", "is_pii": true} -{"timestamp": 1616381043011, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 214\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51852", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043011, "host_ip": "10.188.40.56", "data": "\"{\\\"aircraftCode\\\": \\\"86985793 eye\\\", \\\"Accept\\\": \\\"VJpeQzCe 78301216 any back dinner eGpbJNgl\\\", \\\"cabinCode\\\": \\\"K6NJZXwP itself rnMNGNBy cost 97686522 exist\\\", \\\"lang\\\": \\\"professional 24006894 like aROdmOuy\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.1", "src_port": "51852", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043114, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 180\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51854", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043115, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"admit 30749202 ULjTZSsg XbVfVyrU decision\\\", \\\"destination\\\": \\\"EYHtZHPF\\\", \\\"departureDate\\\": \\\"make themselves\\\", \\\"returnDate\\\": \\\"media your former 60786315\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51854", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043117, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 117\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.17", "dest_ip": "10.244.0.1", "src_port": "51856", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043218, "host_ip": "10.188.40.56", "data": "\"{\\\"ticketnumber\\\": \\\"16759734 note though\\\", \\\"emailAddress\\\": \\\"morrisvincent@hotmail.com\\\", \\\"Accept\\\": \\\"view\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.10", "dest_ip": "10.20.16.248", "src_port": "51856", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043220, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 187\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51858", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043220, "host_ip": "10.188.40.56", "data": "\"{\\\"ticketnumber\\\": \\\"73udZP83 question country QBZwLytV\\\", \\\"emailAddress\\\": \\\"holly46@shelton.com\\\", \\\"Accept\\\": \\\"pgv3kis2\\\", \\\"Serial\\\": \\\"12552ca244a3972d3a2037254b51cd1a5b07b9d9\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.48", "src_port": "51858", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043323, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 156\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51860", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043324, "host_ip": "10.188.40.56", "data": "\"{\\\"ticketnumber\\\": \\\"wait\\\", \\\"emailAddress\\\": \\\"amandaespinoza@mcknight-patterson.com\\\", \\\"Accept\\\": \\\"K0CVmiPr\\\", \\\"IdentityDocument\\\": \\\"372-18-9219\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.14", "dest_ip": "10.20.16.248", "src_port": "51860", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043325, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 182\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "51862", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043426, "host_ip": "10.188.40.56", "data": "\"{\\\"ticketnumber\\\": \\\"because hwVtXdqa over wpYLHUpF 20594583\\\", \\\"emailAddress\\\": \\\"michael33@zhang.net\\\", \\\"Accept\\\": \\\"anything 12937147\\\", \\\"businessContact\\\": \\\"Lisa Blevins\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.32", "dest_ip": "10.20.16.248", "src_port": "51862", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043430, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 182\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "51864", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043431, "host_ip": "10.188.40.56", "data": "\"{\\\"ticketnumber\\\": \\\"future change 0bCCwhmi 69189746\\\", \\\"emailAddress\\\": \\\"adrian12@waters.com\\\", \\\"Accept\\\": \\\"month 74657137 DZqQwZms\\\", \\\"Dba\\\": \\\"Harper, Curry and Robinson\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.36", "src_port": "51864", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043532, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 153\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51866", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043533, "host_ip": "10.188.40.56", "data": "\"{\\\"ticketnumber\\\": \\\"69628870\\\", \\\"emailAddress\\\": \\\"christopher65@johnson.com\\\", \\\"Accept\\\": \\\"5LY9yFnx floor DExCNcnt\\\", \\\"idCard\\\": \\\"737-89-6801\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.31", "dest_ip": "10.20.16.248", "src_port": "51866", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043533, "host_ip": "10.188.40.56", "data": "\"{\\\"ticketnumber\\\": \\\"69628870\\\", \\\"emailAddress\\\": \\\"christopher65@johnson.com\\\", \\\"Accept\\\": \\\"5LY9yFnx floor DExCNcnt\\\", \\\"idCard\\\": \\\"737-89-6801\\\"}\"", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "51866", "flags": "24", "is_pii": false} -{"timestamp": 1616381043535, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 177\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.16", "src_port": "51868", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043635, "host_ip": "10.188.40.56", "data": "\"{\\\"ticketnumber\\\": \\\"actually kPtmZGme\\\", \\\"emailAddress\\\": \\\"zskinner@price-gonzalez.org\\\", \\\"Accept\\\": \\\"forward HTuEKopx 4G6H0do0 break against\\\", \\\"TaxId\\\": \\\"Scott LLC\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.21", "src_port": "51868", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043639, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 179\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.28", "dest_ip": "10.20.16.248", "src_port": "51870", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043639, "host_ip": "10.188.40.56", "data": "\"{\\\"ticketnumber\\\": \\\"see\\\", \\\"emailAddress\\\": \\\"kristineandrews@gomez.biz\\\", \\\"Accept\\\": \\\"OWLTnqq3 modern 46095966 vote agent pesKaOHW\\\", \\\"IdentityDocument\\\": \\\"827-21-9350\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.46", "dest_ip": "10.20.16.248", "src_port": "51870", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043742, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 160\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.20.16.248", "src_port": "51872", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043743, "host_ip": "10.188.40.56", "data": "\"{\\\"ticketnumber\\\": \\\"QdINGgzm necessary\\\", \\\"emailAddress\\\": \\\"danielleruiz@coleman-hunt.com\\\", \\\"Accept\\\": \\\"jQKDPXfw\\\", \\\"DocumentNumber\\\": \\\"227-46-0116\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.23", "dest_ip": "10.20.16.248", "src_port": "51872", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043745, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 157\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.18", "src_port": "51874", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043845, "host_ip": "10.188.40.56", "data": "\"{\\\"ticketnumber\\\": \\\"uDhnJknr television jPXFCsPI 68723402\\\", \\\"emailAddress\\\": \\\"xthompson@yahoo.com\\\", \\\"Accept\\\": \\\"well\\\", \\\"IdCard\\\": \\\"248-88-4190\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.32", "src_port": "51874", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043849, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 205\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.28", "dest_ip": "10.20.16.248", "src_port": "51876", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043849, "host_ip": "10.188.40.56", "data": "\"{\\\"ticketnumber\\\": \\\"attorney thank\\\", \\\"emailAddress\\\": \\\"espinozaphillip@hotmail.com\\\", \\\"Accept\\\": \\\"7rvJX1E9 short 97395709 serious ERHLnQqU image\\\", \\\"DoingBusinessAs\\\": \\\"Hill, Bernard and Allen\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.16", "src_port": "51876", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043952, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 165\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.13", "src_port": "51878", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043953, "host_ip": "10.188.40.56", "data": "\"{\\\"ticketnumber\\\": \\\"reflect FMjhAUqt long\\\", \\\"emailAddress\\\": \\\"ojohns@fleming.com\\\", \\\"Accept\\\": \\\"born 50152307 ksaxWCwl\\\", \\\"Account\\\": \\\"POGG0884320584729\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.32", "src_port": "51878", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381043954, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 218\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.28", "dest_ip": "10.20.16.248", "src_port": "51880", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044055, "host_ip": "10.188.40.56", "data": "\"{\\\"ticketnumber\\\": \\\"out 78767382 process LFSbpnjb 95AN4Iut college\\\", \\\"emailAddress\\\": \\\"william71@benson-rodriguez.info\\\", \\\"Accept\\\": \\\"television YJJDbpqr yard jwlnsIyZ always\\\", \\\"Shareholder\\\": \\\"David Rice\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "51880", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044059, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 113\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.17", "src_port": "51882", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044060, "host_ip": "10.188.40.56", "data": "\"{\\\"orderID\\\": \\\"87936546\\\", \\\"Accept\\\": \\\"uAEOGdjh 43557281 little address tree wZgNwpgH\\\", \\\"name\\\": \\\"last\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51882", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044161, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 64\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.18", "dest_ip": "10.20.16.248", "src_port": "51884", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044162, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"45016207 IwMxOU0k reality gun check hxnyysxE\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.13", "dest_ip": "10.20.16.248", "src_port": "51884", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044163, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 199\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.33", "src_port": "51886", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044264, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"they single\\\", \\\"catalogues\\\": \\\"compare uXnPUxok 05258557\\\", \\\"new-routes\\\": \\\"18762034 before jLWNoLvP benefit understand ePJlYnVH\\\", \\\"old-routes\\\": \\\"krB1ypeo tTtPcEtQ hundred\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.15", "dest_ip": "10.20.16.248", "src_port": "51886", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044474, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 246\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.32", "src_port": "51888", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044475, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"FoIzvArQ daughter 85608871 YiJSsF7G she where\\\", \\\"destination\\\": \\\"must 81567049 several lAJD1o6e erECaaDK Democrat\\\", \\\"Accept\\\": \\\"MAF7sf9G ROiOOYpW though type until\\\", \\\"limit\\\": \\\"MaQuuIgr far 98074729 great ask nGeHSAnm\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.28", "src_port": "51888", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044577, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 326\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.39", "src_port": "51890", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044577, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"fall YuLjSaUf 27472899 NdIeFkhN\\\", \\\"destination\\\": \\\"75631688 SUIbsfpS mHXyTBvh\\\", \\\"cabin-class\\\": \\\"kwRbpToK student kid\\\", \\\"trip-duration\\\": \\\"play piece 0rBc8ykn suffer\\\", \\\"email\\\": \\\"littlejohn@gmail.com\\\", \\\"lang\\\": \\\"party DmpR2y7h\\\", \\\"Accept\\\": \\\"lEIrAIhb appear power 18770735 1J6xBLOV someone\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.41", "dest_ip": "10.20.16.248", "src_port": "51890", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044578, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.26", "src_port": "80", "dest_port": "51890", "flags": "24", "is_pii": false} -{"timestamp": 1616381044580, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 345\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.30", "dest_ip": "10.244.0.1", "src_port": "51892", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044580, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"xuSomPlI ujQZsuEJ bar term western 12291502\\\", \\\"destination\\\": \\\"once 9DSntRy2\\\", \\\"cabin-class\\\": \\\"WRKnOUhW 24073696 day personal TNgzAsXB\\\", \\\"trip-duration\\\": \\\"IfDDDJNo say\\\", \\\"email\\\": \\\"garyclayton@hotmail.com\\\", \\\"lang\\\": \\\"KXbOSaaQ 3Byyt2i7 resource\\\", \\\"Accept\\\": \\\"truth X9SLtCXr role cooROHmm\\\", \\\"apt\\\": \\\"4915\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.49", "src_port": "51892", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044581, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.41", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "51892", "flags": "24", "is_pii": false} -{"timestamp": 1616381044681, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 467\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51894", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044681, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"Wh8CWIby eat resource 95157977\\\", \\\"destination\\\": \\\"cqFzMMEk\\\", \\\"cabin-class\\\": \\\"KfBXSUlS soon 60813662 DkGV0dyR others four\\\", \\\"trip-duration\\\": \\\"low bKNqDdWd BjW8l1AD 59809345 mouth\\\", \\\"email\\\": \\\"michael15@davis.com\\\", \\\"lang\\\": \\\"state zdeFlrNl SngGsQ2A\\\", \\\"Accept\\\": \\\"Y65NdjLg industry 68922747 fire WVWDCXuW whether\\\", \\\"country\\\": \\\"H4IWKc7c\\\", \\\"trackingid\\\": \\\"gun\\\", \\\"Signature_sha1\\\": \\\"977cfacbd760442b3d88f76b9da86c65dd8a055b\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "51894", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044682, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.34", "dest_ip": "10.244.0.50", "src_port": "80", "dest_port": "51894", "flags": "24", "is_pii": false} -{"timestamp": 1616381044684, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 348\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "51896", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044684, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"stage source rZzuqSvw\\\", \\\"destination\\\": \\\"IpmJbHjl data 99226974 your CLJYb1Lu type\\\", \\\"cabin-class\\\": \\\"LFeqDZYX 23948501\\\", \\\"trip-duration\\\": \\\"omfyK8By car JRPumZLZ everybody\\\", \\\"email\\\": \\\"dakotawalker@tran.com\\\", \\\"lang\\\": \\\"compare 67185921 prove XjEZv3Ei\\\", \\\"Accept\\\": \\\"important\\\", \\\"ReservationCode\\\": \\\"6IG3ITS5\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.49", "src_port": "51896", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044685, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.28", "src_port": "80", "dest_port": "51896", "flags": "24", "is_pii": false} -{"timestamp": 1616381044785, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 428\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.30", "dest_ip": "10.20.16.248", "src_port": "51898", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044785, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"civil AGBCYJP4 dark pay 99013790\\\", \\\"destination\\\": \\\"drive source\\\", \\\"cabin-class\\\": \\\"3wGglzds fblsLxcV green assume help 06918309\\\", \\\"trip-duration\\\": \\\"oEKGtcVv\\\", \\\"email\\\": \\\"murphychristy@hotmail.com\\\", \\\"lang\\\": \\\"wbsGGZOm night her agency 76072184\\\", \\\"Accept\\\": \\\"able oTnWPynW tough srzzya3A seat 65609726\\\", \\\"country\\\": \\\"cPtxiGHM mother 71200191 too every AnpQAJdS\\\", \\\"PostalCode\\\": \\\"81142\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "51898", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044786, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "80", "dest_port": "51898", "flags": "24", "is_pii": false} -{"timestamp": 1616381044788, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 348\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.58", "src_port": "51900", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044788, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"QjnZHE5B may\\\", \\\"destination\\\": \\\"jBtaVX5T\\\", \\\"cabin-class\\\": \\\"VXOWcx8b 50912896 HaHSYNRx\\\", \\\"trip-duration\\\": \\\"oEjXtSEU someone pick\\\", \\\"email\\\": \\\"campbelljared@hotmail.com\\\", \\\"lang\\\": \\\"relate they wYgYfoKJ 88471564 pr6Y3cRK property\\\", \\\"Accept\\\": \\\"improve player Wzx2XfAJ fine 64690129\\\", \\\"Location\\\": \\\"165.083930\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.47", "dest_ip": "10.244.0.61", "src_port": "51900", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044789, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.12", "src_port": "80", "dest_port": "51900", "flags": "24", "is_pii": false} -{"timestamp": 1616381044889, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 405\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "51902", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044889, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"child Vbf1jNPq\\\", \\\"destination\\\": \\\"lawyer 64726028 NFEXzbSE half exist 4T5YtWMq\\\", \\\"cabin-class\\\": \\\"them HgUzmfnO 23201928 figure BYYrKl4R also\\\", \\\"trip-duration\\\": \\\"bKx3G5P8\\\", \\\"email\\\": \\\"ana74@vang.org\\\", \\\"lang\\\": \\\"such RYSSjHIj 15273713\\\", \\\"Accept\\\": \\\"stage especially wrJtJfDF 99707541 local\\\", \\\"country\\\": \\\"36617558 kitchen might zSqahTrL\\\", \\\"firstname\\\": \\\"William\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.20.16.248", "src_port": "51902", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044892, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 420\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51904", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044892, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"born administration DomKWHHD 82546030 ym0aGPxs\\\", \\\"destination\\\": \\\"these part party DRgwU7xs 26092197 tGuSZFsS\\\", \\\"cabin-class\\\": \\\"BYcjICIq Q0cY6ztR father car\\\", \\\"trip-duration\\\": \\\"eat\\\", \\\"email\\\": \\\"raymondalan@hotmail.com\\\", \\\"lang\\\": \\\"92695660 key occur gnm4vfaE sAxLDUOn\\\", \\\"Accept\\\": \\\"SuihvBGb\\\", \\\"trackingid\\\": \\\"material two kHeTZkaR WYh6B9Bn together\\\", \\\"latitude\\\": \\\"-69.530271\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.17", "dest_ip": "10.20.16.248", "src_port": "51904", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044893, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "51904", "flags": "24", "is_pii": false} -{"timestamp": 1616381044993, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 390\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.38", "dest_ip": "10.244.0.48", "src_port": "51906", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044993, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"personal state\\\", \\\"destination\\\": \\\"86951751 otwgcWTP AoAmA1ld\\\", \\\"cabin-class\\\": \\\"not before tax 60798900 Y6uu1ER2 tEELUlVG\\\", \\\"trip-duration\\\": \\\"XjbBbUCR\\\", \\\"email\\\": \\\"ibowman@adams-perry.biz\\\", \\\"lang\\\": \\\"15601809 strong ltwUL6a0\\\", \\\"Accept\\\": \\\"rDoGFpHg example information news\\\", \\\"country\\\": \\\"perform law cHvwzaMl 78756803\\\", \\\"location\\\": \\\"-143.009384\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51906", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044994, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.19", "src_port": "80", "dest_port": "51906", "flags": "24", "is_pii": false} -{"timestamp": 1616381044995, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 320\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51908", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044996, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"SRLtFNMz recognize\\\", \\\"destination\\\": \\\"66212760 skin\\\", \\\"cabin-class\\\": \\\"again A6gWxOO1 this thus\\\", \\\"trip-duration\\\": \\\"past RNw0adVI\\\", \\\"email\\\": \\\"tracy12@black.com\\\", \\\"lang\\\": \\\"yBTnedGN cover would\\\", \\\"Accept\\\": \\\"WqZFLvGc today\\\", \\\"trackingid\\\": \\\"action\\\", \\\"idNumber\\\": \\\"600-46-9452\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51908", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381044997, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.19", "dest_ip": "10.244.0.1", "src_port": "80", "dest_port": "51908", "flags": "24", "is_pii": false} -{"timestamp": 1616381045097, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 369\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.28", "dest_ip": "10.244.0.1", "src_port": "51910", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045097, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"camera science atkQAVNJ image j0X2mmbV\\\", \\\"destination\\\": \\\"14508237 seem ffjQBKVE MFWWNgwj trouble\\\", \\\"cabin-class\\\": \\\"without xCFxwpfv heavy 79925171 6LP2I9J3\\\", \\\"trip-duration\\\": \\\"building\\\", \\\"email\\\": \\\"petersashley@christensen.com\\\", \\\"lang\\\": \\\"thank\\\", \\\"Accept\\\": \\\"office watch\\\", \\\"country\\\": \\\"0FdfamPE\\\", \\\"user\\\": \\\"Heather Thomas\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "51910", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045098, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.37", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "51910", "flags": "24", "is_pii": false} -{"timestamp": 1616381045100, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 466\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51912", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045100, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"cover season\\\", \\\"destination\\\": \\\"VQyfZrCX to wife pe3wWcGt 74093750\\\", \\\"cabin-class\\\": \\\"ySECTi2k half beat 12070523 YvjLlOVy\\\", \\\"trip-duration\\\": \\\"zAmXU5Y9 pxNFEzyI soldier 87720631\\\", \\\"email\\\": \\\"sharpmary@reynolds.com\\\", \\\"lang\\\": \\\"58711292 JpXgkvQN speech thank city\\\", \\\"Accept\\\": \\\"staff 97041716 jv8TZRPh way\\\", \\\"country\\\": \\\"xQcui6WA population\\\", \\\"trackingid\\\": \\\"bar 3M7Vlz6c ever south\\\", \\\"TaxId\\\": \\\"Hayes, Smith and Jackson\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.18", "src_port": "51912", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045101, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "80", "dest_port": "51912", "flags": "24", "is_pii": false} -{"timestamp": 1616381045102, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 396\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "51914", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045103, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"lZ4fztGF adult 38945570 father\\\", \\\"destination\\\": \\\"partner project mbxOSETu BskZUquW 66912395\\\", \\\"cabin-class\\\": \\\"herself 99675206 sometimes 9LJcNLuD\\\", \\\"trip-duration\\\": \\\"meeting serve JBcapNct\\\", \\\"email\\\": \\\"brownrobert@williams.com\\\", \\\"lang\\\": \\\"police RNTBxqLE opportunity 30518181 religious\\\", \\\"Accept\\\": \\\"24196502 debate shoulder price\\\", \\\"building\\\": \\\"64189\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.5", "dest_ip": "10.244.0.1", "src_port": "51914", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045201, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.45", "src_port": "80", "dest_port": "51914", "flags": "24", "is_pii": false} -{"timestamp": 1616381045202, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 385\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51916", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045202, "host_ip": "10.188.40.56", "data": "\"{\\\"catalogues\\\": \\\"guess 77982235 foreign h0mvyGLx member\\\", \\\"origin\\\": \\\"JsjGTnDm either\\\", \\\"destination\\\": \\\"policy 64166020 gXrQbqHc\\\", \\\"travel-date\\\": \\\"19791577 JKXAbkHB\\\", \\\"Accept\\\": \\\"04272286 type blood\\\", \\\"return-date\\\": \\\"00424346\\\", \\\"cabin-class\\\": \\\"KXBkpsf8 partner do 62173941\\\", \\\"travelers\\\": \\\"QcaR2vxe\\\", \\\"fare-family\\\": \\\"CfIfQxkT k4EiEuwY character with\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.19", "src_port": "51916", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045203, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "80", "dest_port": "51916", "flags": "24", "is_pii": false} -{"timestamp": 1616381045205, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 251\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.10", "src_port": "51918", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045205, "host_ip": "10.188.40.56", "data": "\"{\\\"catalogues\\\": \\\"gdjhBFMU VELrBMGo only 46317968 base effect\\\", \\\"segments\\\": \\\"detail 90671275\\\", \\\"carriers\\\": \\\"86572906 hour travel lhfaIlLj X094VuRU\\\", \\\"Accept\\\": \\\"93341706\\\", \\\"travelers\\\": \\\"exist M4MtgLhg\\\", \\\"fare-types\\\": \\\"YilQjbCj\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.40", "src_port": "51918", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045406, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 704\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51920", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045407, "host_ip": "10.188.40.56", "data": "\"{\\\"catalogues\\\": \\\"KMiYVBmW rate law 33678803 news ad4jF16h\\\", \\\"origin\\\": \\\"FIipwObB\\\", \\\"destination\\\": \\\"on 49752792 qxja7t4Q\\\", \\\"travel-date\\\": \\\"whom\\\", \\\"outbound-segments\\\": \\\"body personal FDpf3pcs gSWHBHBg sister 90240726\\\", \\\"fare\\\": \\\"sCN7CfbE perform xIlBuYeo will\\\", \\\"fare-currency\\\": \\\"SzqidmT2 put question fund 01303825\\\", \\\"trackingid\\\": \\\"thousand shake\\\", \\\"country\\\": \\\"bill cause KWdYOsFE\\\", \\\"lang\\\": \\\"for QYbumspt\\\", \\\"Accept\\\": \\\"seven step fast\\\", \\\"return-date\\\": \\\"term tough 41733893\\\", \\\"cabin-class\\\": \\\"lVBhAQlD GBhSPgNI\\\", \\\"return-segments\\\": \\\"14207471 laugh defense perform\\\", \\\"travelers\\\": \\\"property\\\", \\\"encryption-key\\\": \\\"JmjCqpiO 61546079 fgcRcW8T member\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.47", "dest_ip": "10.244.0.61", "src_port": "51920", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045409, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 441\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "51922", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045409, "host_ip": "10.188.40.56", "data": "\"{\\\"catalogues\\\": \\\"80127066 need structure\\\", \\\"origin\\\": \\\"47822188 bGSeynlq\\\", \\\"destination\\\": \\\"keep\\\", \\\"travel-date\\\": \\\"U1xluhxc about dLxlobwI a explain 07831989\\\", \\\"trackingid\\\": \\\"14065683 pick might S647e0eg here\\\", \\\"country\\\": \\\"mriXCpPZ\\\", \\\"lang\\\": \\\"07474843 decide bitJhxXY network\\\", \\\"Accept\\\": \\\"ESsilnDN example\\\", \\\"cabin-class\\\": \\\"cxDeCYlb 62199130 U1gPWX8d anyone whose parent\\\", \\\"encryption-key\\\": \\\"snAFfSHn\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.44", "src_port": "51922", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045509, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "51922", "flags": "24", "is_pii": false} -{"timestamp": 1616381045510, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 625\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51924", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045511, "host_ip": "10.188.40.56", "data": "\"{\\\"catalogues\\\": \\\"91863496 27MhCyxz agree\\\", \\\"trackingid\\\": \\\"degree\\\", \\\"country\\\": \\\"42030242 what score sPOVhxjf\\\", \\\"lang\\\": \\\"92611275\\\", \\\"Accept\\\": \\\"too ThAA5WC7 50277814 ogLxipGO wish debate\\\", \\\"origin\\\": \\\"mind 37083071 ZiBN9vyD day\\\", \\\"origin-name\\\": \\\"movement cqWteGJj door purpose 2BLUCizY\\\", \\\"destination\\\": \\\"U5Fq7E7H not 28541438 practice\\\", \\\"destination-name\\\": \\\"FuiDUvuW fact\\\", \\\"return-segments\\\": \\\"27323866 laugh head deal fIlxRIjW Ja5AWL8W\\\", \\\"fare\\\": \\\"type vwN7jB5O back actually 17835261\\\", \\\"net-fare\\\": \\\"4CFQFkgU seek season real 90149342 jLtWglaW\\\", \\\"partnerid\\\": \\\"YHQAAlhB woman\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.43", "dest_ip": "10.20.16.248", "src_port": "51924", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045511, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.6", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "51924", "flags": "24", "is_pii": false} -{"timestamp": 1616381045513, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 405\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.58", "src_port": "51926", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045514, "host_ip": "10.188.40.56", "data": "\"{\\\"catalogues\\\": \\\"social 45369304 camera qaTWmmwU\\\", \\\"origin\\\": \\\"certain QpRClaJO 26065393 way\\\", \\\"destination\\\": \\\"sea\\\", \\\"travel-date\\\": \\\"whatever xJwiAlqJ 58553730 daughter uDg1ZI9m head\\\", \\\"trip-duration\\\": \\\"16137482 ground\\\", \\\"range\\\": \\\"IXkw8ErQ\\\", \\\"Accept\\\": \\\"mC6pStGZ bring 86404485\\\", \\\"trackingid\\\": \\\"writer aGbEfWL2 SNGgNTVs 52295845\\\", \\\"fare-family\\\": \\\"culture fine fGVtxNmq\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.58", "src_port": "51926", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045515, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.46", "src_port": "80", "dest_port": "51926", "flags": "24", "is_pii": false} -{"timestamp": 1616381045613, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 378\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.43", "dest_ip": "10.20.16.248", "src_port": "51928", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045614, "host_ip": "10.188.40.56", "data": "\"{\\\"catalogues\\\": \\\"wait 99445692\\\", \\\"origin\\\": \\\"mention popular\\\", \\\"destination\\\": \\\"black 94964274 rGEeJoVw uLRrOTla Democrat\\\", \\\"travel-date\\\": \\\"story WWISRHNx 1IxjVmND 46864582 far industry\\\", \\\"return-date\\\": \\\"pay where 54465889 FpkLJayQ\\\", \\\"cabin-class\\\": \\\"tyCFeFwl everyone view size hVKH76zV\\\", \\\"trackingid\\\": \\\"TgplFEva down fast somebody 46lZfR7i 30770171\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "51928", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045614, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.18", "src_port": "80", "dest_port": "51928", "flags": "24", "is_pii": false} -{"timestamp": 1616381045616, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 104\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.52", "dest_ip": "10.20.16.248", "src_port": "51930", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045616, "host_ip": "10.188.40.56", "data": "\"{\\\"searchID\\\": \\\"60352174 KKnutBCX VdyGeU3l game magazine occur\\\", \\\"Accept\\\": \\\"test real EkRqkFN6\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.38", "src_port": "51930", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045819, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 128\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.61", "src_port": "51932", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045820, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"xVhoFvwX 27032947 sit JwPFWZW9 she market\\\", \\\"countryCode\\\": \\\"HR\\\", \\\"limit\\\": \\\"2mEnxr7F thought NXgGQfkP\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.26", "src_port": "51932", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045922, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 230\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.30", "src_port": "51934", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045922, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"wfVF0yhZ believe GFdRRYOY 76237365 all\\\", \\\"countryCode\\\": \\\"TM\\\", \\\"lang\\\": \\\"no 60353749 P3EmIPDe IaZniPYh each though\\\", \\\"limit\\\": \\\"start\\\", \\\"offset\\\": \\\"without strategy\\\", \\\"Shareholder\\\": \\\"Alicia Lane\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.44", "src_port": "51934", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045925, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 222\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "51936", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381045925, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"41772779 StjFdIWJ movement\\\", \\\"countryCode\\\": \\\"ES\\\", \\\"lang\\\": \\\"49395664 along close decision LRdAv8eI Ukowlwgl\\\", \\\"limit\\\": \\\"PKH7lzFz\\\", \\\"offset\\\": \\\"present alone senior\\\", \\\"dba\\\": \\\"Wright PLC\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51936", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381046130, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 73\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "51938", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381046131, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"same\\\", \\\"countryCode\\\": \\\"LA\\\", \\\"lat\\\": \\\"87.562880\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51938", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381046233, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 204\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.39", "src_port": "51940", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381046233, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"20035775 president day VIlGJPCU\\\", \\\"countryCode\\\": \\\"GW\\\", \\\"limit\\\": \\\"deal\\\", \\\"offset\\\": \\\"star indicate\\\", \\\"address\\\": \\\"8016 April Crossing Suite 994\\\nWest Meghanstad, IN 99147\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.18", "src_port": "51940", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381046236, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 139\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.16", "src_port": "51942", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381046236, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"not attorney 7Glvg3cJ\\\", \\\"countryCode\\\": \\\"QA\\\", \\\"lang\\\": \\\"01721135 MbZRasDE usually\\\", \\\"bic\\\": \\\"NMOR9040114627664\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.20", "src_port": "51942", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381046440, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"not attorney 7Glvg3cJ\\\", \\\"countryCode\\\": \\\"QA\\\", \\\"lang\\\": \\\"01721135 MbZRasDE usually\\\", \\\"bic\\\": \\\"NMOR9040114627664\\\"}\"", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "51942", "flags": "24", "is_pii": false} -{"timestamp": 1616381046442, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 199\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.20", "src_port": "51944", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381046442, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"SJDNVihZ set sign eJoKH3yt 17883078\\\", \\\"countryCode\\\": \\\"MY\\\", \\\"limit\\\": \\\"92786796 experience at\\\", \\\"offset\\\": \\\"throw least oSNFdOnu 54274477 bill eFBLRFct\\\", \\\"Gender\\\": \\\"M\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.20.16.248", "src_port": "51944", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381046545, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 236\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.39", "src_port": "51946", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381046545, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"obircXiY 98016918 however oQEwFCnO\\\", \\\"countryCode\\\": \\\"JM\\\", \\\"lang\\\": \\\"staff democratic authority\\\", \\\"limit\\\": \\\"65227721 activity VegmYWaY nJ3zcjWA\\\", \\\"offset\\\": \\\"4ohy9Ry3 assume\\\", \\\"Timestamp\\\": \\\"219578593\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.6", "dest_ip": "10.20.16.248", "src_port": "51946", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381046548, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 152\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.14", "dest_ip": "10.20.16.248", "src_port": "51948", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381046549, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"get very WyA23PLE DVARuyRL 21218783\\\", \\\"countryCode\\\": \\\"SM\\\", \\\"lang\\\": \\\"church 15465959 oObwS4vB\\\", \\\"city\\\": \\\"Lake Michaelstad\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51948", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381046751, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 138\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51950", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381046751, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"pwqBDuPh 13560511 PYMElErN\\\", \\\"countryCode\\\": \\\"CN\\\", \\\"offset\\\": \\\"25848905 argue\\\", \\\"Shareholder\\\": \\\"Erika Tucker\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.33", "dest_ip": "10.244.0.48", "src_port": "51950", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381046855, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 174\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.59", "src_port": "51952", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381046855, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"firoUTHj\\\", \\\"countryCode\\\": \\\"SL\\\", \\\"lang\\\": \\\"common BztSCykP provide ZUCKGGCx understand\\\", \\\"offset\\\": \\\"me 25879771\\\", \\\"RecordLocator\\\": \\\"0Y9QL8VX\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "51952", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381046858, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 210\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.2", "dest_ip": "10.244.0.1", "src_port": "51954", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381046859, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"cNrmbeGk ekw4H7Nu 84302843\\\", \\\"countryCode\\\": \\\"CY\\\", \\\"lang\\\": \\\"soldier 51079518 ZxNXRDYw\\\", \\\"limit\\\": \\\"lWDvxOKS BXtAEB33 community indeed 69892712 ground\\\", \\\"passport\\\": \\\"066-09-1040\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.13", "dest_ip": "10.20.16.248", "src_port": "51954", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047061, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 251\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.16", "src_port": "51956", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047061, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"75403854\\\", \\\"countryCode\\\": \\\"GW\\\", \\\"lang\\\": \\\"information specific\\\", \\\"limit\\\": \\\"traditional JRMkraWt turn 99781026 wp51jgNA according\\\", \\\"offset\\\": \\\"return 92143083 SBn7kKKg around strong\\\", \\\"Phone\\\": \\\"(310)086-0682x05986\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51956", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047064, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 136\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.17", "src_port": "51958", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047164, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"especially 08952664 around wuDYjbqs trmcanTm lot\\\", \\\"cityCode\\\": \\\"Jenniferport\\\", \\\"lang\\\": \\\"front image E83to1gR\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.61", "src_port": "51958", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047167, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 89\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.58", "dest_ip": "10.20.16.248", "src_port": "51960", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047168, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"CJeoPTPX\\\", \\\"cityCode\\\": \\\"Juarezstad\\\", \\\"user\\\": \\\"Dustin Williams\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.25", "dest_ip": "10.20.16.248", "src_port": "51960", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047271, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 161\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.33", "src_port": "51962", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047271, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"cup exactly\\\", \\\"cityCode\\\": \\\"North Randallton\\\", \\\"lang\\\": \\\"ktVSxT1A\\\", \\\"limit\\\": \\\"management north\\\", \\\"drivingLicense\\\": \\\"686-69-3601\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.27", "src_port": "51962", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047274, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 127\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.23", "src_port": "51964", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047275, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"kfzwSVeW spend 13009094 civil\\\", \\\"cityCode\\\": \\\"North Emilystad\\\", \\\"offset\\\": \\\"blue\\\", \\\"House\\\": \\\"5188\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "51964", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047477, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 165\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51966", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047478, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"XdvNndWt choose fall minute 53424343\\\", \\\"cityCode\\\": \\\"Clineside\\\", \\\"limit\\\": \\\"DHiWuiLq edge although future RB032ST6\\\", \\\"CountryCode\\\": \\\"CZ\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.15", "dest_ip": "10.20.16.248", "src_port": "51966", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047580, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 207\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.43", "dest_ip": "10.20.16.248", "src_port": "51968", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047580, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"second EAPpuGRM\\\", \\\"cityCode\\\": \\\"Petersonshire\\\", \\\"lang\\\": \\\"6PAp0M0B\\\", \\\"limit\\\": \\\"OQzEavJB rock F31B9ADy begin 53183097 hope\\\", \\\"uUID\\\": \\\"22aa6c4c9224324980888624d6b0e57d24cdcf13\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.244.0.52", "src_port": "51968", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047583, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 175\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.52", "dest_ip": "10.20.16.248", "src_port": "51970", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047684, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"19944598 write\\\", \\\"cityCode\\\": \\\"Amandafort\\\", \\\"lang\\\": \\\"29009246 nmsYF0Bd gfXaXrfa than idea usually\\\", \\\"limit\\\": \\\"09796230\\\", \\\"apartment\\\": \\\"56958\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.59", "src_port": "51970", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047687, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 104\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.1", "src_port": "51972", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047688, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"stuff\\\", \\\"cityCode\\\": \\\"Higginsberg\\\", \\\"offset\\\": \\\"sense\\\", \\\"Lat\\\": \\\"22.7089305\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51972", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047790, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 221\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.31", "dest_ip": "10.20.16.248", "src_port": "51974", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047790, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"two meeting serve MihRX3po 11552801 CCHwmqzw\\\", \\\"cityCode\\\": \\\"East Paulchester\\\", \\\"lang\\\": \\\"81946667 OnHKKYpw\\\", \\\"limit\\\": \\\"recently m72oL18R agree 81438108 EdSULdgx\\\", \\\"PhoneCountryCode\\\": \\\"TG\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.18", "dest_ip": "10.20.16.248", "src_port": "51974", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047793, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 174\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51976", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047793, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"glass commercial really fK6isux8 78341245\\\", \\\"cityCode\\\": \\\"Cynthiamouth\\\", \\\"limit\\\": \\\"AgrLkssK 66054370 two decision\\\", \\\"Nationality\\\": \\\"Philippines\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "51976", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047997, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 229\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51978", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381047997, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"94629423 QiBwPHVa\\\", \\\"cityCode\\\": \\\"Jonathanview\\\", \\\"limit\\\": \\\"fish wall FMXpNTkR better\\\", \\\"offset\\\": \\\"12424776 industry agent north hUFzyJvY\\\", \\\"address\\\": \\\"61764 Tiffany Plains\\\nPort Barry, TX 14485\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.38", "dest_ip": "10.244.0.1", "src_port": "51978", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381048101, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 190\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "51980", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381048101, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"67985556 around\\\", \\\"cityCode\\\": \\\"Lake Lindsayville\\\", \\\"lang\\\": \\\"UJwANeVh our notice 63601874\\\", \\\"limit\\\": \\\"computer 73208952 crime\\\", \\\"Shareholder\\\": \\\"Rebecca Cox\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.10", "src_port": "51980", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381048104, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 139\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.59", "src_port": "51982", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381048104, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"wfZFeeCs military image\\\", \\\"cityCode\\\": \\\"Lake Dillonmouth\\\", \\\"limit\\\": \\\"84556305 she\\\", \\\"longitude\\\": \\\"-17.127131\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.19", "src_port": "51982", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381048308, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 163\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51984", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381048308, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"vTtYT9l0\\\", \\\"airportCode\\\": \\\"vMiGdYHI prevent national 38671487 education\\\", \\\"lang\\\": \\\"58492456 race half UMuGFGTx\\\", \\\"limit\\\": \\\"employee\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51984", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381048412, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 109\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51986", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381048413, "host_ip": "10.188.40.56", "data": "\"{\\\"latitude\\\": 56915520, \\\"longitude\\\": 4580523, \\\"Accept\\\": \\\"WFfSIOFR news all 20352959 vudSToRb world\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "51986", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381048414, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 174\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.1", "src_port": "51988", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381048515, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"33TuWzzq area 63648161 party tqFJONkv\\\", \\\"airlineCode\\\": \\\"38560883 uvtZvjqB N671fNdP certain\\\", \\\"offset\\\": \\\"krHpLwCV buy X8h1QVq0 institution material\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.46", "dest_ip": "10.20.16.248", "src_port": "51988", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381048518, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 117\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.39", "dest_ip": "10.20.16.248", "src_port": "51990", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381048519, "host_ip": "10.188.40.56", "data": "\"{\\\"Accept\\\": \\\"81662391 argue jAPcXwTx\\\", \\\"aircraftCode\\\": \\\"organization\\\", \\\"offset\\\": \\\"seat during SlXLTFPt\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.33", "dest_ip": "10.20.16.248", "src_port": "51990", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381049139, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 202\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "51992", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381049139, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"wLpGoxQq 99267012 figure BooDmxaa former\\\", \\\"destination\\\": \\\"uMlZiuWn\\\", \\\"fromDateTime\\\": \\\"every\\\", \\\"Accept\\\": \\\"wife\\\", \\\"limit\\\": \\\"43463501 HQvjWOMD claim do g35AXMTH popular\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.28", "dest_ip": "10.20.16.248", "src_port": "51992", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381049142, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 158\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.10", "dest_ip": "10.20.16.248", "src_port": "51994", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381049242, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"iTHqlzKR 18991930 check billion\\\", \\\"date\\\": \\\"2011-09-05\\\", \\\"Accept\\\": \\\"pqWzFLDg grfD1m5Z forget official\\\", \\\"offset\\\": \\\"wonder\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.24", "dest_ip": "10.244.0.1", "src_port": "51994", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381049245, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 190\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "51996", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381049246, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"zqhB4A0o sknvnXXe morning 93168858 student\\\", \\\"date\\\": \\\"1980-12-08\\\", \\\"Accept\\\": \\\"enjoy early 89867189\\\", \\\"offset\\\": \\\"19265957\\\", \\\"bankCity\\\": \\\"Martinezberg\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "51996", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381049450, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 202\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "51998", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381049450, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"provide\\\", \\\"date\\\": \\\"1970-02-11\\\", \\\"Accept\\\": \\\"allow vEhgaPIp 41bKOAuH effect\\\", \\\"offset\\\": \\\"condition kewtzLLx 50688250 XOe80lyC rise\\\", \\\"Account\\\": \\\"CEMN0920711423218\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.47", "src_port": "51998", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381049453, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 175\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.36", "src_port": "52000", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381049553, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"66205760 rich interest GxGQwPbV available\\\", \\\"date\\\": \\\"1989-03-08\\\", \\\"Accept\\\": \\\"41057441\\\", \\\"limit\\\": \\\"05221864\\\", \\\"IdNumber\\\": \\\"731-37-5818\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "52000", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381049556, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 180\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "52002", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381049557, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"Mr hold CWliIPba THvdHuyP\\\", \\\"date\\\": \\\"1981-08-03\\\", \\\"Accept\\\": \\\"773EScZt 04390566\\\", \\\"limit\\\": \\\"enter 89450667\\\", \\\"DocumentNumber\\\": \\\"741-41-1652\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "52002", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381049659, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 307\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.36", "dest_ip": "10.20.16.248", "src_port": "52004", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381049659, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"kQxVlzQi much CzitXPY8 politics 97130236 day\\\", \\\"date\\\": \\\"2008-12-23\\\", \\\"Accept\\\": \\\"meeting Lsf1HWnS vote oRxykZgd\\\", \\\"limit\\\": \\\"OuQeAfxX 2XJhvyHT level 34923570 check\\\", \\\"offset\\\": \\\"3RC43LGa thousand really 76746973 BlYlbxRS toward\\\", \\\"creditCard\\\": \\\"4726904709149697624\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.32", "dest_ip": "10.20.16.248", "src_port": "52004", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381049661, "host_ip": "10.188.40.56", "data": "a\r\n\\u0003\\u0000l\bn\\u00143\\u0001\\u0000\\u0000\r\n0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "80", "dest_port": "52004", "flags": "24", "is_pii": false} -{"timestamp": 1616381049662, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 289\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "52006", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381049662, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"AIqRQDce 39730166 north perform\\\", \\\"date\\\": \\\"2003-03-18\\\", \\\"Accept\\\": \\\"fight eUvTadon effort 05281556 tonight\\\", \\\"limit\\\": \\\"speech attorney MxHPhEZr woman 4oKic1WL\\\", \\\"offset\\\": \\\"Mrs 0Mka7w5A parent IMDjVxGM 04018463\\\", \\\"businessContact\\\": \\\"Robert Meyer\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "52006", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050075, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "52006", "flags": "24", "is_pii": false} -{"timestamp": 1616381050077, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 154\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.34", "src_port": "52010", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050077, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"force\\\", \\\"date\\\": \\\"2002-06-03\\\", \\\"Accept\\\": \\\"culture 11144994 community KDTRubIG xZEKoPTY baby\\\", \\\"province\\\": \\\"New Jersey\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "52010", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050180, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 130\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "52012", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050180, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"one\\\", \\\"date\\\": \\\"1991-06-03\\\", \\\"Accept\\\": \\\"hW52sFcr 32101326 activity\\\", \\\"FullName\\\": \\\"Sylvia Carr\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.41", "src_port": "52012", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050183, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 210\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "52014", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050284, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"police town 89182522\\\", \\\"date\\\": \\\"1994-01-05\\\", \\\"Accept\\\": \\\"38732985 MBJDf8XU eight\\\", \\\"offset\\\": \\\"act approach name 67127020 n3uau8uR SsryJKeS\\\", \\\"ReservationCode\\\": \\\"F1I6XVNI\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.14", "dest_ip": "10.20.16.248", "src_port": "52014", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050288, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 143\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "52016", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050288, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"wQRIMaho 78001645 matter\\\", \\\"date\\\": \\\"2013-05-23\\\", \\\"Accept\\\": \\\"CGlgQCpN YolEvrkD growth\\\", \\\"lon\\\": \\\"-86.426903\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.46", "src_port": "52016", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050390, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 146\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.46", "src_port": "52018", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050390, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"46719392\\\", \\\"date\\\": \\\"2007-02-20\\\", \\\"Accept\\\": \\\"cultural stand 44037061\\\", \\\"nationality\\\": \\\"British Virgin Islands\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "52018", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050393, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 176\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "52020", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050394, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"78683881 D4sA5lXC bllZPUez along street you\\\", \\\"date\\\": \\\"2018-05-14\\\", \\\"Accept\\\": \\\"actually agent Oiy1vagp civil sBZHmfiY\\\", \\\"dob\\\": \\\"1990-02-21\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "52020", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050596, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 272\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "52022", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050596, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"clear keFkYpo0\\\", \\\"destination\\\": \\\"VKnkZyhT 02899375 KRAwavdo prove investment\\\", \\\"date\\\": \\\"1992-01-15\\\", \\\"Accept\\\": \\\"20394789\\\", \\\"limit\\\": \\\"22869416 where throughout OOLOlIip FOoHvtN2 figure\\\", \\\"offset\\\": \\\"itllc57m drop QMylXgjd leg 21334897\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "52022", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050597, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "80", "dest_port": "52022", "flags": "24", "is_pii": false} -{"timestamp": 1616381050599, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 236\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "52024", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050698, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"friend finish 7dWD5pci\\\", \\\"destination\\\": \\\"Mr doctor\\\", \\\"date\\\": \\\"2005-04-05\\\", \\\"Accept\\\": \\\"firm denbL4yM 29327660 film ncENcTyD specific\\\", \\\"offset\\\": \\\"ulswnQwl JTQqGRf8\\\", \\\"CreditCard\\\": \\\"3555415280389506\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.31", "src_port": "52024", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050701, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 208\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "52026", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050702, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"admit teach 40266260 H9PqpfnB xLkJlZFY\\\", \\\"destination\\\": \\\"base\\\", \\\"date\\\": \\\"1990-08-22\\\", \\\"Accept\\\": \\\"moment\\\", \\\"limit\\\": \\\"cgCQapEc fine OW4qV82N\\\", \\\"User\\\": \\\"Mrs. Monica Castro\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.3", "src_port": "52026", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050804, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 213\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.15", "src_port": "52028", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050805, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"lead behavior e8cC4Mow star 66571683 ibkGDVqV\\\", \\\"destination\\\": \\\"week sJFEqZQD\\\", \\\"date\\\": \\\"1972-08-06\\\", \\\"Accept\\\": \\\"sea keflAlmp past GZpb3o3h 82525437 fly\\\", \\\"firstname\\\": \\\"Jennifer\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.14", "src_port": "52028", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050808, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 301\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.19", "src_port": "52030", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050808, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"available remain 3LWgol3T 88610601\\\", \\\"destination\\\": \\\"tend jEiVeiC2 mLqmMlgk share suggest 07601079\\\", \\\"date\\\": \\\"1980-04-27\\\", \\\"Accept\\\": \\\"OYrBuJUh only road kvgXOMUp\\\", \\\"limit\\\": \\\"pressure car president 91618729 BgochplE\\\", \\\"offset\\\": \\\"C2XSp0QX\\\", \\\"state\\\": \\\"Maryland\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.96.0.1", "dest_ip": "10.244.0.7", "src_port": "52030", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050909, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.52", "dest_ip": "10.244.0.1", "src_port": "80", "dest_port": "52030", "flags": "24", "is_pii": false} -{"timestamp": 1616381050910, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 242\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.20", "src_port": "52032", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381050911, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"both eight WiqAzt1J\\\", \\\"destination\\\": \\\"xnVhkoXE none 76210750 bit stuff EFiwFDSw\\\", \\\"date\\\": \\\"2019-01-22\\\", \\\"Accept\\\": \\\"GrFXQqzX 72677034 water UKHrus0V\\\", \\\"limit\\\": \\\"who kHOAjHGm 31576869\\\", \\\"Dba\\\": \\\"Porter PLC\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.41", "src_port": "52032", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051013, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 175\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.49", "src_port": "52034", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051013, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"ZNUrXD7E drive\\\", \\\"destination\\\": \\\"fKodmPl4 mkNNODwM\\\", \\\"date\\\": \\\"1997-06-20\\\", \\\"Accept\\\": \\\"push DHjmQ56x 39997405 half\\\", \\\"Location\\\": \\\"102.342535\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "52034", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051015, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 197\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "52036", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051015, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"draw ftMtuEk4 11740097 industry kdtmByMk expert\\\", \\\"destination\\\": \\\"v1QN5WNG suddenly\\\", \\\"date\\\": \\\"1978-01-29\\\", \\\"Accept\\\": \\\"around second ever\\\", \\\"ccountry\\\": \\\"Pakistan\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.1", "src_port": "52036", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051219, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 201\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.61", "dest_ip": "10.244.0.53", "src_port": "52038", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051219, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"dqFRGlzZ gas L6qrN4Wh 47458123 ask scientist\\\", \\\"destination\\\": \\\"80672014 XgWMZqJ4 data heavy\\\", \\\"date\\\": \\\"1970-07-01\\\", \\\"Accept\\\": \\\"U4Q6RSRt can\\\", \\\"nationality\\\": \\\"Estonia\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.31", "src_port": "52038", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051223, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 257\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "52040", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051223, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"century 34433921 single XPXesCMf\\\", \\\"destination\\\": \\\"19411089 appear notice DyjVrYrL sure\\\", \\\"date\\\": \\\"1977-09-18\\\", \\\"Accept\\\": \\\"84813118\\\", \\\"limit\\\": \\\"school akCuJeOH rSsYn3Xy statement\\\", \\\"offset\\\": \\\"later\\\", \\\"zip\\\": \\\"12519\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.57", "src_port": "52040", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051323, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "80", "dest_port": "52040", "flags": "24", "is_pii": false} -{"timestamp": 1616381051324, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 217\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.45", "src_port": "52042", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051325, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"population 3l4ECGT4 OPbkPLhO\\\", \\\"destination\\\": \\\"jLHgNQEg international mouth\\\", \\\"date\\\": \\\"1987-07-27\\\", \\\"Accept\\\": \\\"you sometimes 08588266 qh2HEJb0 UdpVvbkp factor\\\", \\\"PostalCode\\\": \\\"92867\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.23", "src_port": "52042", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051427, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 257\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.23", "dest_ip": "10.20.16.248", "src_port": "52044", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051427, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"full writer 0pqZVbmk\\\", \\\"destination\\\": \\\"IhJvrEti Ri3PlLYz figure stage\\\", \\\"date\\\": \\\"2016-03-21\\\", \\\"Accept\\\": \\\"if line adult UfeMgexX 35710245 DU05ccfm\\\", \\\"limit\\\": \\\"54777950\\\", \\\"offset\\\": \\\"finally if\\\", \\\"Phone\\\": \\\"5448326628\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "52044", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051428, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "52044", "flags": "24", "is_pii": false} -{"timestamp": 1616381051430, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 262\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.17", "src_port": "52046", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051430, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"message treat\\\", \\\"destination\\\": \\\"consumer 80530964\\\", \\\"date\\\": \\\"1972-06-27\\\", \\\"Accept\\\": \\\"vYccE5OR\\\", \\\"limit\\\": \\\"clearly address 62806444 management vdPYaLUG\\\", \\\"offset\\\": \\\"off deal eAIA2G6j 69475908\\\", \\\"Company\\\": \\\"Skinner-Giles\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "52046", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051431, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.244.0.50", "src_port": "80", "dest_port": "52046", "flags": "24", "is_pii": false} -{"timestamp": 1616381051531, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 254\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.59", "src_port": "52048", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051531, "host_ip": "10.188.40.56", "data": "\"{\\\"airportCode\\\": \\\"fall plant\\\", \\\"fromDateTime\\\": \\\"RbnECAJk stage aKvnTIsn reveal successful 98616040\\\", \\\"Accept\\\": \\\"word 06576768 rbwZDack\\\", \\\"limit\\\": \\\"possible dark LGOAjyEr\\\", \\\"offset\\\": \\\"xvMlajpE your 87666823 identify QnrqkuWf product\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "52048", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051534, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 131\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "52050", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051534, "host_ip": "10.188.40.56", "data": "\"{\\\"airportCode\\\": \\\"oqHYpQhg smile\\\", \\\"fromDateTime\\\": \\\"much\\\", \\\"Accept\\\": \\\"garden\\\", \\\"limit\\\": \\\"plant PM a0TYhq8J stand\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.8", "dest_ip": "10.20.16.248", "src_port": "52050", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051637, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 276\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "52052", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051637, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"president yNHwTSww back past xGZOwScv\\\", \\\"origin\\\": \\\"minute PKIWYXFR red 36878829\\\", \\\"destination\\\": \\\"yGTA4WgX\\\", \\\"date\\\": \\\"1982-03-25\\\", \\\"cabinClass\\\": \\\"NDtVnTKp candidate wrong 95778463 dream\\\", \\\"Accept\\\": \\\"order whether OwkqHCgY 44562160\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.23", "src_port": "52052", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051638, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.44", "src_port": "80", "dest_port": "52052", "flags": "24", "is_pii": false} -{"timestamp": 1616381051639, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 272\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.20.16.248", "src_port": "52054", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051640, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"course hear 86734835 NeEQEDe0\\\", \\\"origin\\\": \\\"EAEKyYzv learn election black\\\", \\\"destination\\\": \\\"government\\\", \\\"date\\\": \\\"2005-02-10\\\", \\\"cabinClass\\\": \\\"41773563 nation of\\\", \\\"Accept\\\": \\\"j1a0try7 quickly reduce\\\", \\\"latitude\\\": \\\"-37.033990\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "52054", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051641, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.15", "src_port": "80", "dest_port": "52054", "flags": "24", "is_pii": false} -{"timestamp": 1616381051642, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 320\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.20.16.248", "src_port": "33940", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051643, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"let 17593993\\\", \\\"origin\\\": \\\"QBQssEj0 that EWbkkYzQ 69616025 character\\\", \\\"destination\\\": \\\"mKaZwO5O theory message pzuXDBDk 16743508\\\", \\\"date\\\": \\\"2013-10-27\\\", \\\"cabinClass\\\": \\\"responsibility 91540595\\\", \\\"Accept\\\": \\\"wEnfEKhR Zml4D0TM 29475407 drop industry\\\", \\\"PhoneCountryCode\\\": \\\"SG\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.20.16.248", "src_port": "33940", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051741, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "33940", "flags": "24", "is_pii": false} -{"timestamp": 1616381051742, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 299\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "52058", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051743, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"iDt3kO0m 55682777 option\\\", \\\"origin\\\": \\\"red LoJuQBSQ\\\", \\\"destination\\\": \\\"fdknjQyB 04580113 name wUb5NIJq time\\\", \\\"date\\\": \\\"2011-06-09\\\", \\\"cabinClass\\\": \\\"one HbbpmeGp 71919214 nature\\\", \\\"Accept\\\": \\\"particular 62877803 EeheVGfk\\\", \\\"creditCard\\\": \\\"5562454893695179\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "52058", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051744, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.26", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "52058", "flags": "24", "is_pii": false} -{"timestamp": 1616381051745, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 299\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.41", "src_port": "33944", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051745, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"notice\\\", \\\"origin\\\": \\\"whose uMSURXav 80910645 speech\\\", \\\"destination\\\": \\\"GqwNCCFQ tzltEwzN reach 74900199 care site\\\", \\\"date\\\": \\\"1974-01-07\\\", \\\"cabinClass\\\": \\\"qyBPqBMO EMoMchys decade important\\\", \\\"Accept\\\": \\\"85766929 OoumahLY 5UT1xojR\\\", \\\"state\\\": \\\"Mississippi\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "33944", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051845, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.43", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "33944", "flags": "24", "is_pii": false} -{"timestamp": 1616381051847, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 271\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "33946", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051847, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"increase low single\\\", \\\"origin\\\": \\\"candidate 0oppvDLl probably\\\", \\\"destination\\\": \\\"02771412 feel\\\", \\\"date\\\": \\\"2019-12-30\\\", \\\"cabinClass\\\": \\\"democratic adult 69172106\\\", \\\"Accept\\\": \\\"common last ever 07954192\\\", \\\"IdCard\\\": \\\"252-64-5911\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "33946", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051848, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.48", "src_port": "80", "dest_port": "33946", "flags": "24", "is_pii": false} -{"timestamp": 1616381051849, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 287\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "33948", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051850, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"uSFjnjIT 54434399 red open few\\\", \\\"origin\\\": \\\"lMZvhrod bfvI6ixy woman 36842838 system\\\", \\\"destination\\\": \\\"these DjGgbXuF may 65721691\\\", \\\"date\\\": \\\"1992-11-16\\\", \\\"cabinClass\\\": \\\"when\\\", \\\"Accept\\\": \\\"hot\\\", \\\"businessName\\\": \\\"Adams, Lawrence and Stewart\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "33948", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051949, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "33948", "flags": "24", "is_pii": false} -{"timestamp": 1616381051950, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 310\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "52066", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051951, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"2rBgR6Il help opportunity XRTAZzKQ\\\", \\\"origin\\\": \\\"environmental 2c1E4sXc\\\", \\\"destination\\\": \\\"everybody 57379315\\\", \\\"date\\\": \\\"1984-06-28\\\", \\\"cabinClass\\\": \\\"SesZddKZ themselves 71523925 vxapYU3c character less\\\", \\\"Accept\\\": \\\"woman 9LtiRDEI black\\\", \\\"TaxId\\\": \\\"Compton-Bryant\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.17", "dest_ip": "10.20.16.248", "src_port": "52066", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051952, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "80", "dest_port": "52066", "flags": "24", "is_pii": false} -{"timestamp": 1616381051953, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 266\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "33952", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381051954, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"OlxEORSj\\\", \\\"origin\\\": \\\"WasNPKIT LlxgbvtP\\\", \\\"destination\\\": \\\"service able sell\\\", \\\"date\\\": \\\"2003-02-23\\\", \\\"cabinClass\\\": \\\"16561044\\\", \\\"Accept\\\": \\\"win southern vQ3dJHlj IzdRFcNh 37514647 hope\\\", \\\"phone\\\": \\\"001-919-667-3349x58544\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "33952", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052053, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.44", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "33952", "flags": "24", "is_pii": false} -{"timestamp": 1616381052054, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 286\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "33954", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052055, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"rAhEyB27 sign understand oODgYXRm morning 41399034\\\", \\\"origin\\\": \\\"62952641\\\", \\\"destination\\\": \\\"LBmBLsXx\\\", \\\"date\\\": \\\"2006-07-31\\\", \\\"cabinClass\\\": \\\"09410226 evidence\\\", \\\"Accept\\\": \\\"if difficult\\\", \\\"serial\\\": \\\"344d58d09b2cf9c25a7be2dbf578052252846d57\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "33954", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052056, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "33954", "flags": "24", "is_pii": false} -{"timestamp": 1616381052057, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 285\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.33", "src_port": "33956", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052058, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"Duzhb38b summer report XhMUmVok off 44929865\\\", \\\"origin\\\": \\\"EHlvGidq Sylq3a1b go program conference\\\", \\\"destination\\\": \\\"value\\\", \\\"date\\\": \\\"2000-04-12\\\", \\\"cabinClass\\\": \\\"sport 48036197\\\", \\\"Accept\\\": \\\"fvpYHxgb ball\\\", \\\"drivingLicense\\\": \\\"840-53-5576\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.16", "dest_ip": "10.20.16.248", "src_port": "33956", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052157, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "80", "dest_port": "33956", "flags": "24", "is_pii": false} -{"timestamp": 1616381052158, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 243\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "33958", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052159, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"professor\\\", \\\"origin\\\": \\\"nearly\\\", \\\"destination\\\": \\\"worry\\\", \\\"date\\\": \\\"2019-12-13\\\", \\\"cabinClass\\\": \\\"BtpFwdaB jFw3vUYY 04913399 only foot\\\", \\\"Accept\\\": \\\"recently JvmgHtny dream\\\", \\\"IdNumber\\\": \\\"487-05-0102\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.27", "src_port": "33958", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052161, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 295\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.17", "src_port": "33960", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052161, "host_ip": "10.188.40.56", "data": "\"{\\\"flightNumber\\\": \\\"ppDAMxMN 58691652 item Hqfvjf5O\\\", \\\"origin\\\": \\\"produce HdPzsZM0 couple enough\\\", \\\"destination\\\": \\\"draw brother 72522590\\\", \\\"date\\\": \\\"2014-04-25\\\", \\\"cabinClass\\\": \\\"ESCrrWBs drive W4OHW34z by\\\", \\\"Accept\\\": \\\"guy 45339002\\\", \\\"BusinessContact\\\": \\\"Andrea Cardenas\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.42", "src_port": "33960", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052261, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "33960", "flags": "24", "is_pii": false} -{"timestamp": 1616381052263, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 82\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.39", "src_port": "33962", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052263, "host_ip": "10.188.40.56", "data": "\"{\\\"location\\\": \\\"-8.726891\\\", \\\"Accept\\\": \\\"weight song gQelkAt1 zNcNHJdr gun\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "33962", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052365, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 90\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.24", "src_port": "33964", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052365, "host_ip": "10.188.40.56", "data": "\"{\\\"location\\\": \\\"-69.745868\\\", \\\"Accept\\\": \\\"hope 21626160\\\", \\\"lastname\\\": \\\"Holland\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.32", "dest_ip": "10.20.16.248", "src_port": "33964", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052368, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 242\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.61", "src_port": "33966", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052469, "host_ip": "10.188.40.56", "data": "\"{\\\"location\\\": \\\"7.629137\\\", \\\"Accept\\\": \\\"specific\\\", \\\"cabinClass\\\": \\\"atTKDcvH space hes210QL expect 29354851\\\", \\\"tierCode\\\": \\\"language\\\", \\\"lang\\\": \\\"close hWbIf2Dz author 95153638 stop PDdKpTcT\\\", \\\"drivingLicense\\\": \\\"634-48-7851\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.18", "src_port": "33966", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052473, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 137\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.24", "src_port": "33968", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052473, "host_ip": "10.188.40.56", "data": "\"{\\\"location\\\": \\\"112.685366\\\", \\\"Accept\\\": \\\"39178228 trip\\\", \\\"cabinClass\\\": \\\"gZ94ws9J 88816292 wait\\\", \\\"Timestamp\\\": \\\"665234223\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "33968", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052576, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 181\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.18", "src_port": "33970", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052577, "host_ip": "10.188.40.56", "data": "\"{\\\"location\\\": \\\"30.698996\\\", \\\"Accept\\\": \\\"SgbvUlfg\\\", \\\"tierCode\\\": \\\"might data no22cIkl rIDQmuYg see\\\", \\\"lang\\\": \\\"fcXBeqZL 62050440 KuTQyYKg\\\", \\\"latitude\\\": \\\"72.1805885\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.20", "dest_ip": "10.244.0.57", "src_port": "33970", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052578, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 179\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.244.0.1", "src_port": "33972", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052679, "host_ip": "10.188.40.56", "data": "\"{\\\"location\\\": \\\"79.283475\\\", \\\"Accept\\\": \\\"field 53083990 MttlqUuY couple\\\", \\\"lang\\\": \\\"zsggSZi8 interview\\\", \\\"Signature_sha1\\\": \\\"59e26c449351efdd7057ce9d9069bc83100c2ee7\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.39", "src_port": "33972", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052683, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 158\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.61", "dest_ip": "10.244.0.47", "src_port": "33974", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052683, "host_ip": "10.188.40.56", "data": "\"{\\\"location\\\": \\\"94.497620\\\", \\\"Accept\\\": \\\"ZCllVAUL HPNwOoNt 96629590 source\\\", \\\"cabinClass\\\": \\\"FFRnAHHu argue 20019752 third\\\", \\\"dob\\\": \\\"1972-10-31\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "33974", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052786, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 137\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.44", "src_port": "33976", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052787, "host_ip": "10.188.40.56", "data": "\"{\\\"location\\\": \\\"-172.933999\\\", \\\"Accept\\\": \\\"vMgeNZZY son care find MYUPjqUK\\\", \\\"cabinClass\\\": \\\"site\\\", \\\"State\\\": \\\"North Dakota\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "33976", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052788, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 78\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.36", "dest_ip": "10.20.16.248", "src_port": "33978", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052889, "host_ip": "10.188.40.56", "data": "\"{\\\"location\\\": \\\"176.507369\\\", \\\"Accept\\\": \\\"she\\\", \\\"countryCode\\\": \\\"KN\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "33978", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052893, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 132\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.100.150.125", "dest_ip": "10.244.0.59", "src_port": "33980", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052893, "host_ip": "10.188.40.56", "data": "\"{\\\"location\\\": \\\"134.014661\\\", \\\"Accept\\\": \\\"system\\\", \\\"tierCode\\\": \\\"without poor RBdtaSdC 8LIhMJYD\\\", \\\"lat\\\": \\\"-34.0580665\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "33980", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052996, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 282\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "33982", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052996, "host_ip": "10.188.40.56", "data": "\"{\\\"location\\\": \\\"-114.319486\\\", \\\"Accept\\\": \\\"end 36462245 admit bbKhXKne raeEKewo write\\\", \\\"cabinClass\\\": \\\"occur A7YZskAl 81829345 force UzVTGMWI suddenly\\\", \\\"tierCode\\\": \\\"human receive n5WxQBHC later\\\", \\\"lang\\\": \\\"GVfkMfJq customer\\\", \\\"email\\\": \\\"stevennorris@gmail.com\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.20", "dest_ip": "10.20.16.248", "src_port": "33982", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052997, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "33982", "flags": "24", "is_pii": false} -{"timestamp": 1616381052998, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 127\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.54", "dest_ip": "10.20.16.248", "src_port": "33984", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381052999, "host_ip": "10.188.40.56", "data": "\"{\\\"location\\\": \\\"-108.494629\\\", \\\"Accept\\\": \\\"level VXQwUUSn 53558197 RopUr1JX\\\", \\\"lang\\\": \\\"auxwUtzB\\\", \\\"zip\\\": \\\"95575\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "33984", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381053200, "host_ip": "10.188.40.56", "data": "\"{\\\"location\\\": \\\"-108.494629\\\", \\\"Accept\\\": \\\"level VXQwUUSn 53558197 RopUr1JX\\\", \\\"lang\\\": \\\"auxwUtzB\\\", \\\"zip\\\": \\\"95575\\\"}\"", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.32", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "33984", "flags": "24", "is_pii": false} -{"timestamp": 1616381053202, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 208\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "33986", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381053202, "host_ip": "10.188.40.56", "data": "\"{\\\"location\\\": \\\"55.526607\\\", \\\"Accept\\\": \\\"medical claim SK38rTws 47721974 ilmfYitA street\\\", \\\"cabinClass\\\": \\\"family ofqdnTqt\\\", \\\"lang\\\": \\\"PMtyNkoV surface 50955587 memory\\\", \\\"PostalCode\\\": \\\"09082\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "33986", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381053204, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 121\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "33988", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381053303, "host_ip": "10.188.40.56", "data": "\"{\\\"aWBPrefix\\\": \\\"machine special modern EpmwpYJA 32299853\\\", \\\"aWBNumber\\\": \\\"under large\\\", \\\"Accept\\\": \\\"training\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.29", "src_port": "33988", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381053306, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 183\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.20.16.248", "src_port": "33990", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381053307, "host_ip": "10.188.40.56", "data": "\"{\\\"origin\\\": \\\"increase realize\\\", \\\"destination\\\": \\\"99248127 sign involve\\\", \\\"fromDate\\\": \\\"95143247 ES5aoSSl open DfFqrYSc\\\", \\\"productCode\\\": \\\"FWN\\\", \\\"Accept\\\": \\\"qPF1ooCr\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.24", "dest_ip": "10.244.0.1", "src_port": "33990", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381053511, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 24\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.41", "dest_ip": "10.20.16.248", "src_port": "33992", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381053512, "host_ip": "10.188.40.56", "data": "\"{\\\"start\\\": 938179817}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.41", "src_port": "33992", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381053514, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 42\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.2", "src_port": "33994", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381053613, "host_ip": "10.188.40.56", "data": "\"{\\\"tags\\\": \\\"GAmXyrGq camera Q9zrGPTX\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.19", "src_port": "33994", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381053616, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 25\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.59", "src_port": "33996", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381053617, "host_ip": "10.188.40.56", "data": "\"{\\\"start\\\": -592912978}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.20.16.248", "src_port": "33996", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381053821, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 77\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "33998", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381053822, "host_ip": "10.188.40.56", "data": "\"{\\\"q\\\": \\\"vote positive RyLJNY2k waGmfMLm teacher\\\", \\\"source\\\": \\\"NSIDC\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.36", "src_port": "33998", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381053924, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 261\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "34000", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381053924, "host_ip": "10.188.40.56", "data": "\"{\\\"searchTerms\\\": \\\"college 94230895 film beautiful\\\", \\\"count\\\": 853078985, \\\"startIndex\\\": -506875999, \\\"spatial\\\": \\\"NbUb2JMf\\\", \\\"sortKeys\\\": \\\"temporal_duration,,asc\\\", \\\"startDate\\\": \\\"1981-08-22\\\", \\\"facetFilters\\\": \\\"Latqz9pF\\\", \\\"source\\\": \\\"NSIDC\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.34", "src_port": "34000", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381053925, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "80", "dest_port": "34000", "flags": "24", "is_pii": false} -{"timestamp": 1616381053926, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 85\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "34002", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381053927, "host_ip": "10.188.40.56", "data": "\"{\\\"count\\\": -815309097, \\\"startIndex\\\": 603371713, \\\"sortKeys\\\": \\\"updated,,desc\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "34002", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381054028, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 33\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.100.150.125", "dest_ip": "10.244.0.59", "src_port": "34004", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381054028, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Sarah Carey\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "34004", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381054031, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 84\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.23", "dest_ip": "10.20.16.248", "src_port": "34006", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381054132, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Tyler Miller\\\", \\\"Request\\\": null, \\\"passport\\\": \\\"105-26-0449\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "34006", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381054135, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 96\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.1", "src_port": "34008", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381054136, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Sylvia Riley\\\", \\\"Request\\\": null, \\\"PostalCode\\\": \\\"87032\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "34008", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381054340, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 110\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "34010", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381054340, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Alexander Taylor\\\", \\\"Request\\\": null, \\\"Iban\\\": \\\"GB28VMZV3986062473617\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.30", "src_port": "34010", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381054444, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 92\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "34012", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381054444, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Lucas Brown\\\", \\\"Request\\\": null, \\\"apartment\\\": \\\"994\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.14", "dest_ip": "10.20.16.248", "src_port": "34012", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381054447, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 107\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.32", "src_port": "34014", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381054448, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Raymond Thompson\\\", \\\"Request\\\": null, \\\"FullName\\\": \\\"Richard Palmer\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.41", "dest_ip": "10.20.16.248", "src_port": "34014", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381054651, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 93\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "34016", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381054652, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Sara Chapman\\\", \\\"Request\\\": null, \\\"businessContact\\\": \\\"Amanda Lester\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.37", "src_port": "34016", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381054754, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 107\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.38", "src_port": "34018", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381054754, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Deborah Reese\\\", \\\"Request\\\": null, \\\"DocumentNumber\\\": \\\"073-56-7725\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.25", "src_port": "34018", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381054757, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 94\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.27", "src_port": "34020", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381054858, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Megan Burns\\\", \\\"Request\\\": null, \\\"Organization\\\": \\\"Schroeder and Sons\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "34020", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381054862, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 81\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.41", "dest_ip": "10.244.0.1", "src_port": "34022", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381054862, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Ronnie Johnson\\\", \\\"Request\\\": null, \\\"Apartment\\\": \\\"21968\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.19", "dest_ip": "10.20.16.248", "src_port": "34022", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055066, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 88\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.244.0.1", "src_port": "34024", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055066, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Victor Grant\\\", \\\"Request\\\": null, \\\"Apt\\\": \\\"6438\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.21", "src_port": "34024", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055069, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 82\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.24", "dest_ip": "10.20.16.248", "src_port": "34026", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055169, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Keith Villarreal\\\", \\\"Request\\\": null, \\\"dba\\\": \\\"Miller Inc\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "34026", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055173, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 92\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.23", "dest_ip": "10.20.16.248", "src_port": "34028", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055173, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Jacob Wilson\\\", \\\"Request\\\": null, \\\"IdentityDocument\\\": \\\"551-41-5351\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.20.16.248", "src_port": "34028", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055276, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 34\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.58", "dest_ip": "10.20.16.248", "src_port": "34030", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055277, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Amanda Frank\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.24", "src_port": "34030", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055278, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 72\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.52", "src_port": "34032", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055379, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Linda Cole\\\", \\\"businessContact\\\": \\\"Robert Miller\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "34032", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055383, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 64\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "34034", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055383, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Morgan Young\\\", \\\"Location\\\": \\\"-85.764472\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.1", "src_port": "34034", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055485, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 76\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "34036", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055486, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"James Underwood\\\", \\\"IdentityDocument\\\": \\\"785-75-9663\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "34036", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055488, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 68\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.24", "src_port": "34038", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055588, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Kyle Waller\\\", \\\"reservationCode\\\": \\\"QAMWWLYT\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "34038", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055592, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 80\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.244.0.57", "src_port": "34040", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055592, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Gregory Parker\\\", \\\"firstname\\\": \\\"Jessica\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.17", "src_port": "34040", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055695, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 59\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "34042", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055696, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Martha Young\\\", \\\"lon\\\": \\\"-51.870806\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.39", "dest_ip": "10.244.0.48", "src_port": "34042", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055697, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 85\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.13", "dest_ip": "10.244.0.1", "src_port": "34044", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055798, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Dennis Wu\\\", \\\"email\\\": \\\"chadkelly@jenkins.com\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "34044", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055802, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 87\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "34046", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055802, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Vincent Burnett\\\", \\\"organization\\\": \\\"Moon-Gibbs\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.10", "dest_ip": "10.244.0.1", "src_port": "34046", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055905, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 79\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.5", "src_port": "34048", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055906, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Cheryl Foster\\\", \\\"User\\\": \\\"Bruce Suarez\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.48", "dest_ip": "10.244.0.23", "src_port": "34048", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381055907, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 73\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.34", "src_port": "34050", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056008, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Paul Gutierrez\\\", \\\"documentNumber\\\": \\\"741-44-0507\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "34050", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056012, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 68\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "34052", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056012, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Jennifer Boyd\\\", \\\"RecordLocator\\\": \\\"61U1HNR0\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "34052", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056114, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 84\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "34054", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056115, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Melissa Aguirre\\\", \\\"IdNumber\\\": \\\"521-18-0869\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.25", "dest_ip": "10.20.16.248", "src_port": "34054", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056116, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 36\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.46", "dest_ip": "10.20.16.248", "src_port": "34056", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056217, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Hannah Miranda\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "34056", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056221, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 84\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.49", "src_port": "34058", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056221, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Frederick Bradshaw\\\", \\\"Location\\\": \\\"8.254528\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.20", "src_port": "34058", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056324, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 69\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.13", "dest_ip": "10.20.16.248", "src_port": "34060", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056324, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Pamela Williams\\\", \\\"firstname\\\": \\\"Christopher\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "34060", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056327, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 87\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.55", "dest_ip": "10.20.16.248", "src_port": "34062", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056428, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Christopher Jones\\\", \\\"company\\\": \\\"Weber-Sanford\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "34062", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056431, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 62\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "34064", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056432, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Tammie Griffin\\\", \\\"Lat\\\": \\\"-79.9100445\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "34064", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056534, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 79\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "34066", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056535, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Steven Diaz\\\", \\\"phoneCountryCode\\\": \\\"BE\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.15", "src_port": "34066", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056536, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 85\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.30", "src_port": "34068", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056637, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Michael Ramirez\\\", \\\"Bic\\\": \\\"URLL5138765754466\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "34068", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056641, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 84\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.39", "dest_ip": "10.244.0.57", "src_port": "34070", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056641, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Jennifer Bailey\\\", \\\"passport\\\": \\\"896-90-4432\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "34070", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056845, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 68\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.16", "dest_ip": "10.20.16.248", "src_port": "34072", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056845, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Zachary Kramer\\\", \\\"Bic\\\": \\\"ACEL9982594794155\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.30", "src_port": "34072", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056949, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 61\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "34074", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056950, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Gary Hancock\\\", \\\"Ccountry\\\": \\\"Germany\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.23", "src_port": "34074", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381056952, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 71\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "34076", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057052, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Christopher Gonzalez\\\", \\\"user\\\": \\\"Kristie Lopez\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "34076", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057055, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 115\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.10", "dest_ip": "10.20.16.248", "src_port": "34078", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057056, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Katherine Martinez\\\", \\\"Address\\\": \\\"7841 Emily Prairie\\\nNew Eddie, ND 52025\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.17", "dest_ip": "10.20.16.248", "src_port": "34078", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057260, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 82\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.23", "dest_ip": "10.20.16.248", "src_port": "34080", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057260, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Tammy Edwards\\\", \\\"IdNumber\\\": \\\"181-73-3116\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.29", "src_port": "34080", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057364, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 32\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.10", "dest_ip": "10.20.16.248", "src_port": "34082", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057365, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Lori Kirby\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "34082", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057366, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 74\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.25", "src_port": "34084", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057467, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Kristin Washington MD\\\", \\\"Passport\\\": \\\"554-70-6345\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.28", "src_port": "34084", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057470, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 85\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.21", "src_port": "34086", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057471, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Justin Hogan\\\", \\\"ReservationCode\\\": \\\"XA2ZKOGT\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.41", "src_port": "34086", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057573, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 72\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.16", "src_port": "34088", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057573, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Mary Valencia\\\", \\\"Shareholder\\\": \\\"Melissa Montes\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.44", "dest_ip": "10.20.16.248", "src_port": "34088", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057576, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 75\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.27", "dest_ip": "10.20.16.248", "src_port": "34090", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057677, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Brenda Santiago\\\", \\\"creditCard\\\": \\\"3546318152596392\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.18", "src_port": "34090", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057680, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 74\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.52", "src_port": "34092", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057681, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Karen Conrad\\\", \\\"Lat\\\": \\\"85.275257\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.20.16.248", "src_port": "34092", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057783, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 59\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "34094", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057783, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Jordan Jones\\\", \\\"countryCode\\\": \\\"PA\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "34094", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057786, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 84\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.43", "dest_ip": "10.20.16.248", "src_port": "34096", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057787, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Lindsay Huang\\\", \\\"dateOfBirth\\\": \\\"1977-09-14\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.26", "dest_ip": "10.20.16.248", "src_port": "34096", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057989, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 76\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.24", "src_port": "34098", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381057989, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Sarah Barrett\\\", \\\"lat\\\": \\\"-60.215808\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.14", "dest_ip": "10.20.16.248", "src_port": "34098", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381058093, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 76\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.19", "dest_ip": "10.244.0.1", "src_port": "34100", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381058094, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Stacy Jones\\\", \\\"lastname\\\": \\\"Nielsen\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "34100", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381058095, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 56\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "34102", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381058096, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Ashley King\\\", \\\"building\\\": \\\"008\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.18", "src_port": "34102", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381058298, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 79\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "34104", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381058298, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"username\\\": \\\"Kevin Flores\\\", \\\"taxId\\\": \\\"Smith-Hanson\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.20.16.248", "src_port": "34104", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381058402, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 93\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "34106", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381058402, "host_ip": "10.188.40.56", "data": "\"{\\\"username\\\": \\\"Jason Fernandez\\\", \\\"UUID\\\": \\\"d77029b957c116842d43e0f260162434d835d36b\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.1", "src_port": "34106", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381058405, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 42\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.20", "dest_ip": "10.20.16.248", "src_port": "34108", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381058405, "host_ip": "10.188.40.56", "data": "\"{\\\"account-key\\\": \\\"BJYB6844893352749\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.16", "dest_ip": "10.20.16.248", "src_port": "34108", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381058609, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 124\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.29", "src_port": "34110", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381058609, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"account-key\\\": \\\"SCIB2258533454207\\\", \\\"Signature_sha1\\\": \\\"b1ce0c4af1ba721031be830f15bc132336b84c2c\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.38", "dest_ip": "10.244.0.1", "src_port": "34110", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381058713, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 95\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.46", "dest_ip": "10.20.16.248", "src_port": "34112", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381058713, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"account-key\\\": \\\"BMUP5459300559042\\\", \\\"Phone\\\": \\\"+1-999-843-2617x2589\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.14", "dest_ip": "10.20.16.248", "src_port": "34112", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381058716, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 113\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "34114", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381058716, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"account-key\\\": \\\"WGWH7497176903588\\\", \\\"businessName\\\": \\\"Campbell, Calhoun and Maldonado\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "34114", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381058920, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 78\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.28", "src_port": "34116", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381058920, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"account-key\\\": \\\"IYFP6201304778201\\\", \\\"Zip\\\": \\\"06914\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.33", "dest_ip": "10.20.16.248", "src_port": "34116", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059024, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 95\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "34118", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059024, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"account-key\\\": \\\"LXUK3985852372142\\\", \\\"documentNumber\\\": \\\"266-88-7565\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "34118", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059027, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 88\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "34120", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059027, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"account-key\\\": \\\"QXLL1240110128612\\\", \\\"dba\\\": \\\"Rosales-Sweeney\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "34120", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059231, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 85\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.34", "src_port": "34122", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059231, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"account-key\\\": \\\"QFDY7066297453974\\\", \\\"PostalCode\\\": \\\"19053\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.15", "src_port": "34122", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059335, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 95\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.14", "src_port": "34124", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059335, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"account-key\\\": \\\"FLHJ7519334529584\\\", \\\"drivingLicense\\\": \\\"856-33-1982\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.49", "dest_ip": "10.244.0.50", "src_port": "34124", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059338, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 97\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.25", "src_port": "34126", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059338, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"account-key\\\": \\\"ZCNO8710931579245\\\", \\\"IdentityDocument\\\": \\\"473-94-8751\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.33", "dest_ip": "10.20.16.248", "src_port": "34126", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059542, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 83\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.20.16.248", "src_port": "34128", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059542, "host_ip": "10.188.40.56", "data": "\"{\\\"null\\\": null, \\\"account-key\\\": \\\"GTRQ8103435269453\\\", \\\"City\\\": \\\"Terryfurt\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.12", "dest_ip": "10.20.16.248", "src_port": "34128", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059646, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 78\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.10", "dest_ip": "10.20.16.248", "src_port": "34130", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059646, "host_ip": "10.188.40.56", "data": "\"{\\\"account-key\\\": \\\"IGAX3210929587548\\\", \\\"Account\\\": \\\"GTCJ8702874032373\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.35", "dest_ip": "10.20.16.248", "src_port": "34130", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059649, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 80\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.7", "dest_ip": "10.20.16.248", "src_port": "34132", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059650, "host_ip": "10.188.40.56", "data": "\"{\\\"account-key\\\": \\\"BUKW2298546936658\\\", \\\"creditCard\\\": \\\"4251200531833394\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.28", "src_port": "34132", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059852, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 102\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "34134", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059852, "host_ip": "10.188.40.56", "data": "\"{\\\"keyId\\\": \\\"95734368 garden 9glrV7ST\\\", \\\"apiID\\\": \\\"American 25616360 day tmt1ssWZ wUBCwgik it\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.10", "src_port": "34134", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059956, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 43\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.33", "src_port": "34136", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059956, "host_ip": "10.188.40.56", "data": "\"{\\\"keyId\\\": \\\"choose join OMzbYB3W its\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.58", "src_port": "34136", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059959, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 49\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.20.16.248", "src_port": "34138", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381059959, "host_ip": "10.188.40.56", "data": "\"{\\\"keyId\\\": \\\"riqNlbT2 seven window 70804830\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.244.0.59", "src_port": "34138", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381060163, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 23\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.39", "src_port": "34140", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381060163, "host_ip": "10.188.40.56", "data": "\"{\\\"keyId\\\": \\\"drop\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.18", "dest_ip": "10.20.16.248", "src_port": "34140", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381060267, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 59\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "34142", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381060268, "host_ip": "10.188.40.56", "data": "\"{\\\"apiID\\\": \\\"sIdwvxNl eye vote 08766628 talk M8HJ4RRu\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.17", "dest_ip": "10.244.0.1", "src_port": "34142", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381060474, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 40\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.44", "dest_ip": "10.20.16.248", "src_port": "34144", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381060474, "host_ip": "10.188.40.56", "data": "\"{\\\"apiID\\\": \\\"45429191 key 3iBDRrAm\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.14", "src_port": "34144", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381060476, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 32\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.45", "dest_ip": "10.20.16.248", "src_port": "34146", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381060576, "host_ip": "10.188.40.56", "data": "\"{\\\"apiID\\\": \\\"SVMbqJD3 tell\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.60", "dest_ip": "10.20.16.248", "src_port": "34146", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381060579, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 68\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "34148", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381060580, "host_ip": "10.188.40.56", "data": "\"{\\\"siteType_Id\\\": 467070697, \\\"version\\\": \\\"42062943 commercial\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.59", "src_port": "34148", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381060784, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 70\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.30", "dest_ip": "10.20.16.248", "src_port": "34150", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381060784, "host_ip": "10.188.40.56", "data": "\"{\\\"version\\\": \\\"02887753 population series meet qAMGJmys qHauuqPc\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.59", "dest_ip": "10.20.16.248", "src_port": "34150", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381060787, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 97\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.28", "src_port": "34152", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381060888, "host_ip": "10.188.40.56", "data": "\"{\\\"site_Ids\\\": \\\"48249325 eFPTIbgd particular IY627AQC off simply\\\", \\\"version\\\": \\\"CwWkwZtE\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.17", "dest_ip": "10.20.16.248", "src_port": "34152", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381060890, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 57\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.10", "dest_ip": "10.20.16.248", "src_port": "34154", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381060890, "host_ip": "10.188.40.56", "data": "\"{\\\"version\\\": \\\"whatever xqPBbhPy major see ZNfXOhzy\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.27", "dest_ip": "10.20.16.248", "src_port": "34154", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381061094, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 281\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.34", "dest_ip": "10.20.16.248", "src_port": "34156", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381061094, "host_ip": "10.188.40.56", "data": "\"{\\\"report_type\\\": \\\"dream hour\\\", \\\"sites\\\": \\\"think\\\", \\\"start_date\\\": \\\"73960393 yopghSag play HgWwFrTc hotel\\\", \\\"end_date\\\": \\\"artist OVxVAZwL QLgKGiyJ turn\\\", \\\"page\\\": -19568981, \\\"page_size\\\": -112522524, \\\"version\\\": \\\"Gl80eI0f society including jrzpjRsW much 41591374\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.57", "dest_ip": "10.244.0.55", "src_port": "34156", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381061095, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.27", "dest_ip": "10.20.16.248", "src_port": "80", "dest_port": "34156", "flags": "24", "is_pii": false} -{"timestamp": 1616381061096, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 338\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.23", "dest_ip": "10.20.16.248", "src_port": "34158", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381061097, "host_ip": "10.188.40.56", "data": "\"{\\\"report_type\\\": \\\"nothing BVngIozZ\\\", \\\"sites\\\": \\\"wykVsiYc\\\", \\\"start_date\\\": \\\"yes eight beyond xOMLysFH GSuuPegX 87184694\\\", \\\"end_date\\\": \\\"personal 38673459 FnRedPTR edge wVXXmjdv edge\\\", \\\"page\\\": -741216290, \\\"page_size\\\": 240202058, \\\"reportSubTypeId\\\": 851074821, \\\"version\\\": \\\"computer detail available GjHNhtL6 86897829\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.29", "dest_ip": "10.20.16.248", "src_port": "34158", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381061098, "host_ip": "10.188.40.56", "data": "0\r\n\r\n", "src_mac": "b4:a9:fc:3c:46:f8", "dest_mac": "04:3f:72:bf:af:74", "protocol": "6", "src_ip": "10.244.0.50", "dest_ip": "10.244.0.49", "src_port": "80", "dest_port": "34158", "flags": "24", "is_pii": false} -{"timestamp": 1616381061197, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 154\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.58", "src_port": "34160", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381061198, "host_ip": "10.188.40.56", "data": "\"{\\\"sites\\\": \\\"establish\\\", \\\"start_date\\\": \\\"performance direction process\\\", \\\"end_date\\\": \\\"3sAX8XE5 serious\\\", \\\"version\\\": \\\"41367067 police them\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.1", "dest_ip": "10.244.0.33", "src_port": "34160", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381061199, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 152\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.45", "src_port": "34162", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381061300, "host_ip": "10.188.40.56", "data": "\"{\\\"siteId\\\": \\\"walk 58738489\\\", \\\"start_date\\\": \\\"ground\\\", \\\"end_date\\\": \\\"need AYXXCmw8 body threat 33754513\\\", \\\"version\\\": \\\"old space 05913395\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.5", "dest_ip": "10.244.0.1", "src_port": "34162", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381061303, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 117\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "34164", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381061405, "host_ip": "10.188.40.56", "data": "\"{\\\"area_Ids\\\": \\\"finish Congress 53599432 administration PzrRkugj\\\", \\\"version\\\": \\\"RgUAAuHW R4ygy07S need civil\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.60", "src_port": "34164", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381061408, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 61\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.20.16.248", "dest_ip": "10.244.0.10", "src_port": "34166", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381061409, "host_ip": "10.188.40.56", "data": "\"{\\\"version\\\": \\\"home yUvQbYds 04891150 yKjaBje3 leg time\\\"}\"", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.10", "dest_ip": "10.244.0.48", "src_port": "34166", "dest_port": "80", "flags": "24", "is_pii": false} -{"timestamp": 1616381061511, "host_ip": "10.188.40.56", "data": "POST /simpledatagen/ HTTP/1.1\r\nHost: echo.gtc1.netqdev.cumulusnetworks.com\r\nUser-Agent: python-requests/2.22.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: 68\r\nContent-Type: application/json\r\n\r\n", "src_mac": "04:3f:72:bf:af:74", "dest_mac": "b4:a9:fc:3c:46:f8", "protocol": "6", "src_ip": "10.244.0.26", "dest_ip": "10.20.16.248", "src_port": "34168", "dest_port": "80", "flags": "24", "is_pii": false} diff --git a/examples/nlp_si_detection/README.md b/examples/nlp_si_detection/README.md index 9bab4cb433..dd0041863d 100644 --- a/examples/nlp_si_detection/README.md +++ b/examples/nlp_si_detection/README.md @@ -57,7 +57,7 @@ The dataset that this workflow was designed to process is PCAP, or Packet Captur } ``` -In this example, we will be using a simulated PCAP dataset that is known to contain SI from each of the 10 categories the model was trained for. The dataset is located at `data/pcap_dump.jsonlines`. The dataset is in the `.jsonlines` format which means each new line represents an new JSON object. In order to parse this data, it must be ingested, split by lines into individual JSON objects, and parsed. This will all be handled by Morpheus. +In this example, we will be using a simulated PCAP dataset that is known to contain SI from each of the 10 categories the model was trained for. The dataset is located at `examples/data/pcap_dump.jsonlines`. The dataset is in the `.jsonlines` format which means each new line represents an new JSON object. In order to parse this data, it must be ingested, split by lines into individual JSON objects, and parsed. This will all be handled by Morpheus. ## Pipeline Architecture @@ -110,7 +110,7 @@ morpheus --debug --log_level=DEBUG \ `# Specify a NLP pipeline with 256 sequence length (Must match Triton config)` \ pipeline-nlp --model_seq_length=256 \ `# 1st Stage: Read from file` \ - from-file --filename=$MORPHEUS_ROOT/morpheus/data/pcap_dump.jsonlines \ + from-file --filename=$MORPHEUS_ROOT/examples/data/pcap_dump.jsonlines \ `# 2nd Stage: Deserialize from JSON strings to objects` \ deserialize \ `# 3rd Stage: Preprocessing converts the input data into BERT tokens` \ @@ -166,7 +166,7 @@ CPP Enabled: True ====Registering Pipeline Complete!==== ====Starting Pipeline==== ====Building Pipeline==== -Added source: +Added source: └─> morpheus.MessageMeta Added stage: └─ morpheus.MessageMeta -> morpheus.MultiMessage diff --git a/morpheus.code-workspace b/morpheus.code-workspace index 717160650a..8f71d89402 100644 --- a/morpheus.code-workspace +++ b/morpheus.code-workspace @@ -304,7 +304,7 @@ "justMyCode": false, "args": [ "--input_file", - "../../data/pcap_dump.jsonlines", + "../data/pcap_dump.jsonlines", "--output_file", "./pcap_output.jsonlines", "--server_url", From 55edc6ae8e425cd346a6d0d51399571ffcdce846 Mon Sep 17 00:00:00 2001 From: Michael Demoret <42954918+mdemoret-nv@users.noreply.github.com> Date: Wed, 8 Jun 2022 15:30:57 -0600 Subject: [PATCH 35/73] Fixes Timestamp Nodes When Running with `--debug` (#145) If the user runs with `--debug`, then any stage that derives from `MultiMessageStage`, will insert columns with the message timestamp for when it was finished processing. With some of the recent changes to Neo, we disabled broadcast nodes. However, the timestamp code didnt get updated. This PR fixes a few things: 1. It fixes the timestamp node to return the input object instead of `None` 2. It updates all nodes to require overriding `supports_cpp_node` 1. This is necessary to ensure `_build_cpp_node()` returns the correct thing 3. It only inserts timestamp nodes when C++ is disabled (we should have a C++ version instead). 1. This uses `_build_cpp_node()` to determine whether C++ is being used for this particular stage 4. It updates all nodes to use `_build_cpp_node()` instead of `CppConfig.get_should_use_cpp()` Fixes #143 Authors: - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - David Gardner (https://github.com/dagardner-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/145 --- .../developer_guide/guides/3_simple_cpp_stage.md | 12 +++++------- .../developer_guide/guides/4_source_cpp_stage.md | 6 ++++-- morpheus/pipeline/multi_message_stage.py | 7 +++++-- morpheus/pipeline/stream_wrapper.py | 4 +++- morpheus/stages/general/buffer_stage.py | 3 +++ morpheus/stages/general/delay_stage.py | 3 +++ morpheus/stages/general/monitor_stage.py | 3 +++ morpheus/stages/general/trigger_stage.py | 3 +++ morpheus/stages/inference/inference_stage.py | 4 ++++ morpheus/stages/input/appshield_source_stage.py | 8 ++++---- morpheus/stages/input/cloud_trail_source_stage.py | 3 +++ morpheus/stages/input/file_source_stage.py | 6 ++++-- morpheus/stages/output/write_to_kafka_stage.py | 3 +++ .../stages/postprocess/add_classifications_stage.py | 6 ++---- morpheus/stages/postprocess/add_scores_stage.py | 6 ++---- .../stages/postprocess/filter_detections_stage.py | 6 ++---- .../stages/postprocess/generate_viz_frames_stage.py | 3 +++ morpheus/stages/postprocess/ml_flow_drift_stage.py | 3 +++ morpheus/stages/postprocess/serialize_stage.py | 4 ++++ morpheus/stages/postprocess/timeseries_stage.py | 3 +++ morpheus/stages/postprocess/validation_stage.py | 3 +++ morpheus/stages/preprocess/deserialize_stage.py | 7 +++++-- morpheus/stages/preprocess/drop_null_stage.py | 4 ++++ morpheus/stages/preprocess/preprocess_base_stage.py | 3 +-- morpheus/stages/preprocess/preprocess_fil_stage.py | 3 +++ morpheus/stages/preprocess/preprocess_nlp_stage.py | 3 +++ tests/benchmarks/static_message_source.py | 3 +++ tests/utils.py | 3 +++ 28 files changed, 91 insertions(+), 34 deletions(-) diff --git a/docs/source/developer_guide/guides/3_simple_cpp_stage.md b/docs/source/developer_guide/guides/3_simple_cpp_stage.md index 42317089d4..9cc18600ee 100644 --- a/docs/source/developer_guide/guides/3_simple_cpp_stage.md +++ b/docs/source/developer_guide/guides/3_simple_cpp_stage.md @@ -32,11 +32,10 @@ In addition to C++ accelerated stage implementations, Morpheus also provides a C Since we are defining our pipelines in Python, it becomes the responsibility of the Python implementation to build a C++ accelerated node. This happens in the `_build_source` and `_build_single` methods. Ultimately it is the decision of a Python stage to build a Python node or a C++ node. It is perfectly acceptable to build a Python node when `morpheus.config.CppConfig.get_should_use_cpp()` is configured to `True`. It is not acceptable, however, to build a C++ node when `morpheus.config.CppConfig.get_should_use_cpp() == False`. The reason is the C++ implementations of Morpheus' messages can be consumed by Python and C++ stage implementations alike. However when `morpheus.config.CppConfig.get_should_use_cpp() == False`, the Python implementations will be used which cannot be consumed by the C++ implementations of stages. -Python stages which have a C++ implementation must advertise this functionality by implementing the `supports_cpp_node` [classmethod](https://docs.python.org/3.8/library/functions.html?highlight=classmethod#classmethod): +Python stages which have a C++ implementation must advertise this functionality by overriding the `supports_cpp_node` method: ```python -@classmethod -def supports_cpp_node(cls): +def supports_cpp_node(self): return True ``` @@ -309,15 +308,14 @@ from morpheus.config import CppConfig from _lib import morpheus_example as morpheus_example_cpp ``` -As mentioned in the previous section, we will need to override the `supports_cpp_node` [classmethod](https://docs.python.org/3.8/library/functions.html?highlight=classmethod#classmethod) to indicate that our stage supports a C++ implementation. Our `_build_single` method needs to be updated to build a C++ node when `morpheus.config.CppConfig.get_should_use_cpp()` is `True`. +As mentioned in the previous section, we will need to override the `supports_cpp_node` to indicate that our stage supports a C++ implementation. Our `_build_single` method needs to be updated to build a C++ node when `morpheus.config.CppConfig.get_should_use_cpp()` is `True` using the `self._build_cpp_node()` method. The `_build_cpp_node()` method compares both `morpheus.config.CppConfig.get_should_use_cpp()` and `supports_cpp_node()` and returns `True` only when both methods return `True`. ```python -@classmethod -def supports_cpp_node(cls): +def supports_cpp_node(self): return True def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - if CppConfig.get_should_use_cpp(): + if self._build_cpp_node(): print("building cpp") node = morpheus_example_cpp.PassThruStage(seg, self.unique_name) else: diff --git a/docs/source/developer_guide/guides/4_source_cpp_stage.md b/docs/source/developer_guide/guides/4_source_cpp_stage.md index c9fa8b77df..c9d3ff7110 100644 --- a/docs/source/developer_guide/guides/4_source_cpp_stage.md +++ b/docs/source/developer_guide/guides/4_source_cpp_stage.md @@ -532,13 +532,15 @@ def connect(self): self._channel.queue_bind( exchange=self._exchange, queue=self._queue_name) + + ``` -Lastly, our `_build_source` method needs to be updated to build a C++ node when `morpheus.config.CppConfig` is configured to `True`. +Lastly, our `_build_source` method needs to be updated to build a C++ node when `morpheus.config.CppConfig` is configured to `True` by using the `self._build_cpp_node()` method. ```python def _build_source(self, seg: neo.Segment) -> StreamPair: - if CppConfig.get_should_use_cpp(): + if self._build_cpp_node(): node = morpheus_rabbit_cpp.RabbitMQSourceStage( seg, self.unique_name, diff --git a/morpheus/pipeline/multi_message_stage.py b/morpheus/pipeline/multi_message_stage.py index f465c2a669..ff29a7136d 100644 --- a/morpheus/pipeline/multi_message_stage.py +++ b/morpheus/pipeline/multi_message_stage.py @@ -48,8 +48,8 @@ def __init__(self, c: Config): def _post_build_single(self, seg: neo.Segment, out_pair: StreamPair) -> StreamPair: - # Check if we are debug and should log timestamps - if (self._config.debug and self._should_log_timestamps): + # Check if we are debug and should log timestamps. Disable for C++ nodes + if (self._config.debug and self._should_log_timestamps and not self._build_cpp_node()): # Cache the name property. Removes dependency on self in callback cached_name = self.name @@ -61,6 +61,9 @@ def post_timestamps(x: MultiMessage): x.set_meta("_ts_" + cached_name, curr_time) + # Must return the original object + return x + # Only have one port post_ts = seg.make_node(self.unique_name + "-ts", post_timestamps) seg.make_edge(out_pair[0], post_ts) diff --git a/morpheus/pipeline/stream_wrapper.py b/morpheus/pipeline/stream_wrapper.py index 4802607cd9..cc6290c15b 100644 --- a/morpheus/pipeline/stream_wrapper.py +++ b/morpheus/pipeline/stream_wrapper.py @@ -251,6 +251,7 @@ def get_all_output_stages(self) -> typing.List["StreamWrapper"]: """ return [x.parent for x in self.get_all_outputs()] + @abstractmethod def supports_cpp_node(self): """ Specifies whether this Stage is even capable of creating C++ nodes. During the build phase, this value will be @@ -258,7 +259,8 @@ def supports_cpp_node(self): to allow runtime decisions and derived classes to override base implementations. """ # By default, return False unless otherwise specified - return False + # return False + pass def _build_cpp_node(self): """ diff --git a/morpheus/stages/general/buffer_stage.py b/morpheus/stages/general/buffer_stage.py index ea5c2de455..818cfafd70 100644 --- a/morpheus/stages/general/buffer_stage.py +++ b/morpheus/stages/general/buffer_stage.py @@ -58,6 +58,9 @@ def accepted_types(self) -> typing.Tuple: """ return (typing.Any, ) + def supports_cpp_node(self): + return False + def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: # This stage is no longer needed and is just a pass thru stage diff --git a/morpheus/stages/general/delay_stage.py b/morpheus/stages/general/delay_stage.py index 789156d632..137c949aee 100644 --- a/morpheus/stages/general/delay_stage.py +++ b/morpheus/stages/general/delay_stage.py @@ -58,6 +58,9 @@ def accepted_types(self) -> typing.Tuple: """ return (typing.Any, ) + def supports_cpp_node(self): + return False + def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: # This stage is no longer needed and is just a pass thru stage diff --git a/morpheus/stages/general/monitor_stage.py b/morpheus/stages/general/monitor_stage.py index 0fdf5ef0f4..cb69b015e1 100644 --- a/morpheus/stages/general/monitor_stage.py +++ b/morpheus/stages/general/monitor_stage.py @@ -184,6 +184,9 @@ def accepted_types(self) -> typing.Tuple: """ return (typing.Any, ) + def supports_cpp_node(self): + return False + def on_start(self): # Set the monitor interval to 0 to use prevent using tqdms monitor diff --git a/morpheus/stages/general/trigger_stage.py b/morpheus/stages/general/trigger_stage.py index ef511158ac..3435f744c2 100644 --- a/morpheus/stages/general/trigger_stage.py +++ b/morpheus/stages/general/trigger_stage.py @@ -56,6 +56,9 @@ def accepted_types(self) -> typing.Tuple: """ return (typing.Any, ) + def supports_cpp_node(self): + return False + def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: # Store all messages until on_complete is called and then push them diff --git a/morpheus/stages/inference/inference_stage.py b/morpheus/stages/inference/inference_stage.py index 61c6975376..ed32e3aa2a 100644 --- a/morpheus/stages/inference/inference_stage.py +++ b/morpheus/stages/inference/inference_stage.py @@ -176,6 +176,10 @@ def accepted_types(self) -> typing.Tuple: """ return (MultiInferenceMessage, ) + def supports_cpp_node(self): + # Default to False unless derived classes override this value + return False + @abstractmethod def _get_inference_worker(self, inf_queue: ProducerConsumerQueue) -> InferenceWorker: """ diff --git a/morpheus/stages/input/appshield_source_stage.py b/morpheus/stages/input/appshield_source_stage.py index 125027a7ee..b97f3413b5 100644 --- a/morpheus/stages/input/appshield_source_stage.py +++ b/morpheus/stages/input/appshield_source_stage.py @@ -110,6 +110,9 @@ def input_count(self) -> int: """Return None for no max intput count""" return self._input_count + def supports_cpp_node(self): + return False + @staticmethod def fill_interested_cols(plugin_df: pd.DataFrame, cols_include: typing.List[str]): """ @@ -199,10 +202,7 @@ def load_df(filepath: str, cols_exclude: typing.List[str], encoding: str) -> pd. with open(filepath, encoding=encoding) as file: plugin_df = AppShieldSourceStage.read_file_to_df(file, cols_exclude) except JSONDecodeError as decode_error: - logger.error('Unable to load %s to dataframe with %s encoding : %s', - filepath, - encoding, - decode_error) + logger.error('Unable to load %s to dataframe with %s encoding : %s', filepath, encoding, decode_error) encoding = encoding.lower() # To avoid retrying with utf-8, check if the given encoding is utf. diff --git a/morpheus/stages/input/cloud_trail_source_stage.py b/morpheus/stages/input/cloud_trail_source_stage.py index 1a11b1d915..8a356d9c2d 100644 --- a/morpheus/stages/input/cloud_trail_source_stage.py +++ b/morpheus/stages/input/cloud_trail_source_stage.py @@ -113,6 +113,9 @@ def input_count(self) -> int: """Return None for no max intput count""" return self._input_count + def supports_cpp_node(self): + return False + def get_match_pattern(self, glob_split): """Return a file match pattern""" dir_to_watch = os.path.dirname(glob_split[0]) diff --git a/morpheus/stages/input/file_source_stage.py b/morpheus/stages/input/file_source_stage.py index 9426cb764e..8c4bb485be 100644 --- a/morpheus/stages/input/file_source_stage.py +++ b/morpheus/stages/input/file_source_stage.py @@ -22,7 +22,6 @@ import morpheus._lib.stages as neos from morpheus._lib.file_types import FileTypes from morpheus.config import Config -from morpheus.config import CppConfig from morpheus.io.deserializers import read_file_to_df from morpheus.messages import MessageMeta from morpheus.pipeline.single_output_source import SingleOutputSource @@ -94,9 +93,12 @@ def input_count(self) -> int: """Return None for no max intput count""" return self._input_count + def supports_cpp_node(self): + return True + def _build_source(self, seg: neo.Segment) -> StreamPair: - if CppConfig.get_should_use_cpp(): + if self._build_cpp_node(): out_stream = neos.FileSourceStage(seg, self.unique_name, self._filename, self._repeat_count) else: out_stream = seg.make_source(self.unique_name, self._generate_frames()) diff --git a/morpheus/stages/output/write_to_kafka_stage.py b/morpheus/stages/output/write_to_kafka_stage.py index d406d89420..bf20cc186a 100644 --- a/morpheus/stages/output/write_to_kafka_stage.py +++ b/morpheus/stages/output/write_to_kafka_stage.py @@ -69,6 +69,9 @@ def accepted_types(self) -> typing.Tuple: """ return (MessageMeta, ) + def supports_cpp_node(self): + return False + def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: # Convert the messages to rows of strings diff --git a/morpheus/stages/postprocess/add_classifications_stage.py b/morpheus/stages/postprocess/add_classifications_stage.py index 50cc9be263..b8cd44ce8e 100644 --- a/morpheus/stages/postprocess/add_classifications_stage.py +++ b/morpheus/stages/postprocess/add_classifications_stage.py @@ -19,7 +19,6 @@ import morpheus._lib.stages as neos from morpheus.config import Config -from morpheus.config import CppConfig from morpheus.messages import MultiResponseProbsMessage from morpheus.pipeline.single_port_stage import SinglePortStage from morpheus.pipeline.stream_pair import StreamPair @@ -85,8 +84,7 @@ def accepted_types(self) -> typing.Tuple: """ return (MultiResponseProbsMessage, ) - @classmethod - def supports_cpp_node(cls): + def supports_cpp_node(self): # Enable support by default return True @@ -107,7 +105,7 @@ def _add_labels(self, x: MultiResponseProbsMessage): def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: # Convert the messages to rows of strings - if CppConfig.get_should_use_cpp(): + if self._build_cpp_node(): stream = neos.AddClassificationsStage(seg, self.unique_name, self._threshold, diff --git a/morpheus/stages/postprocess/add_scores_stage.py b/morpheus/stages/postprocess/add_scores_stage.py index 3bbc5463af..6c73e6909e 100644 --- a/morpheus/stages/postprocess/add_scores_stage.py +++ b/morpheus/stages/postprocess/add_scores_stage.py @@ -19,7 +19,6 @@ import morpheus._lib.stages as neos from morpheus.config import Config -from morpheus.config import CppConfig from morpheus.messages import MultiResponseProbsMessage from morpheus.pipeline.single_port_stage import SinglePortStage from morpheus.pipeline.stream_pair import StreamPair @@ -82,8 +81,7 @@ def accepted_types(self) -> typing.Tuple: """ return (MultiResponseProbsMessage, ) - @classmethod - def supports_cpp_node(cls): + def supports_cpp_node(self): # Enable support by default return True @@ -104,7 +102,7 @@ def _add_labels(self, x: MultiResponseProbsMessage): def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: # Convert the messages to rows of strings - if CppConfig.get_should_use_cpp(): + if self._build_cpp_node(): stream = neos.AddScoresStage(seg, self.unique_name, len(self._class_labels), self._idx2label) else: stream = seg.make_node(self.unique_name, self._add_labels) diff --git a/morpheus/stages/postprocess/filter_detections_stage.py b/morpheus/stages/postprocess/filter_detections_stage.py index cc43841137..b568d415a9 100644 --- a/morpheus/stages/postprocess/filter_detections_stage.py +++ b/morpheus/stages/postprocess/filter_detections_stage.py @@ -21,7 +21,6 @@ import morpheus._lib.stages as neos from morpheus.config import Config -from morpheus.config import CppConfig from morpheus.messages import MultiResponseProbsMessage from morpheus.pipeline.single_port_stage import SinglePortStage from morpheus.pipeline.stream_pair import StreamPair @@ -64,8 +63,7 @@ def accepted_types(self) -> typing.Tuple: """ return (MultiResponseProbsMessage, ) - @classmethod - def supports_cpp_node(cls): + def supports_cpp_node(self): # Enable support by default return True @@ -121,7 +119,7 @@ def flatten_fn(input: neo.Observable, output: neo.Subscriber): input.pipe(ops.map(self.filter), ops.flatten()).subscribe(output) - if CppConfig.get_should_use_cpp(): + if self._build_cpp_node(): stream = neos.FilterDetectionsStage(seg, self.unique_name, self._threshold) else: stream = seg.make_node_full(self.unique_name, flatten_fn) diff --git a/morpheus/stages/postprocess/generate_viz_frames_stage.py b/morpheus/stages/postprocess/generate_viz_frames_stage.py index d97ba14870..d910a11fba 100644 --- a/morpheus/stages/postprocess/generate_viz_frames_stage.py +++ b/morpheus/stages/postprocess/generate_viz_frames_stage.py @@ -77,6 +77,9 @@ def accepted_types(self) -> typing.Tuple: """ return (MultiResponseProbsMessage, ) + def supports_cpp_node(self): + return False + @staticmethod def round_to_sec(x): """ diff --git a/morpheus/stages/postprocess/ml_flow_drift_stage.py b/morpheus/stages/postprocess/ml_flow_drift_stage.py index a18a88de10..cd42c2061f 100644 --- a/morpheus/stages/postprocess/ml_flow_drift_stage.py +++ b/morpheus/stages/postprocess/ml_flow_drift_stage.py @@ -120,6 +120,9 @@ def accepted_types(self) -> typing.Tuple: """ return (MultiResponseProbsMessage, ) + def supports_cpp_node(self): + return False + def _calc_drift(self, x: MultiResponseProbsMessage): # All probs in a batch will be calculated diff --git a/morpheus/stages/postprocess/serialize_stage.py b/morpheus/stages/postprocess/serialize_stage.py index 8b235875e4..cb52b7464e 100644 --- a/morpheus/stages/postprocess/serialize_stage.py +++ b/morpheus/stages/postprocess/serialize_stage.py @@ -73,6 +73,10 @@ def accepted_types(self) -> typing.Tuple: """ return (MultiMessage, ) + def supports_cpp_node(self): + # Enable support by default + return True + def convert_to_df(self, x: MultiMessage, include_columns: typing.Pattern, diff --git a/morpheus/stages/postprocess/timeseries_stage.py b/morpheus/stages/postprocess/timeseries_stage.py index de7a26332b..24b9d3404c 100644 --- a/morpheus/stages/postprocess/timeseries_stage.py +++ b/morpheus/stages/postprocess/timeseries_stage.py @@ -436,6 +436,9 @@ def accepted_types(self) -> typing.Tuple: """ return (MultiResponseMessage, ) + def supports_cpp_node(self): + return False + def _call_timeseries_user(self, x: MultiResponseAEMessage): if (x.user_id not in self._timeseries_per_user): diff --git a/morpheus/stages/postprocess/validation_stage.py b/morpheus/stages/postprocess/validation_stage.py index 60d6215d63..8e27efece6 100644 --- a/morpheus/stages/postprocess/validation_stage.py +++ b/morpheus/stages/postprocess/validation_stage.py @@ -118,6 +118,9 @@ def accepted_types(self) -> typing.Tuple: """ return (MultiMessage, ) + def supports_cpp_node(self): + return False + def _filter_df(self, df): include_columns = None diff --git a/morpheus/stages/preprocess/deserialize_stage.py b/morpheus/stages/preprocess/deserialize_stage.py index 6dec7966dd..c9ad49b6cc 100644 --- a/morpheus/stages/preprocess/deserialize_stage.py +++ b/morpheus/stages/preprocess/deserialize_stage.py @@ -22,7 +22,6 @@ import morpheus._lib.stages as neos from morpheus.config import Config -from morpheus.config import CppConfig from morpheus.messages import MessageMeta from morpheus.messages import MultiMessage from morpheus.pipeline.multi_message_stage import MultiMessageStage @@ -64,6 +63,10 @@ def accepted_types(self) -> typing.Tuple: """ return (MessageMeta) + def supports_cpp_node(self): + # Enable support by default + return True + @staticmethod def process_dataframe(x: MessageMeta, batch_size: int) -> typing.List[MultiMessage]: """ @@ -98,7 +101,7 @@ def node_fn(input: neo.Observable, output: neo.Subscriber): input.pipe(ops.map(partial(DeserializeStage.process_dataframe, batch_size=self._batch_size)), ops.flatten()).subscribe(output) - if CppConfig.get_should_use_cpp(): + if self._build_cpp_node(): stream = neos.DeserializeStage(seg, self.unique_name, self._batch_size) else: stream = seg.make_node_full(self.unique_name, node_fn) diff --git a/morpheus/stages/preprocess/drop_null_stage.py b/morpheus/stages/preprocess/drop_null_stage.py index 10704e38ea..daa89c4da8 100644 --- a/morpheus/stages/preprocess/drop_null_stage.py +++ b/morpheus/stages/preprocess/drop_null_stage.py @@ -60,6 +60,10 @@ def accepted_types(self) -> typing.Tuple: """ return (MessageMeta, ) + def supports_cpp_node(self): + # Enable support by default + return False + def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: stream = input_stream[0] diff --git a/morpheus/stages/preprocess/preprocess_base_stage.py b/morpheus/stages/preprocess/preprocess_base_stage.py index ef031375af..34284b508f 100644 --- a/morpheus/stages/preprocess/preprocess_base_stage.py +++ b/morpheus/stages/preprocess/preprocess_base_stage.py @@ -20,7 +20,6 @@ import typing_utils from morpheus.config import Config -from morpheus.config import CppConfig from morpheus.messages import MultiInferenceMessage from morpheus.messages import MultiMessage from morpheus.pipeline.multi_message_stage import MultiMessageStage @@ -71,7 +70,7 @@ def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPai if (preproc_sig.return_annotation and typing_utils.issubtype(preproc_sig.return_annotation, out_type)): out_type = preproc_sig.return_annotation - if CppConfig.get_should_use_cpp(): + if self._build_cpp_node(): stream = self._get_preprocess_node(seg) else: stream = seg.make_node(self.unique_name, preprocess_fn) diff --git a/morpheus/stages/preprocess/preprocess_fil_stage.py b/morpheus/stages/preprocess/preprocess_fil_stage.py index 388538a6e2..edf4aa3f38 100644 --- a/morpheus/stages/preprocess/preprocess_fil_stage.py +++ b/morpheus/stages/preprocess/preprocess_fil_stage.py @@ -58,6 +58,9 @@ def __init__(self, c: Config): def name(self) -> str: return "preprocess-fil" + def supports_cpp_node(self): + return True + @staticmethod def pre_process_batch(x: MultiMessage, fea_len: int, fea_cols: typing.List[str]) -> MultiInferenceFILMessage: """ diff --git a/morpheus/stages/preprocess/preprocess_nlp_stage.py b/morpheus/stages/preprocess/preprocess_nlp_stage.py index 29be78a356..fcf69d98f0 100644 --- a/morpheus/stages/preprocess/preprocess_nlp_stage.py +++ b/morpheus/stages/preprocess/preprocess_nlp_stage.py @@ -87,6 +87,9 @@ def __init__(self, def name(self) -> str: return "preprocess-nlp" + def supports_cpp_node(self): + return True + @staticmethod def pre_process_batch(x: MultiMessage, vocab_hash_file: str, diff --git a/tests/benchmarks/static_message_source.py b/tests/benchmarks/static_message_source.py index 856339b2bb..b09e81e940 100644 --- a/tests/benchmarks/static_message_source.py +++ b/tests/benchmarks/static_message_source.py @@ -39,6 +39,9 @@ def __init__(self, c: Config, df: cudf.DataFrame): def name(self) -> str: return "static-data" + def supports_cpp_node(self): + return False + @property def input_count(self) -> int: return len(self._df) diff --git a/tests/utils.py b/tests/utils.py index 377822a6f3..a4f095c5e3 100755 --- a/tests/utils.py +++ b/tests/utils.py @@ -65,6 +65,9 @@ def name(self): def accepted_types(self): return (MultiMessage, ) + def supports_cpp_node(self): + return False + def _conv_message(self, m): if self._expected_data_file is not None: df = read_file_to_df(self._expected_data_file, FileTypes.CSV, df_type="cudf") From 1a1be1ab92f25f7f99504a4218ed87de4f69f1e0 Mon Sep 17 00:00:00 2001 From: David Gardner <96306125+dagardner-nv@users.noreply.github.com> Date: Wed, 8 Jun 2022 15:17:10 -0700 Subject: [PATCH 36/73] Limit which lfs assets are pulled by default (#139) * Adds helper script `scripts/fetch_data.py` to pull additional assets. * Update `README.md` & `CONTRIBUTING.md` docs to reflect changes * Updated the hammah unittest to no longer depend on training data. * ~~Pinned Neo dep to 22.04.00a to work-around incompatible neo version~~ ``` $ scripts/fetch_data.py -h usage: Fetches data not included in the repository by default [-h] {fetch,check} ... optional arguments: -h, --help show this help message and exit Subcommands: valid subcommands {fetch,check} fetch Fetch datasets check Check download status of large files. Displays a True/False whether all files are downloaded. ``` Closes #88 Authors: - David Gardner (https://github.com/dagardner-nv) - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - Bartley Richardson (https://github.com/BartleyR) - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/139 --- .lfsconfig | 2 + CONTRIBUTING.md | 26 +++- ci/scripts/jenkins/build.sh | 3 + ci/scripts/jenkins/test.sh | 2 +- docker/conda/environments/cuda11.4_dev.yml | 1 + models/mlflow/README.md | 8 +- scripts/fetch_data.py | 142 +++++++++++++++++++++ tests/test_hammah.py | 6 +- 8 files changed, 179 insertions(+), 11 deletions(-) create mode 100644 .lfsconfig create mode 100755 scripts/fetch_data.py diff --git a/.lfsconfig b/.lfsconfig new file mode 100644 index 0000000000..9fdb0464ae --- /dev/null +++ b/.lfsconfig @@ -0,0 +1,2 @@ +[lfs] + fetchinclude = morpheus/data/* diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c06f2780d4..e63074e864 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -65,9 +65,31 @@ cd $MORPHEUS_ROOT ``` The large model and data files in this repo are stored using [Git Large File Storage (LFS)](https://git-lfs.github.com/). These files will be required for running the training/validation scripts and example pipelines for the Morpheus pre-trained models. +By default only those files stored in LFS strictly needed for running Morpheus are included when the Morpheus repository is cloned. Additional datasets can be downloaded using the `scripts/fetch_data.py` script. Usage of the script is as follows: +```bash +scripts/fetch_data.py fetch [...] +``` + +At time of writing the defined datasets are: +* all - Metaset includes all others +* examples - Data needed by scripts in the `examples` subdir +* models - Morpheus models (largest dataset) +* tests - Data used by unittests +* validation - Subset of the models dataset needed by some unittests + +To download just the examples and models: +```bash +scripts/fetch_data.py fetch examples models +``` + +To download the data needed for unittests: +```bash +scripts/fetch_data.py fetch tests validation +``` + If `Git LFS` is not installed before cloning the repository, the large files will not be pulled. If this is the case, follow the instructions for installing `Git LFS` from [here](https://git-lfs.github.com/), and then run the following command. ```bash -git lfs pull +scripts/fetch_data.py fetch all ``` ### Build in Docker Container @@ -94,7 +116,7 @@ This workflow utilizes a docker container to set up most dependencies ensuring a ```shell DOCKER_TARGET=development_pydbg ./docker/build_container_dev.sh ``` - 1. Note: When debugging python code, you just need to add `ci/conda/recipes/python-dbg/source` to your debugger's + 1. Note: When debugging python code, you just need to add `ci/conda/recipes/python-dbg/source` to your debugger's source path. 1. Once created, you will be able to introspect python objects from within GDB. For example, if we were to break within a generator setup call and examine it's PyFrame_Object `f`, it might look like this: diff --git a/ci/scripts/jenkins/build.sh b/ci/scripts/jenkins/build.sh index 31e505da44..97b3490f82 100755 --- a/ci/scripts/jenkins/build.sh +++ b/ci/scripts/jenkins/build.sh @@ -82,6 +82,9 @@ gpuci_logger "Installing other dependencies" mamba env update -q -n morpheus -f ${MORPHEUS_ROOT}/docker/conda/environments/cuda${CUDA_VER}_dev.yml conda deactivate && conda activate morpheus +gpuci_logger "Final Conda Environment" +conda list + gpuci_logger "Check cmake & ninja" cmake --version ninja --version diff --git a/ci/scripts/jenkins/test.sh b/ci/scripts/jenkins/test.sh index 93ae07bf6c..08fb6fbbc9 100755 --- a/ci/scripts/jenkins/test.sh +++ b/ci/scripts/jenkins/test.sh @@ -49,7 +49,7 @@ mamba install -q -y -c conda-forge "git-lfs=3.1.4" gpuci_logger "Pulling LFS assets" cd ${MORPHEUS_ROOT} git lfs install -git lfs pull +${MORPHEUS_ROOT}/scripts/fetch_data.py fetch tests validation pip install -e ${MORPHEUS_ROOT} diff --git a/docker/conda/environments/cuda11.4_dev.yml b/docker/conda/environments/cuda11.4_dev.yml index 6620542ccd..1000407d8e 100644 --- a/docker/conda/environments/cuda11.4_dev.yml +++ b/docker/conda/environments/cuda11.4_dev.yml @@ -69,6 +69,7 @@ dependencies: - sphinx_rtd_theme - sysroot_linux-64=2.17 - tqdm + - yapf=0.32.0 ####### Morpheus Pip Dependencies (keep sorted!) ####### - pip: # Add additional dev dependencies here diff --git a/models/mlflow/README.md b/models/mlflow/README.md index 7271a7bcf6..766461c821 100644 --- a/models/mlflow/README.md +++ b/models/mlflow/README.md @@ -82,10 +82,10 @@ nohup mlflow server --backend-store-uri sqlite:////tmp/mlflow-db.sqlite --defaul The Morpheus reference models can be found in the [Morpheus](https://github.com/NVIDIA/Morpheus) repo. -``` -git clone https://github.com/NVIDIA/Morpheus.git -cd morpheus/models -git lfs pull +```bash +git clone https://github.com/NVIDIA/Morpheus.git morpheus +cd morpheus +scripts/fetch_data.py fetch models ``` ## Publish reference models to MLflow diff --git a/scripts/fetch_data.py b/scripts/fetch_data.py new file mode 100755 index 0000000000..2749c7f42b --- /dev/null +++ b/scripts/fetch_data.py @@ -0,0 +1,142 @@ +#!/usr/bin/env python3 +# SPDX-FileCopyrightText: Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import logging +import os +import subprocess +import sys +import time + +LFS_DATASETS = { + 'all': '**', + 'examples': 'examples/**', + 'models': 'models/**', + 'tests': 'tests/**', + 'validation': 'models/datasets/validation-data/**' +} + + +def lfsPull(include_paths, poll_interval=0.1): + """ + Performs a git lfs pull. + """ + cmd = 'git lfs pull -I "{}"'.format(','.join(include_paths)) + env = os.environ.copy() + + # Instruct git lfs to not supress progress output. Fetching the models can + # take over a minute to complete, so we want our users to receive feedback. + env['GIT_LFS_FORCE_PROGRESS'] = '1' + popen = subprocess.Popen(cmd, + env=env, + shell=True, + universal_newlines=True, + stderr=subprocess.STDOUT, + stdout=subprocess.PIPE) + + outpipe = popen.stdout + returncode = None + all_out = [] + while returncode is None: + time.sleep(poll_interval) + out = outpipe.readline() + if out.rstrip() != '': + logging.info(out.rstrip()) + all_out.append(out) + + returncode = popen.poll() + + # Check if we have any additional output written to the pipe before our last poll + out = outpipe.read() + if out != '': + all_out.append(out) + + output = ''.join(all_out).rstrip("\n") + if returncode != 0: + logging.error(output) + raise subprocess.CalledProcessError(returncode=returncode, cmd=cmd, output=output) + + return output + + +def lfsCheck(list_all=False): + output = subprocess.check_output('git lfs ls-files', shell=True, universal_newlines=True) + output_lines = output.splitlines() + + # Output lines are in the format of: + # [-|*] + # where '-' indicates a file pointer and '*' indicates a downloaded file + # https://github.com/git-lfs/git-lfs/blob/main/docs/man/git-lfs-ls-files.1.ronn + missing_files = [] + for file_status in output_lines: + parts = file_status.split() + downloaded = parts[1] == '*' + filename = ' '.join(parts[2:]) + + if not downloaded: + missing_files.append(filename) + + if list_all: + # the join on 2: is needed to handle file names that contain a blank space + logging.info('%s - %s', filename, downloaded) + + if not list_all: + if len(missing_files): + logging.error("Missing the following LFS files:\n%s", "\n".join(missing_files)) + else: + logging.info("All LFS files downloaded") + + if len(missing_files): + sys.exit(1) + + +def parse_args(): + argparser = argparse.ArgumentParser("Fetches data not included in the repository by default") + subparsers = argparser.add_subparsers(title='Subcommands', + description='valid subcommands', + required=True, + dest='subcommand') + + fetch_parser = subparsers.add_parser('fetch', help='Fetch datasets') + fetch_parser.add_argument("data_set", nargs='*', choices=list(LFS_DATASETS.keys()), help="Data set to fetch") + + check_parser = subparsers.add_parser('check', + help=('Check download status of large files. Exits with a status of 0 if all ' + 'large files have been downloaded, 1 otherwise.')) + check_parser.add_argument("-l", + "--list", + action="store_true", + default=False, + dest='list_all', + help="List all missing files") + + args = argparser.parse_args() + return args + + +def main(): + args = parse_args() + logging.basicConfig(level=logging.INFO, format="%(message)s") + + if args.subcommand == 'fetch': + include_paths = [LFS_DATASETS[p] for p in args.data_set] + lfsPull(include_paths) + else: + lfsCheck(list_all=args.list_all) + + +if __name__ == "__main__": + main() diff --git a/tests/test_hammah.py b/tests/test_hammah.py index 5e8e275d4f..c778a4d1b6 100755 --- a/tests/test_hammah.py +++ b/tests/test_hammah.py @@ -73,14 +73,13 @@ def test_hammah_roleg(mock_ae, config, tmp_path): config.ae.feature_columns = [x.strip() for x in fh.readlines()] input_glob = os.path.join(TEST_DIRS.validation_data_dir, "hammah-*.csv") - train_data_glob = os.path.join(TEST_DIRS.training_data_dir, "hammah-*.csv") out_file = os.path.join(tmp_path, 'results.csv') val_file_name = os.path.join(TEST_DIRS.validation_data_dir, 'hammah-role-g-validation-data.csv') results_file_name = os.path.join(tmp_path, 'results.json') pipe = LinearPipeline(config) pipe.set_source(CloudTrailSourceStage(config, input_glob=input_glob, sort_glob=True)) - pipe.add_stage(train_ae_stage.TrainAEStage(config, train_data_glob=train_data_glob, seed=42, sort_glob=True)) + pipe.add_stage(train_ae_stage.TrainAEStage(config, train_data_glob=input_glob, seed=42, sort_glob=True)) pipe.add_stage(preprocess_ae_stage.PreprocessAEStage(config)) pipe.add_stage(AutoEncoderInferenceStage(config)) pipe.add_stage(AddScoresStage(config)) @@ -147,14 +146,13 @@ def test_hammah_user123(mock_ae, config, tmp_path): config.ae.feature_columns = [x.strip() for x in fh.readlines()] input_glob = os.path.join(TEST_DIRS.validation_data_dir, "hammah-*.csv") - train_data_glob = os.path.join(TEST_DIRS.training_data_dir, "hammah-*.csv") out_file = os.path.join(tmp_path, 'results.csv') val_file_name = os.path.join(TEST_DIRS.validation_data_dir, 'hammah-user123-validation-data.csv') results_file_name = os.path.join(tmp_path, 'results.json') pipe = LinearPipeline(config) pipe.set_source(CloudTrailSourceStage(config, input_glob=input_glob, sort_glob=True)) - pipe.add_stage(train_ae_stage.TrainAEStage(config, train_data_glob=train_data_glob, seed=42, sort_glob=True)) + pipe.add_stage(train_ae_stage.TrainAEStage(config, train_data_glob=input_glob, seed=42, sort_glob=True)) pipe.add_stage(preprocess_ae_stage.PreprocessAEStage(config)) pipe.add_stage(AutoEncoderInferenceStage(config)) pipe.add_stage(AddScoresStage(config)) From fc243ce16f470efb9d30174b839d18c8a0195e69 Mon Sep 17 00:00:00 2001 From: David Gardner <96306125+dagardner-nv@users.noreply.github.com> Date: Wed, 8 Jun 2022 16:08:43 -0700 Subject: [PATCH 37/73] Jenkins improvememts (#107) + Performs a non-inplace morpheus build. + Adds $ORIGIN to rpath of build binaries, fixing issue where libmorpheus.so was unable to find libmorpheus-utils.so (fixes #111 ) + ~~Removes the need for a gpu for the build stage~~ Blocked by Neo/nvml issue #186 + Common operations moved to common.sh + Fixes ci scripts so that they work locally (fixes #114 ) + Improve the way sccache is configured (fixes #110 ) This pull req incorporates changes from #62 Authors: - David Gardner (https://github.com/dagardner-nv) - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - Devin Robison (https://github.com/drobison00) - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/107 --- CMakeLists.txt | 2 + ci/conda/recipes/morpheus/morpheus_build.sh | 7 +- ci/iwyu/mappings.imp | 93 +++++++++++++++++++++ ci/scripts/common.sh | 6 +- ci/scripts/fix_all.sh | 4 +- ci/scripts/gitutils.py | 53 +++++++++--- ci/scripts/jenkins/build.sh | 26 ++---- ci/scripts/jenkins/checks.sh | 2 + ci/scripts/jenkins/common.sh | 43 +++++++++- ci/scripts/jenkins/docs.sh | 19 +---- ci/scripts/jenkins/test.sh | 39 ++------- 11 files changed, 207 insertions(+), 87 deletions(-) create mode 100644 ci/iwyu/mappings.imp mode change 100644 => 100755 ci/scripts/gitutils.py diff --git a/CMakeLists.txt b/CMakeLists.txt index 43f79d387b..1b7d1c567c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,6 +39,8 @@ set(CMAKE_CXX_EXTENSIONS ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_POSITION_INDEPENDENT_CODE TRUE) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) +set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) +set(CMAKE_INSTALL_RPATH "$ORIGIN") enable_testing() diff --git a/ci/conda/recipes/morpheus/morpheus_build.sh b/ci/conda/recipes/morpheus/morpheus_build.sh index 1f767545ae..c7cd1dca6d 100644 --- a/ci/conda/recipes/morpheus/morpheus_build.sh +++ b/ci/conda/recipes/morpheus/morpheus_build.sh @@ -37,11 +37,10 @@ CMAKE_ARGS="-DCMAKE_INSTALL_PREFIX=$PREFIX ${CMAKE_ARGS}" CMAKE_ARGS="-DCMAKE_INSTALL_LIBDIR=lib ${CMAKE_ARGS}" CMAKE_ARGS="-DBUILD_SHARED_LIBS=ON ${CMAKE_ARGS}" CMAKE_ARGS="-DMORPHEUS_USE_CONDA=ON ${CMAKE_ARGS}" +CMAKE_ARGS="-DMORPHEUS_USE_CCACHE=ON ${CMAKE_ARGS}" -if [[ "${USE_SCCACHE}" == "" ]]; then - CMAKE_ARGS="-DMORPHEUS_USE_CCACHE=ON ${CMAKE_ARGS}" -else - CMAKE_ARGS="-DMORPHEUS_USE_CCACHE=OFF ${CMAKE_ARGS}" +if [[ "${USE_SCCACHE}" == "1" ]]; then + CMAKE_ARGS="-DCCACHE_PROGRAM_PATH=$(which sccache) ${CMAKE_ARGS}" fi CMAKE_ARGS="-DMORPHEUS_BUILD_PYTHON=ON ${CMAKE_ARGS}" diff --git a/ci/iwyu/mappings.imp b/ci/iwyu/mappings.imp new file mode 100644 index 0000000000..1776f7ad0e --- /dev/null +++ b/ci/iwyu/mappings.imp @@ -0,0 +1,93 @@ +[ + +## Include mappings +# neo protos +{ "include": [ "\"neo/protos/architect.pb.h\"", private, "", "public" ] }, +{ "include": [ "\"neo/protos/codable.pb.h\"", private, "", "public" ] }, +{ "include": [ "\"neo/protos/remote_descriptor.pb.h\"", private, "", "public" ] }, +{ "include": [ "\"neo/protos/tensor_meta_data.pb.h\"", private, "", "public" ] }, + +# stdlib +{ "include": [ "", private, "", "public" ] }, +{ "include": [ "", private, "", "public" ] }, +{ "include": [ "", private, "", "public" ] }, + +# boost +{ "include": ["@", "private", "", "public"] }, + +# cuda +{ "include": ["", "private", "", "public"] }, +{ "include": ["\"cuda_runtime_api.h\"", "private", "", "public"] }, +{ "include": ["", "private", "", "public"] }, +{ "include": ["\"driver_types.h\"", "private", "", "public"] }, + +# gtest +{ "include": ["@", "private", "", "public"] }, +{ "include": ["@", "private", "", "public"] }, + +# gprc +{ "include": ["@", "private", "", "public"] }, +{ "include": ["@", "private", "", "public"] }, + +# nlohmann json +{ "include": ["", "private", "", "public"] }, +{ "include": ["", "private", "", "public"] }, +{ "include": ["", "private", "", "public"] }, + +# Protobuf +{ "include": [ "", private, "", "public" ] }, + +## Symbol mappings +# stdlib +{ "symbol": ["__gnu_cxx::__enable_if::__type", "private", "", "public"] }, +{ "symbol": ["std::__success_type>>::type" , "private", "", "public"] }, +{ "symbol": ["__cxxabiv1::__forced_unwind", "private", "", "public"] }, + +# boost +{ "symbol": ["__forced_unwind", "private", "", "public"] }, +{ "symbol": ["boost::context::detail::forced_unwind", "private", "", "public"] }, +{ "symbol": ["boost::intrusive_ptr::operator", "private", "", "public"] }, +{ "symbol": ["__cxxabiv1::__forced_unwind", "private", "", "public"] }, + +# cuda +{ "symbol": ["cuda::std::declval", "private", "", "public"] }, + +# nlohmann json +# Tells IWYU that both json and json_fwd export the nlohmann::json namespace without this IWYU will always require +# json_fwd.hpp even when json.hpp is already included +{ "symbol": ["nlohmann", "private", "", "public"] }, +{ "symbol": ["nlohmann", "private", "", "public"] }, +{ "symbol": ["nlohmann::json", "private", "", "public"] }, +{ "symbol": ["nlohmann::json", "private", "", "public"] }, + +# pybind11 +{ "symbol": ["pybind11", "private", "", "public"] }, +{ "symbol": ["pybind11", "private", "", "public"] }, +{ "symbol": ["pybind11", "private", "", "public"] }, +{ "symbol": ["pybind11", "private", "", "public"] }, + +{ "symbol": ["PYBIND11_MODULE", "private", "", "public"] }, +{ "symbol": ["PySequence_GetItem", "private", "", "public"] }, +{ "symbol": ["PyExc_ImportError", "private", "", "public"] }, +{ "symbol": ["PyErr_SetObject", "private", "", "public"] }, +{ "symbol": ["PyExc_StopIteration", "private", "", "public"] }, +{ "symbol": ["_Py_IsFinalizing", "private", "", "public"] }, +{ "symbol": ["pybind11::detail::str_attr_accessor", "private", "", "public"] }, +{ "symbol": ["pybind11::detail::overload_cast_impl", "private", "", "public"] }, +{ "symbol": ["pybind11::overload_cast", "private", "", "public"] }, +{ "symbol": ["pybind11::stop_iteration", "private", "", "public"] }, +{ "symbol": ["pybind11::return_value_policy", "private", "", "public"] }, +{ "symbol": ["pybind11::return_value_policy::reference_internal", "private", "", "public"] }, +{ "symbol": ["pybind11::detail::get_type_info", "private", "", "public"] }, +{ "symbol": ["PyGILState_Check", "private", "", "public"] }, + +# spdlog +{ "symbol": ["spdlog::details::file_helper::~file_helper", "private", "", "public"] }, + +# xtensor +{ "symbol": ["xt::no_ownership", "private", "", "public"] }, + +# neo +{ "symbol": ["std::__decay_and_strip &>::__type" , "private", "", "public"] }, + +] diff --git a/ci/scripts/common.sh b/ci/scripts/common.sh index 7297169ecf..d3977de01a 100644 --- a/ci/scripts/common.sh +++ b/ci/scripts/common.sh @@ -17,7 +17,7 @@ export SCRIPT_DIR=${SCRIPT_DIR:-"$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"} export REPO_DIR=$(realpath ${REPO_DIR:-"${SCRIPT_DIR}/../.."}) -export PY_ROOT="." +export PY_ROOT="${REPO_DIR}" export PY_CFG="${PY_ROOT}/setup.cfg" export PY_DIRS="${PY_ROOT} ci/scripts" @@ -25,10 +25,10 @@ export PY_DIRS="${PY_ROOT} ci/scripts" export YAPF_EXCLUDE_FLAGS="-e ${PY_ROOT}/versioneer.py -e ${PY_ROOT}/morpheus/_version.py" # Determine the commits to compare against. If running in CI, these will be set. Otherwise, diff with main -export BASE_SHA=${CHANGE_TARGET:-${BASE_SHA:-main}} +export BASE_SHA=${CHANGE_TARGET:-${BASE_SHA:-$(${SCRIPT_DIR}/gitutils.py get_merge_target)}} export COMMIT_SHA=${GIT_COMMIT:-${COMMIT_SHA:-HEAD}} -export CPP_FILE_REGEX='^(\.\/)?(src|include|tests|benchmarks|python)\/.*\.(cc|cpp|h|hpp)$' +export CPP_FILE_REGEX='^(\.\/)?(morpheus|tests)\/.*\.(cc|cpp|h|hpp)$' export PYTHON_FILE_REGEX='^(\.\/)?(?!\.|build).*\.(py|pyx|pxd)$' # Use these options to skip any of the checks diff --git a/ci/scripts/fix_all.sh b/ci/scripts/fix_all.sh index 14e249d290..2ab43c1b8e 100755 --- a/ci/scripts/fix_all.sh +++ b/ci/scripts/fix_all.sh @@ -57,13 +57,13 @@ if [[ "${SKIP_CLANG_TIDY}" == "" ]]; then fi # Run include-what-you-use -if [[ "${SKIP_IWYU}" == "" ]]; then +if [[ "${SKIP_IWYU}" == "" && "${CPP_MODIFIED_FILES}" != "" ]]; then IWYU_TOOL=$(find_iwyu_tool) if [[ -x "${IWYU_TOOL}" ]]; then echo "Running include-what-you-use from '${IWYU_TOOL}'..." - ${IWYU_TOOL} -j 0 -p ${BUILD_DIR} ${CPP_MODIFIED_FILES[@]} 2>&1 + ${IWYU_TOOL} -j $(nproc) -p ${BUILD_DIR} ${CPP_MODIFIED_FILES[@]} 2>&1 else echo "Skipping include-what-you-use. Could not find iwyu_tool.py at '${IWYU_TOOL}'" fi diff --git a/ci/scripts/gitutils.py b/ci/scripts/gitutils.py old mode 100644 new mode 100755 index 363b5d13b7..034584d728 --- a/ci/scripts/gitutils.py +++ b/ci/scripts/gitutils.py @@ -1,3 +1,4 @@ +#! /bin/env python3 # SPDX-FileCopyrightText: Copyright (c) 2019-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # @@ -14,7 +15,9 @@ # limitations under the License. # +import argparse import datetime +import logging import os import re import subprocess @@ -76,7 +79,8 @@ def repo_version_major_minor(): match = re.match(r"^v?(?P[0-9]+)(?:\.(?P[0-9]+))?", full_repo_version) if (match is None): - print(" [DEBUG] Could not determine repo major minor version. " f"Full repo version: {full_repo_version}.") + logging.debug("Could not determine repo major minor version. " + f"Full repo version: {full_repo_version}.") return None out_version = match.group("major") @@ -115,8 +119,8 @@ def determine_merge_commit(current_branch="HEAD"): # Try to determine the target branch from the most recent tag head_branch = __git("describe", "--all", "--tags", "--match='branch-*'", "--abbrev=0") except subprocess.CalledProcessError: - print(" [DEBUG] Could not determine target branch from most recent " - "tag. Falling back to 'branch-{major}.{minor}.") + logging.debug("Could not determine target branch from most recent " + "tag. Falling back to 'branch-{major}.{minor}.") head_branch = None if (head_branch is not None): @@ -132,20 +136,22 @@ def determine_merge_commit(current_branch="HEAD"): head_branch = "branch-{}".format(version) except Exception: - print(" [DEBUG] Could not determine branch version falling back to main") + logging.debug("Could not determine branch version falling back to main") head_branch = "main" try: # Now get the remote tracking branch remote_branch = __git("rev-parse", "--abbrev-ref", "--symbolic-full-name", head_branch + "@{upstream}") except subprocess.CalledProcessError: - print(" [DEBUG] Could not remote tracking reference for " f"branch {head_branch}.") + logging.debug("Could not remote tracking reference for " + f"branch {head_branch}.") remote_branch = None if (remote_branch is None): return None - print(f" [DEBUG] Determined TARGET_BRANCH as: '{remote_branch}'. " "Finding common ancestor.") + logging.debug(f"Determined TARGET_BRANCH as: '{remote_branch}'. " + "Finding common ancestor.") common_commit = __git("merge-base", remote_branch, current_branch) @@ -227,13 +233,15 @@ def modifiedFiles(pathFilter=None): targetBranch = os.environ.get("TARGET_BRANCH") commitHash = os.environ.get("COMMIT_HASH") currentBranch = branch() - print(f" [DEBUG] TARGET_BRANCH={targetBranch}, COMMIT_HASH={commitHash}, " f"currentBranch={currentBranch}") + logging.debug(f"TARGET_BRANCH={targetBranch}, COMMIT_HASH={commitHash}, " + f"currentBranch={currentBranch}") if targetBranch and commitHash and (currentBranch == "current-pr-branch"): - print(" [DEBUG] Assuming a CI environment.") + logging.debug("Assuming a CI environment.") allFiles = changedFilesBetween(targetBranch, currentBranch, commitHash) else: - print(" [DEBUG] Did not detect CI environment. " "Determining TARGET_BRANCH locally.") + logging.debug("Did not detect CI environment. " + "Determining TARGET_BRANCH locally.") common_commit = determine_merge_commit(currentBranch) @@ -252,7 +260,7 @@ def modifiedFiles(pathFilter=None): files.append(f) filesToCheckString = "\n\t".join(files) if files else "" - print(f" [DEBUG] Found files to check:\n\t{filesToCheckString}\n") + logging.debug(f"Found files to check:\n\t{filesToCheckString}\n") return files @@ -291,3 +299,28 @@ def listFilesToCheck(filesDirs, filter=None): if filter is None or filter(f_): allFiles.append(f_) return allFiles + + +def get_merge_target(): + currentBranch = branch() + return determine_merge_commit(currentBranch) + + +def parse_args(): + argparser = argparse.ArgumentParser("Executes a gitutil action") + argparser.add_argument("action", + choices=['get_merge_target'], + help="Action to execute") + args = argparser.parse_args() + return args + + +def main(): + args = parse_args() + logging.basicConfig(level=logging.ERROR) + if args.action == 'get_merge_target': + print(get_merge_target()) + + +if __name__ == '__main__': + main() diff --git a/ci/scripts/jenkins/build.sh b/ci/scripts/jenkins/build.sh index 97b3490f82..c8a4dabadf 100755 --- a/ci/scripts/jenkins/build.sh +++ b/ci/scripts/jenkins/build.sh @@ -35,10 +35,7 @@ python3 --version gcc --version g++ --version -gpuci_logger "Check conda environment" -conda info -conda config --show-sources -conda list --show-channel-urls +show_conda_info gpuci_logger "Checking S3 cuDF cache" CUDF_CONDA_BLD_DIR=/opt/conda/conda-bld @@ -49,11 +46,10 @@ CUDF_CONDA_TAR="${WORKSPACE_TMP}/cudf_conda.tar.bz" gpuci_logger "Checking ${DISPLAY_URL}${CUDF_CONDA_CACHE_PATH}" set +e -aws s3 cp --no-progress ${CUDF_CONDA_CACHE_URL} ${CUDF_CONDA_TAR} -CUDF_CACHE_CHECK=$? +fetch_s3 "${CUDF_CONDA_CACHE_PATH}" "${CUDF_CONDA_TAR}" set -e -if [[ "${CUDF_CACHE_CHECK}" != "0" ]]; then +if [[ "${FETCH_STATUS}" != "0" ]]; then gpuci_logger "Cache miss, Building cuDF" mkdir -p ${CUDF_CONDA_BLD_DIR} # The --no-build-id bit is needed for sccache @@ -96,11 +92,9 @@ cmake -B build -G Ninja \ -DMORPHEUS_BUILD_EXAMPLES=ON \ -DMORPHEUS_BUILD_TESTS=ON \ -DMORPHEUS_USE_CONDA=ON \ - -DMORPHEUS_PYTHON_INPLACE_BUILD=ON \ - -DMORPHEUS_USE_CCACHE=OFF \ - -DCMAKE_C_COMPILER_LAUNCHER=sccache \ - -DCMAKE_CXX_COMPILER_LAUNCHER=sccache \ - -DCMAKE_CUDA_COMPILER_LAUNCHER=sccache \ + -DMORPHEUS_PYTHON_INPLACE_BUILD=OFF \ + -DMORPHEUS_USE_CCACHE=ON \ + -DCCACHE_PROGRAM_PATH=$(which sccache) \ . gpuci_logger "Building Morpheus" @@ -110,16 +104,14 @@ gpuci_logger "sccache usage for morpheus build:" sccache --show-stats gpuci_logger "Installing Morpheus" -pip install -e ${MORPHEUS_ROOT} +cmake -DCOMPONENT=Wheel -P ${MORPHEUS_ROOT}/build/cmake_install.cmake +pip install ${MORPHEUS_ROOT}/build/wheel gpuci_logger "Archiving results" -mamba pack --quiet --force --ignore-editable-packages --ignore-missing-files --n-threads ${PARALLEL_LEVEL} -n morpheus -o ${WORKSPACE_TMP}/conda_env.tar.gz -tar cfj ${WORKSPACE_TMP}/workspace.tar.bz --exclude=".git" --exclude="models" --exclude=".cache" ./ -ls -lh ${WORKSPACE_TMP}/ +mamba pack --quiet --force --ignore-missing-files --n-threads ${PARALLEL_LEVEL} -n morpheus -o ${WORKSPACE_TMP}/conda_env.tar.gz gpuci_logger "Pushing results to ${DISPLAY_ARTIFACT_URL}" aws s3 cp --no-progress "${WORKSPACE_TMP}/conda_env.tar.gz" "${ARTIFACT_URL}/conda_env.tar.gz" -aws s3 cp --no-progress "${WORKSPACE_TMP}/workspace.tar.bz" "${ARTIFACT_URL}/workspace.tar.bz" gpuci_logger "Success" exit 0 diff --git a/ci/scripts/jenkins/checks.sh b/ci/scripts/jenkins/checks.sh index 5d8acb5cc2..774b4ccb38 100755 --- a/ci/scripts/jenkins/checks.sh +++ b/ci/scripts/jenkins/checks.sh @@ -23,6 +23,8 @@ conda activate rapids gpuci_logger "Installing CI dependencies" mamba install -q -y -c conda-forge "yapf=0.32" +show_conda_info + gpuci_logger "Runing Python style checks" ${MORPHEUS_ROOT}/ci/scripts/python_checks.sh diff --git a/ci/scripts/jenkins/common.sh b/ci/scripts/jenkins/common.sh index bc943c121a..f30c73abf5 100644 --- a/ci/scripts/jenkins/common.sh +++ b/ci/scripts/jenkins/common.sh @@ -22,7 +22,7 @@ gpuci_logger "Memory" /usr/bin/free -g -gpuci_logger "user info" +gpuci_logger "User Info" id # Change target is the branch name we are merging into but due to the weird way jenkins does @@ -32,7 +32,8 @@ export CHANGE_TARGET="origin/${CHANGE_TARGET}" # S3 vars export S3_URL="s3://rapids-downloads/ci/morpheus" export DISPLAY_URL="https://downloads.rapids.ai/ci/morpheus" -export ARTIFACT_URL="${S3_URL}/pull-request/${CHANGE_ID}/${GIT_COMMIT}/${NVARCH}" +export ARTIFACT_ENDPOINT="/pull-request/${CHANGE_ID}/${GIT_COMMIT}/${NVARCH}" +export ARTIFACT_URL="${S3_URL}${ARTIFACT_ENDPOINT}" export DISPLAY_ARTIFACT_URL="${DISPLAY_URL}/pull-request/${CHANGE_ID}/${GIT_COMMIT}/${NVARCH}/" # Set sccache env vars @@ -42,5 +43,43 @@ export SCCACHE_REGION=us-west-2 export SCCACHE_IDLE_TIMEOUT=32768 #export SCCACHE_LOG=debug +export FETCH_STATUS=0 + gpuci_logger "Environ:" env | sort + +function fetch_s3() { + ENDPOINT=$1 + DESTINATION=$2 + if [[ "${USE_S3_CURL}" == "1" ]]; then + curl -f "${DISPLAY_URL}${ENDPOINT}" -o "${DESTINATION}" + FETCH_STATUS=$? + else + aws s3 cp --no-progress "${S3_URL}${ENDPOINT}" "${DESTINATION}" + FETCH_STATUS=$? + fi +} + +function restore_conda_env() { + + gpuci_logger "Downloading build artifacts from ${DISPLAY_ARTIFACT_URL}" + fetch_s3 "${ARTIFACT_ENDPOINT}/conda_env.tar.gz" "${WORKSPACE_TMP}/conda_env.tar.gz" + + gpuci_logger "Extracting" + mkdir -p /opt/conda/envs/morpheus + + # We are using the --no-same-owner flag since user id & group id's are inconsistent between nodes in our CI pool + tar xf "${WORKSPACE_TMP}/conda_env.tar.gz" --no-same-owner --directory /opt/conda/envs/morpheus + + gpuci_logger "Setting test env" + conda activate morpheus + conda-unpack +} + +function show_conda_info() { + + gpuci_logger "Check Conda info" + conda info + conda config --show-sources + conda list --show-channel-urls +} diff --git a/ci/scripts/jenkins/docs.sh b/ci/scripts/jenkins/docs.sh index 95a059f451..6a85e85871 100755 --- a/ci/scripts/jenkins/docs.sh +++ b/ci/scripts/jenkins/docs.sh @@ -17,24 +17,9 @@ set -e source ${WORKSPACE}/ci/scripts/jenkins/common.sh +/usr/bin/nvidia-smi -gpuci_logger "Downloading build artifacts from ${DISPLAY_ARTIFACT_URL}" -aws s3 cp --no-progress "${ARTIFACT_URL}/conda_env.tar.gz" "${WORKSPACE_TMP}/conda_env.tar.gz" -aws s3 cp --no-progress "${ARTIFACT_URL}/workspace.tar.bz" "${WORKSPACE_TMP}/workspace.tar.bz" - -gpuci_logger "Extracting" -mkdir -p /opt/conda/envs/morpheus -tar xf "${WORKSPACE_TMP}/conda_env.tar.gz" --no-same-owner --directory /opt/conda/envs/morpheus -tar xf "${WORKSPACE_TMP}/workspace.tar.bz" --no-same-owner - -gpuci_logger "Setting test env" -conda activate morpheus -conda-unpack - -# Work-around for issue where libmorpheus_utils.so is not found by libmorpheus.so -export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${MORPHEUS_ROOT}/morpheus/_lib - -pip install -e ${MORPHEUS_ROOT} +restore_conda_env cd ${MORPHEUS_ROOT}/docs gpuci_logger "Installing Documentation dependencies" diff --git a/ci/scripts/jenkins/test.sh b/ci/scripts/jenkins/test.sh index 08fb6fbbc9..f37b052ad4 100755 --- a/ci/scripts/jenkins/test.sh +++ b/ci/scripts/jenkins/test.sh @@ -19,47 +19,22 @@ set -e source ${WORKSPACE}/ci/scripts/jenkins/common.sh /usr/bin/nvidia-smi -gpuci_logger "Check versions" -python3 --version -gcc --version -g++ --version +restore_conda_env -gpuci_logger "Check conda environment" -conda info -conda config --show-sources -conda list --show-channel-urls - -gpuci_logger "Downloading build artifacts from ${DISPLAY_ARTIFACT_URL}" -aws s3 cp --no-progress "${ARTIFACT_URL}/conda_env.tar.gz" "${WORKSPACE_TMP}/conda_env.tar.gz" -aws s3 cp --no-progress "${ARTIFACT_URL}/workspace.tar.bz" "${WORKSPACE_TMP}/workspace.tar.bz" - -gpuci_logger "Extracting" -mkdir -p /opt/conda/envs/morpheus -tar xf "${WORKSPACE_TMP}/conda_env.tar.gz" --no-same-owner --directory /opt/conda/envs/morpheus -tar xf "${WORKSPACE_TMP}/workspace.tar.bz" --no-same-owner - -gpuci_logger "Setting test env" -conda activate morpheus -conda-unpack -conda list --show-channel-urls - -npm install --slient -g camouflage-server +npm install --silent -g camouflage-server mamba install -q -y -c conda-forge "git-lfs=3.1.4" gpuci_logger "Pulling LFS assets" cd ${MORPHEUS_ROOT} + git lfs install ${MORPHEUS_ROOT}/scripts/fetch_data.py fetch tests validation -pip install -e ${MORPHEUS_ROOT} - -# Work-around for issue where libmorpheus_utils.so is not found by libmorpheus.so -# The build and test nodes have different workspace paths (/jenkins vs. /var/lib/jenkins) -# Typically these are fixed by conda-unpack but since we did an in-place build we will -# have to fix this ourselves by setting LD_LIBRARY_PATH -export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${MORPHEUS_ROOT}/morpheus/_lib - gpuci_logger "Running tests" +# Running the tests from the tests dir. Normally this isn't nescesary, however since +# we are testing the installed version of morpheus in site-packages and not the one +# in the repo dir, the pytest coverage module reports incorrect coverage stats. +cd ${MORPHEUS_ROOT}/tests set +e pytest --run_slow \ --junit-xml=${WORKSPACE_TMP}/report_pytest.xml \ From 304262133d062732c57a4a10bcd9e2097502df85 Mon Sep 17 00:00:00 2001 From: AJ Schmidt Date: Mon, 13 Jun 2022 12:18:24 -0400 Subject: [PATCH 38/73] Update ops-bot.yaml --- .github/ops-bot.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/ops-bot.yaml b/.github/ops-bot.yaml index 0a52b67955..2ef41b3674 100644 --- a/.github/ops-bot.yaml +++ b/.github/ops-bot.yaml @@ -5,4 +5,5 @@ auto_merger: true branch_checker: true label_checker: true release_drafter: true -external_contributors: false +copy_prs: true +rerun_tests: true From 33a938c353b23196856ec300790367d057618be4 Mon Sep 17 00:00:00 2001 From: David Gardner <96306125+dagardner-nv@users.noreply.github.com> Date: Mon, 13 Jun 2022 14:09:26 -0700 Subject: [PATCH 39/73] Fix for CI check script (#158) + Use Github's rest API to determine base branch. + Only run check stage on pull requests Authors: - David Gardner (https://github.com/dagardner-nv) Approvers: - Michael Demoret (https://github.com/mdemoret-nv) - Christopher Harris (https://github.com/cwharris) URL: https://github.com/nv-morpheus/Morpheus/pull/158 --- ci/Jenkinsfile | 5 +++++ ci/scripts/jenkins/common.sh | 22 +++++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile index aaffaf22d6..c457f6fb91 100644 --- a/ci/Jenkinsfile +++ b/ci/Jenkinsfile @@ -1,3 +1,5 @@ +@Library('jenkins_shared_lib') _ + pipeline { agent any options { @@ -8,6 +10,8 @@ pipeline { RAPIDS_VER = '21.10' CUDA_VER = '11.4' HOME = "${WORKSPACE}" + GH_TOKEN = credentials('gputester-github-token') + BUILD_TYPE = sh(returnStdout: true, script: 'rapids-build-type') } stages { stage('Checks & Builds') { @@ -17,6 +21,7 @@ pipeline { options { timeout(time: 1, unit: 'HOURS') } + when { environment name: 'BUILD_TYPE', value: 'pull-request' } agent { docker { image 'gpuci/rapidsai-driver:21.10-cuda11.4-devel-ubuntu20.04-py3.8' diff --git a/ci/scripts/jenkins/common.sh b/ci/scripts/jenkins/common.sh index f30c73abf5..80334ed368 100644 --- a/ci/scripts/jenkins/common.sh +++ b/ci/scripts/jenkins/common.sh @@ -25,16 +25,32 @@ gpuci_logger "Memory" gpuci_logger "User Info" id +gpuci_logger "Retrieving base branch from GitHub API" +# For PRs, $GIT_BRANCH is like: pull-request/989 +REPO_NAME=$(basename "${GIT_URL}" .git) +ORG_NAME=$(basename "$(dirname "${GIT_URL}")") +PR_NUM="${GIT_BRANCH##*/}" +[[ -n "$GH_TOKEN" ]] && CURL_HEADERS=('-H' "Authorization: token ${GH_TOKEN}") +RESP=$( +curl -s \ + -H "Accept: application/vnd.github.v3+json" \ + "${CURL_HEADERS[@]}" \ + "https://api.github.com/repos/${ORG_NAME}/${REPO_NAME}/pulls/${PR_NUM}" +) + +BASE_BRANCH=$(echo "${RESP}" | jq -r '.base.ref') + # Change target is the branch name we are merging into but due to the weird way jenkins does # the checkout it isn't recognized by git without the origin/ prefix -export CHANGE_TARGET="origin/${CHANGE_TARGET}" +export CHANGE_TARGET="origin/${BASE_BRANCH}" +gpuci_logger "Base branch: ${BASE_BRANCH}" # S3 vars export S3_URL="s3://rapids-downloads/ci/morpheus" export DISPLAY_URL="https://downloads.rapids.ai/ci/morpheus" -export ARTIFACT_ENDPOINT="/pull-request/${CHANGE_ID}/${GIT_COMMIT}/${NVARCH}" +export ARTIFACT_ENDPOINT="/pull-request/${PR_NUM}/${GIT_COMMIT}/${NVARCH}" export ARTIFACT_URL="${S3_URL}${ARTIFACT_ENDPOINT}" -export DISPLAY_ARTIFACT_URL="${DISPLAY_URL}/pull-request/${CHANGE_ID}/${GIT_COMMIT}/${NVARCH}/" +export DISPLAY_ARTIFACT_URL="${DISPLAY_URL}/pull-request/${PR_NUM}/${GIT_COMMIT}/${NVARCH}/" # Set sccache env vars export SCCACHE_S3_KEY_PREFIX=morpheus-${NVARCH} From 3354cf0305e1ac8ccdd4da30dc79b4e9c697d505 Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Mon, 13 Jun 2022 18:54:07 -0500 Subject: [PATCH 40/73] update cudf to 22.04, cuda to 11.5 (#148) Contributes to #144 (22.06 build args). Closes #89 (update cudf). This PR updates cudf to 22.04 and cuda to 11.5, which is required to compile against cudf 22.04 due to decimal128 support. Some documentation may still need updating. Authors: - Christopher Harris (https://github.com/cwharris) Approvers: - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/148 --- CONTRIBUTING.md | 31 ++- ci/Jenkinsfile | 12 +- .../recipes/cudf/001-external-table.patch | 53 ----- ci/conda/recipes/cudf/build.sh | 50 ----- ci/conda/recipes/cudf/conda_build_config.yaml | 24 --- ci/conda/recipes/cudf/meta.yaml | 96 --------- .../recipes/libcudf/001-external-table.patch | 53 ----- ci/conda/recipes/libcudf/build.sh | 67 ------- .../recipes/libcudf/conda_build_config.yaml | 26 --- ci/conda/recipes/libcudf/meta.yaml | 82 -------- .../recipes/morpheus/conda_build_config.yaml | 4 +- ci/conda/recipes/morpheus/meta.yaml | 8 +- ci/conda/recipes/run_conda_build.sh | 14 -- ci/scripts/jenkins/build.sh | 39 +--- cmake/import-rapids-cmake.cmake | 15 +- docker/Dockerfile | 36 +--- docker/build_container.sh | 9 +- .../{cuda11.4_ci.yml => cuda11.5_ci.yml} | 1 + .../{cuda11.4_dev.yml => cuda11.5_dev.yml} | 12 +- ...a11.4_runtime.yml => cuda11.5_runtime.yml} | 0 .../abp_pcap_preprocessing.py | 2 +- morpheus/_lib/cudf_helpers.pyx | 184 ++++++------------ .../_lib/include/nvtext/subword_tokenize.hpp | 161 +++++++++++++++ morpheus/_lib/src/utilities/cudf_util.cpp | 4 +- .../stages/preprocess/preprocess_fil_stage.py | 2 +- pyproject.toml | 6 + 26 files changed, 284 insertions(+), 707 deletions(-) delete mode 100644 ci/conda/recipes/cudf/001-external-table.patch delete mode 100644 ci/conda/recipes/cudf/build.sh delete mode 100644 ci/conda/recipes/cudf/conda_build_config.yaml delete mode 100644 ci/conda/recipes/cudf/meta.yaml delete mode 100644 ci/conda/recipes/libcudf/001-external-table.patch delete mode 100644 ci/conda/recipes/libcudf/build.sh delete mode 100644 ci/conda/recipes/libcudf/conda_build_config.yaml delete mode 100644 ci/conda/recipes/libcudf/meta.yaml rename docker/conda/environments/{cuda11.4_ci.yml => cuda11.5_ci.yml} (90%) rename docker/conda/environments/{cuda11.4_dev.yml => cuda11.5_dev.yml} (90%) rename docker/conda/environments/{cuda11.4_runtime.yml => cuda11.5_runtime.yml} (100%) create mode 100644 morpheus/_lib/include/nvtext/subword_tokenize.hpp diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e63074e864..d456263525 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -48,17 +48,17 @@ The following instructions are for developers who are getting started with the M All of the following instructions assume several variables have been set: - `MORPHEUS_ROOT`: The Morpheus repository has been checked out at a location specified by this variable. Any non-absolute paths are relative to `MORPHEUS_ROOT`. - - `PYTHON_VER`: The desired Python version. Minimum required is 3.8 - - `RAPIDS_VER`: The desired RAPIDS version for all RAPIDS libraries including cuDF and RMM. This is also used for Triton. If in doubt use `21.10` - - `CUDA_VER`: The desired CUDA version to use. If in doubt use `11.4` + - `PYTHON_VER`: The desired Python version. Minimum required is `3.8` + - `RAPIDS_VER`: The desired RAPIDS version for all RAPIDS libraries including cuDF and RMM. This is also used for Triton. If in doubt use `22.04` + - `CUDA_VER`: The desired CUDA version to use. If in doubt use `11.5` ### Clone the repository and pull large file data from Git LFS ```bash export PYTHON_VER=3.8 -export RAPIDS_VER=21.10 -export CUDA_VER=11.4 +export RAPIDS_VER=22.04 +export CUDA_VER=11.5 export MORPHEUS_ROOT=$(pwd)/morpheus git clone https://github.com/NVIDIA/Morpheus.git $MORPHEUS_ROOT cd $MORPHEUS_ROOT @@ -135,18 +135,13 @@ This workflow utilizes a docker container to set up most dependencies ensuring a python 3.8.13 py3.8.13_dbg_morpheus local ``` 1. Note: This does not build any Morpheus or Neo code and defers building the code until the entire repo can be mounted into a running container. This allows for faster incremental builds during development. -2. Set up `ssh-agent` to allow container to pull from private repos - ```bash - eval `ssh-agent -s` - ssh-add - ``` -3. Run the development container +2. Run the development container ```bash ./docker/run_container_dev.sh ``` 1. The container tag follows the same rules as `build_container_dev.sh` and will default to the current `YYMMDD`. Specify the desired tag with `DOCKER_IMAGE_TAG`. i.e. `DOCKER_IMAGE_TAG=my_tag ./docker/run_container_dev.sh` 2. This will automatically mount the current working directory to `/workspace`. - 3. Some of the validation tests require launching a triton docker container within the morpheus container. To enable this you will need to grant the morpheus contrainer access to your host OS's docker socket file with: + 3. Some of the validation tests require launching a triton docker container within the morpheus container. To enable this you will need to grant the morpheus container access to your host OS's docker socket file with: ```bash DOCKER_EXTRA_ARGS="-v /var/run/docker.sock:/var/run/docker.sock" ./docker/run_container_dev.sh ``` @@ -155,17 +150,17 @@ This workflow utilizes a docker container to set up most dependencies ensuring a ./docker/install_docker.sh ``` -4. Compile Morpheus +3. Compile Morpheus ```bash ./scripts/compile.sh ``` This script will run both CMake Configure with default options and CMake build. -5. Install Morpheus +4. Install Morpheus ```bash pip install -e /workspace ``` Once Morpheus has been built, it can be installed into the current virtual environment. -6. [Run Morpheus](./README.md#running-morpheus) +5. [Run Morpheus](./README.md#running-morpheus) ```bash morpheus run pipeline-nlp ... ``` @@ -196,8 +191,8 @@ Note: These instructions assume the user is using `mamba` instead of `conda` sin 1. Setup env variables and clone the repo: ```bash export PYTHON_VER=3.8 - export RAPIDS_VER=21.10 - export CUDA_VER=11.4 + export RAPIDS_VER=22.04 + export CUDA_VER=11.5 export MORPHEUS_ROOT=$(pwd)/morpheus git clone https://github.com/NVIDIA/Morpheus.git $MORPHEUS_ROOT cd $MORPHEUS_ROOT @@ -321,4 +316,4 @@ Ex: ## Attribution Portions adopted from https://github.com/pytorch/pytorch/blob/master/CONTRIBUTING.md \ -Portions adopted from https://github.com/dask/dask/blob/master/docs/source/develop.rst +Portions adopted from https://github.com/dask/dask/blob/master/docs/source/develop.rst \ No newline at end of file diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile index c457f6fb91..3f4c4c685a 100644 --- a/ci/Jenkinsfile +++ b/ci/Jenkinsfile @@ -7,8 +7,8 @@ pipeline { } environment { PYTHON_VER = '3.8' - RAPIDS_VER = '21.10' - CUDA_VER = '11.4' + RAPIDS_VER = '22.04' + CUDA_VER = '11.5' HOME = "${WORKSPACE}" GH_TOKEN = credentials('gputester-github-token') BUILD_TYPE = sh(returnStdout: true, script: 'rapids-build-type') @@ -24,7 +24,7 @@ pipeline { when { environment name: 'BUILD_TYPE', value: 'pull-request' } agent { docker { - image 'gpuci/rapidsai-driver:21.10-cuda11.4-devel-ubuntu20.04-py3.8' + image 'gpuci/rapidsai-driver:22.04-cuda11.5-devel-centos7-py3.8' label 'cpu' } } @@ -48,7 +48,7 @@ pipeline { } agent { docker { - image 'gpuci/rapidsai:21.10-cuda11.4-devel-ubuntu20.04-py3.8' + image 'gpuci/rapidsai:22.04-cuda11.5-devel-centos7-py3.8' label 'driver-495' args '--runtime "nvidia" -e "NVIDIA_VISIBLE_DEVICES=$EXECUTOR_NUMBER"' } @@ -81,7 +81,7 @@ pipeline { } agent { docker { - image 'gpuci/rapidsai:21.10-cuda11.4-devel-ubuntu20.04-py3.8' + image 'gpuci/rapidsai:22.04-cuda11.5-devel-centos7-py3.8' label 'driver-495' args '--runtime "nvidia" -e "NVIDIA_VISIBLE_DEVICES=$EXECUTOR_NUMBER"' } @@ -112,7 +112,7 @@ pipeline { } agent { docker { - image 'gpuci/rapidsai:21.10-cuda11.4-devel-ubuntu20.04-py3.8' + image 'gpuci/rapidsai:22.04-cuda11.5-devel-centos7-py3.8' label 'driver-495' args '--runtime "nvidia" -e "NVIDIA_VISIBLE_DEVICES=$EXECUTOR_NUMBER"' } diff --git a/ci/conda/recipes/cudf/001-external-table.patch b/ci/conda/recipes/cudf/001-external-table.patch deleted file mode 100644 index 98d93cccea..0000000000 --- a/ci/conda/recipes/cudf/001-external-table.patch +++ /dev/null @@ -1,53 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt -index 1dd3348a9c..0a115e471b 100644 ---- a/cpp/CMakeLists.txt -+++ b/cpp/CMakeLists.txt -@@ -642,6 +642,7 @@ install(TARGETS cudf - install(DIRECTORY - ${CUDF_SOURCE_DIR}/include/cudf - ${CUDF_SOURCE_DIR}/include/cudf_test -+ ${CUDF_SOURCE_DIR}/include/nvtext - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) - - install(DIRECTORY -diff --git a/python/cudf/cudf/_lib/column.pxd b/python/cudf/cudf/_lib/column.pxd -index 2df958466c..bce326b125 100644 ---- a/python/cudf/cudf/_lib/column.pxd -+++ b/python/cudf/cudf/_lib/column.pxd -@@ -10,7 +10,7 @@ from cudf._lib.cpp.column.column_view cimport column_view, mutable_column_view - from cudf._lib.cpp.types cimport size_type - - --cdef class Column: -+cdef public class Column[object PyColumn, type PyColumn_t]: - cdef public: - cdef int _offset - cdef int _size -diff --git a/python/cudf/cudf/_lib/table.pxd b/python/cudf/cudf/_lib/table.pxd -index 2299c924bb..fc8e461440 100644 ---- a/python/cudf/cudf/_lib/table.pxd -+++ b/python/cudf/cudf/_lib/table.pxd -@@ -6,7 +6,7 @@ from cudf._lib.cpp.table.table cimport table - from cudf._lib.cpp.table.table_view cimport mutable_table_view, table_view - - --cdef class Table: -+cdef public class Table[object PyTable, type PyTable_t]: - cdef dict __dict__ - - cdef table_view table_view_from_columns(columns) except * diff --git a/ci/conda/recipes/cudf/build.sh b/ci/conda/recipes/cudf/build.sh deleted file mode 100644 index fe932d0333..0000000000 --- a/ci/conda/recipes/cudf/build.sh +++ /dev/null @@ -1,50 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Copyright (c) 2018-2019, NVIDIA CORPORATION. - -# Use the parent folder of work for the base dir to capture host and env files -export CCACHE_BASEDIR=$(realpath ${SRC_DIR}/..) -export CCACHE_LOGFILE=${CCACHE_DIR}/ccache.log -export CCACHE_DEBUG=1 -export CCACHE_DEBUGDIR=${SRC_DIR}/ccache_debug -export CCACHE_SLOPPINESS="system_headers" -export CCACHE_NOHASHDIR=1 - -# Double check that the cache dir has been created -mkdir -p ${CCACHE_DIR} - -# CMake with nvcc uses -isystem=/path instead of -isystem /path which ccache doesnt like. Replace that -REPLACE_ISYSTEM="ARGS=()\nfor i in \"\${@}\"; do\n ARGS+=(\${i/\"-isystem=/\"/\"-isystem /\"})\ndone\n" - -# Setup using CCACHE -echo -e '#!/bin/bash\n'"${REPLACE_ISYSTEM}\n${CMAKE_C_COMPILER_LAUNCHER} ${GCC} \"\${ARGS[@]}\"" > ccache_cc.sh -echo -e '#!/bin/bash\n'"${REPLACE_ISYSTEM}\n${CMAKE_CXX_COMPILER_LAUNCHER} ${GXX} \"\${ARGS[@]}\"" > ccache_cxx.sh -echo -e '#!/bin/bash\n'"${REPLACE_ISYSTEM}\n${CMAKE_CUDA_COMPILER_LAUNCHER} nvcc \"\${ARGS[@]}\"" > ccache_cuda.sh - -# For some reason CXX must be a single executable (i.e. so that `which $CXX` would not error). So instead of setting -# CXX="ccache $CXX", make a new script to do this for us -export CC="${PWD}/ccache_cc.sh" -export CXX="${PWD}/ccache_cxx.sh" -export NVCC="${PWD}/ccache_cuda.sh" - -chmod +x ${CC} -chmod +x ${CXX} -chmod +x ${NVCC} - -./print_env.sh - -# This assumes the script is executed from the root of the repo directory -./build.sh cudf --ptds diff --git a/ci/conda/recipes/cudf/conda_build_config.yaml b/ci/conda/recipes/cudf/conda_build_config.yaml deleted file mode 100644 index 797f21dd88..0000000000 --- a/ci/conda/recipes/cudf/conda_build_config.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -c_compiler_version: - - 9.4 - -cxx_compiler_version: - - 9.4 - -python: - - 3.8 - - 3.9 diff --git a/ci/conda/recipes/cudf/meta.yaml b/ci/conda/recipes/cudf/meta.yaml deleted file mode 100644 index bc2c298d59..0000000000 --- a/ci/conda/recipes/cudf/meta.yaml +++ /dev/null @@ -1,96 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{% set version = "21.10.01" %} -{% set minor_version = version.split('.')[0] + '.' + version.split('.')[1] %} -{% set py_version=environ.get('CONDA_PY', 38) %} -{% set cuda_version='.'.join(environ.get('CUDA', '11.4').split('.')[:2]) %} -{% set build_num = 1 %} - -package: - name: cudf - version: {{ version }} - -source: - url: https://github.com/rapidsai/cudf/archive/v{{ version }}.tar.gz - sha256: c3a5d5cae921496ef5800ab8b3580e4dbaab88115c4527d1bcddc06e9c4c43a3 - patches: - # Fix the cmake export to include a version file - - 001-external-table.patch - -build: - number: {{ build_num }} - string: cuda_{{ cuda_version }}_py{{ py_version }}_h{{ PKG_HASH }}_{{ build_num }}_morpheus - script_env: - - VERSION_SUFFIX - - PARALLEL_LEVEL - - PROJECT_FLASH - - CCACHE_DIR - - CCACHE_NOHASHDIR - - CCACHE_COMPILERCHECK - - CMAKE_GENERATOR - - CMAKE_C_COMPILER_LAUNCHER - - CMAKE_CXX_COMPILER_LAUNCHER - - CMAKE_CUDA_COMPILER_LAUNCHER - run_exports: - - {{ pin_subpackage("cudf", max_pin="x.x") }} *_morpheus - -requirements: - build: - - {{ compiler("c") }} - - {{ compiler("cxx") }} - - ccache - host: - - protobuf=3.19 - - python {{ python }} - - cython >=0.29,<0.30 - - setuptools - - numba >=0.53.1 - - dlpack>=0.5,<0.6.0a0 - - pyarrow 5.0.0 *cuda - - libcudf {{ version }} cuda_{{ cuda_version }}_*morpheus - - rmm {{ minor_version }} - - cudatoolkit {{ cuda_version }} - - rapidjson=1.1 - run: - - protobuf=3.19 - - python - - typing_extensions - - pandas >=1.0,<1.4.0dev0 - - cupy >7.1.0,<10.0.0a0 - - numba >=0.53.1 - - numpy - - {{ pin_compatible('pyarrow', max_pin='x.x.x') }} *cuda - - fastavro >=0.22.0 - - {{ pin_compatible('rmm', max_pin='x.x') }} - - fsspec>=0.6.0 - - {{ pin_compatible('cudatoolkit', max_pin='x.x') }} - - nvtx >=0.2.1 - - packaging - - cachetools - - rapidjson=1.1 - -# test: # [linux64] -# requires: # [linux64] -# - cudatoolkit {{ cuda_version }}.* # [linux64] -# imports: # [linux64] -# - cudf # [linux64] - -about: - home: http://rapids.ai/ - license: Apache-2.0 - license_family: Apache - license_file: LICENSE - summary: cuDF GPU DataFrame core library diff --git a/ci/conda/recipes/libcudf/001-external-table.patch b/ci/conda/recipes/libcudf/001-external-table.patch deleted file mode 100644 index 98d93cccea..0000000000 --- a/ci/conda/recipes/libcudf/001-external-table.patch +++ /dev/null @@ -1,53 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt -index 1dd3348a9c..0a115e471b 100644 ---- a/cpp/CMakeLists.txt -+++ b/cpp/CMakeLists.txt -@@ -642,6 +642,7 @@ install(TARGETS cudf - install(DIRECTORY - ${CUDF_SOURCE_DIR}/include/cudf - ${CUDF_SOURCE_DIR}/include/cudf_test -+ ${CUDF_SOURCE_DIR}/include/nvtext - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) - - install(DIRECTORY -diff --git a/python/cudf/cudf/_lib/column.pxd b/python/cudf/cudf/_lib/column.pxd -index 2df958466c..bce326b125 100644 ---- a/python/cudf/cudf/_lib/column.pxd -+++ b/python/cudf/cudf/_lib/column.pxd -@@ -10,7 +10,7 @@ from cudf._lib.cpp.column.column_view cimport column_view, mutable_column_view - from cudf._lib.cpp.types cimport size_type - - --cdef class Column: -+cdef public class Column[object PyColumn, type PyColumn_t]: - cdef public: - cdef int _offset - cdef int _size -diff --git a/python/cudf/cudf/_lib/table.pxd b/python/cudf/cudf/_lib/table.pxd -index 2299c924bb..fc8e461440 100644 ---- a/python/cudf/cudf/_lib/table.pxd -+++ b/python/cudf/cudf/_lib/table.pxd -@@ -6,7 +6,7 @@ from cudf._lib.cpp.table.table cimport table - from cudf._lib.cpp.table.table_view cimport mutable_table_view, table_view - - --cdef class Table: -+cdef public class Table[object PyTable, type PyTable_t]: - cdef dict __dict__ - - cdef table_view table_view_from_columns(columns) except * diff --git a/ci/conda/recipes/libcudf/build.sh b/ci/conda/recipes/libcudf/build.sh deleted file mode 100644 index 2b2d57c100..0000000000 --- a/ci/conda/recipes/libcudf/build.sh +++ /dev/null @@ -1,67 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Copyright (c) 2018-2019, NVIDIA CORPORATION. - -# Use the parent folder of work for the base dir to capture host and env files -export CCACHE_BASEDIR=$(realpath ${PWD}/..) -export CCACHE_LOGFILE=${CCACHE_DIR}/ccache.log -export CCACHE_DEBUG=1 -export CCACHE_DEBUGDIR=${PWD}/ccache_debug -export CCACHE_SLOPPINESS="system_headers" - -# Use the GNU paths to help ccache -export CC=${GCC} -export CXX=${GXX} - -# Double check that the cache dir has been created -mkdir -p ${CCACHE_DIR} - -# CMake with nvcc uses -isystem=/path instead of -isystem /path which ccache doesnt like. Replace that -REPLACE_ISYSTEM="ARGS=()\nfor i in \"\${@}\"; do\n ARGS+=(\${i/\"-isystem=/\"/\"-isystem /\"})\ndone\n" - -# Setup using CCACHE -echo -e '#!/bin/bash\n'"${REPLACE_ISYSTEM}\n${CMAKE_C_COMPILER_LAUNCHER} \"\${ARGS[@]}\"" > ccache_cc.sh -echo -e '#!/bin/bash\n'"${REPLACE_ISYSTEM}\n${CMAKE_CXX_COMPILER_LAUNCHER} \"\${ARGS[@]}\"" > ccache_cxx.sh -echo -e '#!/bin/bash\n'"${REPLACE_ISYSTEM}\n${CMAKE_CUDA_COMPILER_LAUNCHER} \"\${ARGS[@]}\"" > ccache_cuda.sh - -export CMAKE_C_COMPILER_LAUNCHER="${PWD}/ccache_cc.sh" -export CMAKE_CXX_COMPILER_LAUNCHER="${PWD}/ccache_cxx.sh" -export CMAKE_CUDA_COMPILER_LAUNCHER="${PWD}/ccache_cuda.sh" - -chmod +x ${CMAKE_C_COMPILER_LAUNCHER} -chmod +x ${CMAKE_CXX_COMPILER_LAUNCHER} -chmod +x ${CMAKE_CUDA_COMPILER_LAUNCHER} - -# Fix __FILE__ macros that break caching and include the full prefixed path (very long) -export CFLAGS="${CXXFLAGS} -fmacro-prefix-map=${PREFIX}=/usr/local/src/conda-prefix" -export CXXFLAGS="${CXXFLAGS} -fmacro-prefix-map=${PREFIX}=/usr/local/src/conda-prefix" -export CUDAFLAGS="${CUDAFLAGS} -fmacro-prefix-map=${PREFIX}=/usr/local/src/conda-prefix" - -echo "=====Printing Env=====" -./print_env.sh - -echo "=====Cleaning=====" -./build.sh clean - -echo "=====Building=====" -if [[ -z "$PROJECT_FLASH" || "$PROJECT_FLASH" == "0" ]]; then - # This assumes the script is executed from the root of the repo directory - # ./build.sh libcudf --allgpuarch --cmake-args=\"-DCMAKE_INSTALL_LIBDIR=lib\" --ptds - ./build.sh libcudf --cmake-args=\"-DCMAKE_INSTALL_LIBDIR=lib\" --ptds -else - # ./build.sh libcudf --allgpuarch --cmake-args=\"-DCMAKE_INSTALL_LIBDIR=lib\" --ptds - ./build.sh libcudf --cmake-args=\"-DCMAKE_INSTALL_LIBDIR=lib\" --ptds -fi diff --git a/ci/conda/recipes/libcudf/conda_build_config.yaml b/ci/conda/recipes/libcudf/conda_build_config.yaml deleted file mode 100644 index f28b24fee7..0000000000 --- a/ci/conda/recipes/libcudf/conda_build_config.yaml +++ /dev/null @@ -1,26 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -c_compiler_version: - - 9.4 - -cxx_compiler_version: - - 9.4 - -cuda_compiler: - - nvcc - -cuda_compiler_version: - - 11.4 diff --git a/ci/conda/recipes/libcudf/meta.yaml b/ci/conda/recipes/libcudf/meta.yaml deleted file mode 100644 index a989ee0c9d..0000000000 --- a/ci/conda/recipes/libcudf/meta.yaml +++ /dev/null @@ -1,82 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -{% set version = "21.10.01" %} -{% set minor_version = version.split('.')[0] + '.' + version.split('.')[1] %} -{% set cuda_version='.'.join(environ.get('CUDA', '11.4').split('.')[:2]) %} -{% set build_num = 0 %} - -package: - name: libcudf - version: {{ version }} - -source: - url: https://github.com/rapidsai/cudf/archive/v{{ version }}.tar.gz - sha256: c3a5d5cae921496ef5800ab8b3580e4dbaab88115c4527d1bcddc06e9c4c43a3 - patches: - # Fix the cmake export to include a version file - - 001-external-table.patch - -build: - number: {{ build_num }} - string: cuda_{{ cuda_version }}_h{{ PKG_HASH }}_{{ build_num }}_morpheus - script_env: - - PARALLEL_LEVEL - - VERSION_SUFFIX - - PROJECT_FLASH - - CCACHE_DIR - - CCACHE_NOHASHDIR - - CCACHE_COMPILERCHECK - - CMAKE_GENERATOR - - CMAKE_C_COMPILER_LAUNCHER - - CMAKE_CXX_COMPILER_LAUNCHER - - CMAKE_CUDA_COMPILER_LAUNCHER - run_exports: - - {{ pin_subpackage("libcudf", max_pin="x.x") }} *_morpheus - missing_dso_whitelist: - - '*/libcuda.*' # [linux] - -requirements: - build: - - {{ compiler("c") }} - - {{ compiler("cxx") }} - - {{ compiler("cuda") }} - - cmake>=3.22 - - ccache - - ninja - host: - - librmm {{ minor_version }}.* - - cudatoolkit {{ cuda_version }}.* - - arrow-cpp 5.0.0 *cuda - - arrow-cpp-proc * cuda - - dlpack>=0.5,<0.6.0a0 - - gtest - - gmock - run: - - {{ pin_compatible('cudatoolkit', max_pin='x.x') }} - - arrow-cpp * *cuda - - arrow-cpp-proc * cuda - - {{ pin_compatible('dlpack', max_pin='x.x') }} - -test: - commands: - - test -f $PREFIX/lib/libcudf.so - -about: - home: http://rapids.ai/ - license: Apache-2.0 - license_family: Apache - license_file: LICENSE - summary: cuDF GPU DataFrame core library diff --git a/ci/conda/recipes/morpheus/conda_build_config.yaml b/ci/conda/recipes/morpheus/conda_build_config.yaml index 329552e87c..b87e8b77f5 100644 --- a/ci/conda/recipes/morpheus/conda_build_config.yaml +++ b/ci/conda/recipes/morpheus/conda_build_config.yaml @@ -23,7 +23,7 @@ cuda_compiler: - nvcc cuda_compiler_version: - - 11.4 + - 11.5 python: - 3.8 @@ -33,4 +33,4 @@ boost: - 1.74 rapids_version: - - 21.10 + - 22.04 diff --git a/ci/conda/recipes/morpheus/meta.yaml b/ci/conda/recipes/morpheus/meta.yaml index e0118df451..f9882db910 100644 --- a/ci/conda/recipes/morpheus/meta.yaml +++ b/ci/conda/recipes/morpheus/meta.yaml @@ -16,9 +16,9 @@ {% set version = environ.get('GIT_VERSION', '0.0.0.dev').lstrip('v') + environ.get('VERSION_SUFFIX', '') %} {% set minor_version = version.split('.')[0] + '.' + version.split('.')[1] %} {% set py_version=environ.get('CONDA_PY', '3.8') %} -{% set cuda_version='.'.join(environ.get('CUDA', '11.4').split('.')[:2]) %} +{% set cuda_version='.'.join(environ.get('CUDA', '11.5').split('.')[:2]) %} {% set cuda_major=cuda_version.split('.')[0] %} -{% set rapids_version = "21.10" %} +{% set rapids_version = "22.04" %} package: name: morpheus-split @@ -40,7 +40,7 @@ outputs: - ccache - cmake=3.22 - cudatoolkit {{ cuda_version }}.* - - cudf {{ rapids_version }} *morpheus + - cudf {{ rapids_version }} - cython >=0.29,<0.30 - librdkafka=1.6.1 - neo {{ minor_version }}.* @@ -86,7 +86,7 @@ outputs: - ninja host: - cudatoolkit {{ cuda_version }}.* - - cudf {{ rapids_version }} *morpheus + - cudf {{ rapids_version }} - cython >=0.29,<0.30 - librdkafka=1.6.1 - neo {{ minor_version }} diff --git a/ci/conda/recipes/run_conda_build.sh b/ci/conda/recipes/run_conda_build.sh index 16e48af16a..ddc9ddbb2b 100755 --- a/ci/conda/recipes/run_conda_build.sh +++ b/ci/conda/recipes/run_conda_build.sh @@ -127,20 +127,6 @@ if hasArg libneo; then popd fi -if hasArg libcudf; then - echo "Running conda-build for libcudf..." - set -x - conda ${CONDA_COMMAND} "${CONDA_ARGS_ARRAY[@]}" ${CONDA_ARGS} ci/conda/recipes/libcudf - set +x -fi - -if hasArg cudf; then - echo "Running conda-build for cudf..." - set -x - conda ${CONDA_COMMAND} "${CONDA_ARGS_ARRAY[@]}" ${CONDA_ARGS} ci/conda/recipes/cudf - set +x -fi - if hasArg morpheus; then # Set GIT_VERSION to set the project version inside of meta.yaml # Do this after neo in case they are different diff --git a/ci/scripts/jenkins/build.sh b/ci/scripts/jenkins/build.sh index c8a4dabadf..eb9df4c0ef 100755 --- a/ci/scripts/jenkins/build.sh +++ b/ci/scripts/jenkins/build.sh @@ -37,44 +37,7 @@ g++ --version show_conda_info -gpuci_logger "Checking S3 cuDF cache" -CUDF_CONDA_BLD_DIR=/opt/conda/conda-bld -CUDF_CONDA_COMMIT=$(git log -n 1 --pretty=format:%H -- ci/conda) -CUDF_CONDA_CACHE_PATH="/cudf/${CUDA_VER}/${PYTHON_VER}/${RAPIDS_VER}/${CUDF_CONDA_COMMIT}/${NVARCH}/cudf_conda.tar.bz" -CUDF_CONDA_CACHE_URL="${S3_URL}${CUDF_CONDA_CACHE_PATH}" -CUDF_CONDA_TAR="${WORKSPACE_TMP}/cudf_conda.tar.bz" - -gpuci_logger "Checking ${DISPLAY_URL}${CUDF_CONDA_CACHE_PATH}" -set +e -fetch_s3 "${CUDF_CONDA_CACHE_PATH}" "${CUDF_CONDA_TAR}" -set -e - -if [[ "${FETCH_STATUS}" != "0" ]]; then - gpuci_logger "Cache miss, Building cuDF" - mkdir -p ${CUDF_CONDA_BLD_DIR} - # The --no-build-id bit is needed for sccache - CONDA_ARGS="--no-build-id --output-folder ${CUDF_CONDA_BLD_DIR} --skip-existing --no-test" ${MORPHEUS_ROOT}/ci/conda/recipes/run_conda_build.sh libcudf cudf - - gpuci_logger "sccache usage for cudf build:" - sccache --show-stats - sccache --zero-stats 2>&1 > /dev/null - - gpuci_logger "Archiving cuDF build" - cd $(dirname ${CUDF_CONDA_BLD_DIR}) - tar cfj ${CUDF_CONDA_TAR} $(basename ${CUDF_CONDA_BLD_DIR}) - cd - - aws s3 cp --no-progress ${CUDF_CONDA_TAR} ${CUDF_CONDA_CACHE_URL} -else - gpuci_logger "Cache hit, using cached cuDF" - cd $(dirname ${CUDF_CONDA_BLD_DIR}) - tar xf ${CUDF_CONDA_TAR} - cd - -fi - -gpuci_logger "Installing cuDF" -mamba install -q -y -c local -c nvidia -c rapidsai -c conda-forge libcudf cudf - -gpuci_logger "Installing other dependencies" +gpuci_logger "Installing dependencies" mamba env update -q -n morpheus -f ${MORPHEUS_ROOT}/docker/conda/environments/cuda${CUDA_VER}_dev.yml conda deactivate && conda activate morpheus diff --git a/cmake/import-rapids-cmake.cmake b/cmake/import-rapids-cmake.cmake index 8a9f880c19..78f7eb81a8 100644 --- a/cmake/import-rapids-cmake.cmake +++ b/cmake/import-rapids-cmake.cmake @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,22 +14,21 @@ # limitations under the License. -# 21.10 is currently required because we pull in private cuDF functionality that has changed in 21.12+ -set(RAPIDS_VERSION "21.10" CACHE STRING "Global default version for all Rapids project dependencies") -# RAPIDS_CMAKE 21.12 is required for libcudacxx.cmake -set(RAPIDS_CMAKE_VERSION "21.12" CACHE STRING "Version of rapids-cmake to use") +set(RAPIDS_VERSION "22.04" CACHE STRING "Global default version for all Rapids project dependencies") +set(RAPIDS_CMAKE_VERSION "${RAPIDS_VERSION}" CACHE STRING "Version of rapids-cmake to use") # Download and load the repo according to the rapids-cmake instructions if it does not exist -if(NOT EXISTS ${CMAKE_BINARY_DIR}/RAPIDS.cmake) +# NOTE: Use a different file than RAPIDS.cmake because MatX will just override it: https://github.com/NVIDIA/MatX/pull/192 +if(NOT EXISTS ${CMAKE_BINARY_DIR}/RAPIDS_CMAKE.cmake) message(STATUS "Downloading RAPIDS CMake Version: ${RAPIDS_CMAKE_VERSION}") file( DOWNLOAD https://raw.githubusercontent.com/rapidsai/rapids-cmake/branch-${RAPIDS_CMAKE_VERSION}/RAPIDS.cmake - ${CMAKE_BINARY_DIR}/RAPIDS.cmake + ${CMAKE_BINARY_DIR}/RAPIDS_CMAKE.cmake ) endif() # Now load the file -include(${CMAKE_BINARY_DIR}/RAPIDS.cmake) +include(${CMAKE_BINARY_DIR}/RAPIDS_CMAKE.cmake) # Load Rapids Cmake packages include(rapids-cmake) diff --git a/docker/Dockerfile b/docker/Dockerfile index 2c813572c9..f0de02c918 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -18,7 +18,7 @@ # Args used in FROM commands must come first ARG FROM_IMAGE="gpuci/miniforge-cuda" -ARG CUDA_VER=11.4 +ARG CUDA_VER=11.5 ARG LINUX_DISTRO=ubuntu ARG LINUX_VER=20.04 @@ -29,7 +29,7 @@ FROM ${FROM_IMAGE}:${CUDA_VER}-devel-${LINUX_DISTRO}${LINUX_VER} AS base # Required arguments ARG IMAGE_TYPE=base ARG RAPIDS_CHANNEL=rapidsai-nightly -ARG RAPIDS_VER=21.10 +ARG RAPIDS_VER=22.04 ARG PYTHON_VER=3.8 ARG CONDA_CHANNEL=rapidsai @@ -63,32 +63,12 @@ RUN conda config --set ssl_verify false &&\ /opt/conda/bin/conda install -y -n base -c conda-forge "mamba >=0.22" "boa >=0.10" python=${PYTHON_VER} # conda clean -afy -# ============ Stage: conda_bld_deps ============ -# Now build the conda dependency packages -FROM base as conda_bld_deps - -ARG CONDA_CHANNEL_ALIAS - -# COPY the files necessary to build the cudf package. Dont copy more otherwise the cache will get invalided often -COPY ci/conda/recipes/cudf/ ./ci/conda/recipes/cudf/ -COPY ci/conda/recipes/libcudf/ ./ci/conda/recipes/libcudf/ -COPY ci/conda/recipes/run_conda_build.sh ./ci/conda/recipes/run_conda_build.sh - -RUN --mount=type=ssh \ - --mount=type=cache,id=workspace_cache,target=/workspace/.cache,sharing=locked \ - --mount=type=cache,id=conda_pkgs,target=/opt/conda/pkgs,sharing=locked \ - source activate base &&\ - # Run with --no-test for now until we can build with builtkit and default nvidia runtime - # Temp add CONDA_CHANNEL_ALIAS to get around conda-build 404 errors - MORPHEUS_ROOT=/workspace CONDA_BLD_PATH=/opt/conda/conda-bld CONDA_ARGS="--no-test" ./ci/conda/recipes/run_conda_build.sh libcudf cudf - # ============ Stage: conda_env ============ # Create the conda environment and install all dependencies FROM base as conda_env # Create a base environment -RUN --mount=type=bind,from=conda_bld_deps,source=/opt/conda/conda-bld,target=/opt/conda/conda-bld \ - --mount=type=cache,id=conda_pkgs,target=/opt/conda/pkgs,sharing=locked \ +RUN --mount=type=cache,id=conda_pkgs,target=/opt/conda/pkgs,sharing=locked \ # Create the environment and install as little dependencies as possible CONDA_ALWAYS_YES=true /opt/conda/bin/mamba create -n morpheus -c conda-forge python=${PYTHON_VER} &&\ # Clean and activate @@ -115,12 +95,11 @@ FROM conda_env as conda_env_dev ARG CONDA_CHANNEL_ALIAS # Copy the development dependencies file -COPY docker/conda/environments/requirements.txt ./docker/conda/environments/ COPY docker/conda/environments/cuda${CUDA_VER}_dev.yml ./docker/conda/environments/ +COPY docker/conda/environments/requirements.txt ./docker/conda/environments/ # Update the morpheus environment -RUN --mount=type=bind,from=conda_bld_deps,source=/opt/conda/conda-bld,target=/opt/conda/conda-bld \ - --mount=type=cache,id=conda_pkgs,target=/opt/conda/pkgs,sharing=locked \ +RUN --mount=type=cache,id=conda_pkgs,target=/opt/conda/pkgs,sharing=locked \ # Temp add channel_alias to get around conda 404 errors conda config --env --set channel_alias ${CONDA_CHANNEL_ALIAS:-"https://conda.anaconda.org"} &&\ /opt/conda/bin/mamba env update -n morpheus --file docker/conda/environments/cuda${CUDA_VER}_dev.yml &&\ @@ -131,15 +110,14 @@ RUN --mount=type=bind,from=conda_bld_deps,source=/opt/conda/conda-bld,target=/op # ============ Stage: conda_bld_morpheus ============ # Now build the morpheus conda package -FROM conda_bld_deps as conda_bld_morpheus +FROM base as conda_bld_morpheus ARG CONDA_CHANNEL_ALIAS # Copy the source COPY . ./ -RUN --mount=type=ssh \ - --mount=type=cache,id=workspace_cache,target=/workspace/.cache,sharing=locked \ +RUN --mount=type=cache,id=workspace_cache,target=/workspace/.cache,sharing=locked \ --mount=type=cache,id=conda_pkgs,target=/opt/conda/pkgs,sharing=locked \ source activate base &&\ # Temp add CONDA_CHANNEL_ALIAS to get around conda-build 404 errors diff --git a/docker/build_container.sh b/docker/build_container.sh index da7fc0e946..d80483718e 100755 --- a/docker/build_container.sh +++ b/docker/build_container.sh @@ -23,10 +23,10 @@ DOCKER_EXTRA_ARGS=${DOCKER_EXTRA_ARGS:-""} # Build args FROM_IMAGE=${FROM_IMAGE:-"gpuci/miniforge-cuda"} -CUDA_VER=${CUDA_VER:-11.4} +CUDA_VER=${CUDA_VER:-11.5} LINUX_DISTRO=${LINUX_DISTRO:-ubuntu} LINUX_VER=${LINUX_VER:-20.04} -RAPIDS_VER=${RAPIDS_VER:-21.10} +RAPIDS_VER=${RAPIDS_VER:-22.04} PYTHON_VER=${PYTHON_VER:-3.8} TENSORRT_VERSION=${TENSORRT_VERSION:-8.2.1.3} @@ -41,11 +41,6 @@ DOCKER_ARGS="${DOCKER_ARGS} --build-arg PYTHON_VER=${PYTHON_VER}" DOCKER_ARGS="${DOCKER_ARGS} --build-arg TENSORRT_VERSION=${TENSORRT_VERSION}" DOCKER_ARGS="${DOCKER_ARGS} --network=host" -if [[ "${DOCKER_BUILDKIT}" = "1" ]]; then - # If using BUILDKIT, add the necessary args to pull private containers - DOCKER_ARGS="${DOCKER_ARGS} --ssh default --load" -fi - # Last add any extra args (duplicates override earlier ones) DOCKER_ARGS="${DOCKER_ARGS} ${DOCKER_EXTRA_ARGS}" diff --git a/docker/conda/environments/cuda11.4_ci.yml b/docker/conda/environments/cuda11.5_ci.yml similarity index 90% rename from docker/conda/environments/cuda11.4_ci.yml rename to docker/conda/environments/cuda11.5_ci.yml index 2700ab0cb8..4d33145954 100644 --- a/docker/conda/environments/cuda11.4_ci.yml +++ b/docker/conda/environments/cuda11.5_ci.yml @@ -18,6 +18,7 @@ name: morpheus channels: - conda-forge dependencies: + - bash=5.1.16 # bash >=4.4 is necessary for morpheus cli auto-complete tests to pass. - conda-pack=0.7 - pkg-config=0.29 - sccache=0.3 diff --git a/docker/conda/environments/cuda11.4_dev.yml b/docker/conda/environments/cuda11.5_dev.yml similarity index 90% rename from docker/conda/environments/cuda11.4_dev.yml rename to docker/conda/environments/cuda11.5_dev.yml index 1000407d8e..be4135b26d 100644 --- a/docker/conda/environments/cuda11.4_dev.yml +++ b/docker/conda/environments/cuda11.5_dev.yml @@ -15,10 +15,10 @@ name: morpheus channels: - - local - rapidsai - nvidia - nvidia/label/dev # For pre-releases of Neo. Should still default to full releases if available + - nvidia/label/cuda-11.5.2 # For cuda-nvml-dev=11.5, which is not published under nvidia channel yet. - conda-forge dependencies: ####### Morpheus Dependencies (keep sorted!) ####### @@ -28,11 +28,11 @@ dependencies: - cachetools=5.0.0 - ccache>=3.7 - cmake=3.22 - - cuda-nvml-dev=11.4 - - cudatoolkit=11.4 - - cudf 21.10.* *morpheus - - cudf_kafka 21.10.* - - cupy=9.3.0 + - cuda-nvml-dev=11.5 + - cudatoolkit=11.5 + - cudf 22.04 + - cudf_kafka 22.04.* + - cupy=9.5.0 - cython=0.29.24 - docker-compose=1.29.2 - docker-py=5.0.3 diff --git a/docker/conda/environments/cuda11.4_runtime.yml b/docker/conda/environments/cuda11.5_runtime.yml similarity index 100% rename from docker/conda/environments/cuda11.4_runtime.yml rename to docker/conda/environments/cuda11.5_runtime.yml diff --git a/examples/abp_pcap_detection/abp_pcap_preprocessing.py b/examples/abp_pcap_detection/abp_pcap_preprocessing.py index 19458642a3..7ffee619aa 100644 --- a/examples/abp_pcap_detection/abp_pcap_preprocessing.py +++ b/examples/abp_pcap_detection/abp_pcap_preprocessing.py @@ -151,7 +151,7 @@ def round_time_kernel(timestamp, rollup_time, secs): del df, grouped_df # Convert the dataframe to cupy the same way cuml does - data = cp.asarray(merged_df[fea_cols].as_gpu_matrix(order="C")) + data = cp.asarray(merged_df[fea_cols].to_cupy()) count = data.shape[0] # columns required to be added to input message meta diff --git a/morpheus/_lib/cudf_helpers.pyx b/morpheus/_lib/cudf_helpers.pyx index 5409d2a486..2273b91d61 100644 --- a/morpheus/_lib/cudf_helpers.pyx +++ b/morpheus/_lib/cudf_helpers.pyx @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,156 +13,100 @@ # See the License for the specific language governing permissions and # limitations under the License. -from cudf import DataFrame, Series +from cudf import DataFrame +from cudf import Series +from libcpp.memory cimport make_shared +from libcpp.memory cimport make_unique +from libcpp.memory cimport shared_ptr +from libcpp.memory cimport unique_ptr from libcpp.string cimport string -from libcpp.vector cimport vector from libcpp.utility cimport move -from libcpp.memory cimport make_shared, make_unique, shared_ptr, unique_ptr +from libcpp.vector cimport vector from cudf._lib.column cimport Column from cudf._lib.cpp.column.column_view cimport column_view +from cudf._lib.cpp.io.types cimport table_metadata +from cudf._lib.cpp.io.types cimport table_with_metadata from cudf._lib.cpp.table.table_view cimport table_view -from cudf._lib.cpp.table.table cimport table -from cudf._lib.table cimport Table, table_view_from_table -from cudf._lib.cpp.io.types cimport table_with_metadata, table_metadata -from cudf._lib.utils cimport data_from_table_view, data_from_unique_ptr +from cudf._lib.utils cimport data_from_table_view +from cudf._lib.utils cimport data_from_unique_ptr +from cudf._lib.utils cimport get_column_names +from cudf._lib.utils cimport table_view_from_table + cdef extern from "morpheus/objects/table_info.hpp" namespace "morpheus" nogil: - cdef cppclass IDataTable: - IDataTable() + cdef cppclass IDataTable: + IDataTable() - cdef cppclass TableInfo: - TableInfo() - TableInfo(shared_ptr[const IDataTable] parent, table_view view, vector[string] index_names, vector[string] column_names) + cdef cppclass TableInfo: + TableInfo() + TableInfo(shared_ptr[const IDataTable] parent, + table_view view, + vector[string] index_names, + vector[string] column_names) - table_view get_view() const - vector[string] get_index_names() - vector[string] get_column_names() const + table_view get_view() const + vector[string] get_index_names() + vector[string] get_column_names() const - int num_indices() const - int num_columns() const - int num_rows() const + int num_indices() const + int num_columns() const + int num_rows() const cdef public api: - Column make_column_from_view(column_view view): - return Column.from_column_view(view, None) - - column_view make_view_from_column(Column col): - return col.view() - - # Table make_table_from_datatable(shared_ptr[IDataTable] table, object owner): - - # index_names = [x.decode() for x in table.get()[0].index_names] - # column_names = [x.decode() for x in table.get()[0].column_names] - - # if (len(index_names) == 0): - # index_names = None - - # data, index = data_from_table_view(table.get()[0].get_view(), owner, column_names=column_names, index_names=index_names) - - # return DataFrame._from_data(data, index) - - Table make_table_from_table_with_metadata(table_with_metadata table, int index_col_count): - - index_names = None - - if (index_col_count > 0): - index_names = [x.decode() for x in table.metadata.column_names[0:index_col_count]] - - column_names = [x.decode() for x in table.metadata.column_names[index_col_count:]] - - data, index = data_from_unique_ptr(move(table.tbl), column_names=column_names, index_names=index_names) - - return DataFrame._from_data(data, index) - - Table make_table_from_table_info(TableInfo info, object owner): - - i_names = info.get_index_names() - c_names = info.get_column_names() - - index_names = [x.decode() for x in i_names] - column_names = [x.decode() for x in c_names] - - data, index = data_from_table_view(info.get_view(), owner, column_names=column_names, index_names=index_names) - - return DataFrame._from_data(data, index) - - # Table make_series_from_table_info(TableInfo info, object owner): - - # i_names = info.get_index_names() - # c_names = info.get_column_names() - - # index_names = [x.decode() for x in i_names] - # column_names = [x.decode() for x in c_names] + object make_table_from_table_with_metadata(table_with_metadata table, int index_col_count): - # name = column_names[0] + index_names = None - # data, index = data_from_table_view(info.get_view(), owner, column_names=column_names, index_names=index_names) + if (index_col_count > 0): + index_names = [x.decode() for x in table.metadata.column_names[0:index_col_count]] - # return Series._from_data(data, index, name) + column_names = [x.decode() for x in table.metadata.column_names[index_col_count:]] - # Table make_table_from_view_and_meta(table_view view, table_metadata meta): + data, index = data_from_unique_ptr(move(table.tbl), column_names=column_names, index_names=index_names) - # column_names = [x.decode() for x in meta.column_names] + return DataFrame._from_data(data, index) - # data, index = data_from_table_view(view, None, column_names=column_names) + object make_table_from_table_info(TableInfo info, object owner): - # return DataFrame._from_data(data, index) + i_names = info.get_index_names() + c_names = info.get_column_names() - # TableInfo make_table_info_from_table(Table table): + index_names = [x.decode() for x in i_names] + column_names = [x.decode() for x in c_names] - # cdef table_view input_table_view = table_view_from_table( - # table - # ) - # cdef table_metadata metadata_ = table_metadata() + data, index = data_from_table_view(info.get_view(), owner, column_names=column_names, index_names=index_names) - # all_names = (table._index_names if table._num_indices > 0 else []) + table._column_names + return DataFrame._from_data(data, index) - # if len(all_names) > 0: - # metadata_.column_names.reserve(len(all_names)) - # if len(all_names) == 1: - # if all_names[0] in (None, ''): - # metadata_.column_names.push_back('""'.encode()) - # else: - # metadata_.column_names.push_back( - # str(all_names[0]).encode() - # ) - # else: - # for idx, col_name in enumerate(all_names): - # if col_name is None: - # metadata_.column_names.push_back(''.encode()) - # else: - # metadata_.column_names.push_back( - # str(col_name).encode() - # ) - # return TableInfo(input_table_view, metadata_, table._num_indices) + TableInfo make_table_info_from_table(object table, shared_ptr[const IDataTable] parent): - TableInfo make_table_info_from_table(Table table, shared_ptr[const IDataTable] parent): + cdef vector[string] temp_col_names = get_column_names(table, True) - cdef table_view input_table_view = table_view_from_table(table, ignore_index=False) - cdef vector[string] index_names - cdef vector[string] column_names + cdef table_view input_table_view = table_view_from_table(table, ignore_index=False) + cdef vector[string] index_names + cdef vector[string] column_names - # cuDF does a weird check where if there is only one name in both index and columns, and that column is empty or - # None, then change it to '""'. Not sure what this is used for - check_empty_name = (table._num_indices + table._num_columns) == 1 + # cuDF does a weird check where if there is only one name in both index and columns, and that column is empty or + # None, then change it to '""'. Not sure what this is used for + check_empty_name = get_column_names(table, True).size() == 1 - for name in table._index_names: - if (check_empty_name and name in (None, '')): - name = '""' - elif (name is None): - name = "" + for name in table._index.names: + if (check_empty_name and name in (None, '')): + name = '""' + elif (name is None): + name = "" - index_names.push_back(name.encode()) + index_names.push_back(str.encode(name)) - for name in table._column_names: - if (check_empty_name and name in (None, '')): - name = '""' - elif (name is None): - name = "" + for name in table._column_names: + if (check_empty_name and name in (None, '')): + name = '""' + elif (name is None): + name = "" - column_names.push_back(name.encode()) + column_names.push_back(str.encode(name)) - return TableInfo(parent, input_table_view, index_names, column_names) + return TableInfo(parent, input_table_view, index_names, column_names) diff --git a/morpheus/_lib/include/nvtext/subword_tokenize.hpp b/morpheus/_lib/include/nvtext/subword_tokenize.hpp new file mode 100644 index 0000000000..9d75295cd3 --- /dev/null +++ b/morpheus/_lib/include/nvtext/subword_tokenize.hpp @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2020-2022, NVIDIA CORPORATION. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once + +#include +#include +#include + +namespace nvtext { + +/** + * @addtogroup nvtext_tokenize + * @{ + * @file + */ + +/** + * @brief The vocabulary data for use with the subword_tokenize function. + */ +struct hashed_vocabulary { + uint16_t first_token_id{}; + uint16_t separator_token_id{}; + uint16_t unknown_token_id{}; + uint32_t outer_hash_a{}; + uint32_t outer_hash_b{}; + uint16_t num_bins{}; + std::unique_ptr table; // uint64 + std::unique_ptr bin_coefficients; // uint64 + std::unique_ptr bin_offsets; // uint16 + std::unique_ptr cp_metadata; // uint32 + std::unique_ptr aux_cp_table; // uint64 +}; + +/** + * @brief Load the hashed vocabulary file into device memory. + * + * The object here can be used to call the subword_tokenize without + * incurring the cost of loading the same file each time. + * + * @throw cudf::logic_error if the `filename_hashed_vocabulary` could not be opened. + * + * @param filename_hashed_vocabulary A path to the preprocessed vocab.txt file. + * Note that this is the file AFTER python/perfect_hash.py has been used + * for preprocessing. + * @param mr Memory resource to allocate any returned objects. + * @return vocabulary hash-table elements + */ +std::unique_ptr load_vocabulary_file( + std::string const& filename_hashed_vocabulary, + rmm::mr::device_memory_resource* mr = rmm::mr::get_current_device_resource()); + +/** + * @brief Result object for the subword_tokenize functions. + */ +struct tokenizer_result { + /** + * @brief The number of rows for the output token-ids. + */ + uint32_t nrows_tensor{}; + /** + * @brief The number of token-ids in each row. + */ + uint32_t sequence_length{}; + /** + * @brief A vector of token-ids for each row. + * + * The data is a flat matrix (nrows_tensor x sequence_length) of token-ids. + * This column is of type UINT32 with no null entries. + */ + std::unique_ptr tensor_token_ids; + /** + * @brief This mask identifies which tensor-token-ids are valid. + * + * This column is of type UINT32 with no null entries. + */ + std::unique_ptr tensor_attention_mask; + /** + * @brief The metadata for each tensor row. + * + * There are three elements per tensor row [row-id, start_pos, stop_pos]) + * This column is of type UINT32 with no null entries. + */ + std::unique_ptr tensor_metadata; +}; + +/** + * @brief Creates a tokenizer that cleans the text, splits it into tokens and + * returns token-ids from an input vocabulary. + * + * The strings are first normalized by converting to lower-case, removing + * punctuation, replacing a select set of multi-byte characters and + * whitespace characters. + * + * The strings are then tokenized by using whitespace as a delimiter. + * Consecutive delimiters are ignored. Each token is then assigned + * a 4-byte token-id mapped from the provided vocabulary table. + * + * Essentially each string is converted into one or more vectors of token-ids + * in the output column. The total number of these vectors times `max_sequence_length` + * is the size of the `tensor_token_ids` output column. For `do_truncate==true`: + * ``` + * size of tensor_token_ids = max_sequence_length * strings.size() + * size of tensor_attention_mask = max_sequence_length * strings.size() + * size of tensor_metadata = 3 * strings.size() + * ``` + * + * For `do_truncate==false` the number of rows per output string depends on the + * number of tokens resolved and the `stride` value which may repeat tokens + * in subsequent overflow rows. + * + * This function requires about 21x the number of character bytes in the input + * strings column as working memory. + * + * @throw cudf::logic_error if `stride > max_sequence_length` + * @throw cudf::logic_error if `max_sequence_length * max_rows_tensor` is + * larger than the max value for cudf::size_type + * + * @param strings The input strings to tokenize. + * @param vocabulary_table The vocabulary table pre-loaded into this object. + * @param max_sequence_length Limit of the number of token-ids per row in final tensor + * for each string. + * @param stride Each row in the output token-ids will replicate `max_sequence_length - stride` + * the token-ids from the previous row, unless it is the first string. + * @param do_lower_case If true, the tokenizer will convert uppercase characters in the + * input stream to lower-case and strip accents from those characters. + * If false, accented and uppercase characters are not transformed. + * @param do_truncate If true, the tokenizer will discard all the token-ids after + * `max_sequence_length` for each input string. If false, it will use a new row + * in the output token-ids to continue generating the output. + * @param max_rows_tensor Maximum number of rows for the output token-ids expected + * to be generated by the tokenizer. + * Used for allocating temporary working memory on the GPU device. + * If the output generates a larger number of rows, behavior is undefined. + * @param mr Memory resource to allocate any returned objects. + * @return token-ids, attention-mask, and metadata + */ +tokenizer_result subword_tokenize( + cudf::strings_column_view const& strings, + hashed_vocabulary const& vocabulary_table, + uint32_t max_sequence_length, + uint32_t stride, + bool do_lower_case, + bool do_truncate, + uint32_t max_rows_tensor, + rmm::mr::device_memory_resource* mr = rmm::mr::get_current_device_resource()); + +/** @} */ // end of group +} // namespace nvtext diff --git a/morpheus/_lib/src/utilities/cudf_util.cpp b/morpheus/_lib/src/utilities/cudf_util.cpp index f391a982fe..51c2126aab 100644 --- a/morpheus/_lib/src/utilities/cudf_util.cpp +++ b/morpheus/_lib/src/utilities/cudf_util.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -51,5 +51,5 @@ pybind11::object morpheus::proxy_table_from_table_with_metadata(cudf::io::table_ morpheus::TableInfo morpheus::proxy_table_info_from_table(pybind11::object table, std::shared_ptr idata_table) { - return make_table_info_from_table((struct PyTable *)table.ptr(), idata_table); + return make_table_info_from_table(table.ptr(), idata_table); } diff --git a/morpheus/stages/preprocess/preprocess_fil_stage.py b/morpheus/stages/preprocess/preprocess_fil_stage.py index edf4aa3f38..2070ff8f54 100644 --- a/morpheus/stages/preprocess/preprocess_fil_stage.py +++ b/morpheus/stages/preprocess/preprocess_fil_stage.py @@ -102,7 +102,7 @@ def pre_process_batch(x: MultiMessage, fea_len: int, fea_cols: typing.List[str]) df = cudf.from_pandas(df) # Convert the dataframe to cupy the same way cuml does - data = cp.asarray(df.as_gpu_matrix(order='C')) + data = cp.asarray(df.to_cupy()) count = data.shape[0] diff --git a/pyproject.toml b/pyproject.toml index 9003f95ac6..2db9767292 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,3 +24,9 @@ filterwarnings = [ ] addopts = "--benchmark-disable" + +[tool.yapfignore] +ignore_patterns = [ + "**/*.pyx", + "**/*.pxd" +] \ No newline at end of file From 075c5baf8a3fd669b6cbf7c151bae37e3921b51c Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Tue, 14 Jun 2022 17:23:29 -0500 Subject: [PATCH 41/73] remove ssh instructions from CONTRIBUTING guide (#162) Closes #101 Authors: - Christopher Harris (https://github.com/cwharris) Approvers: - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/162 --- CONTRIBUTING.md | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d456263525..0dd4c192e0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -197,28 +197,13 @@ Note: These instructions assume the user is using `mamba` instead of `conda` sin git clone https://github.com/NVIDIA/Morpheus.git $MORPHEUS_ROOT cd $MORPHEUS_ROOT ``` -1. Create a new Conda environment +1. Create the morpheus Conda environment ```bash - mamba create -n morpheus python=${PYTHON_VER} + mamba env create -f ./docker/conda/environments/cuda${CUDA_VER}_dev.yml conda activate morpheus ``` This creates a new environment named `morpheus`, and activates that environment. -1. Set up `ssh-agent` to allow container to pull from private repos - ```bash - eval `ssh-agent -s` - ssh-add - ``` -1. Build and install cuDF conda package - ```bash - ./docker/build_conda_packages.sh libcudf cudf - mamba install -c file:///${MORPHEUS_ROOT}/.conda-bld -c nvidia -c rapidsai -c conda-forge libcudf cudf - ``` - This will checkout, patch, build and install cuDF with the necessary fixes to allow Morpheus to work smoothly with cuDF DataFrames in C++. -1. Install remaining Morpheus dependencies - ```bash - mamba env update -n morpheus -f ./docker/conda/environments/cuda${CUDA_VER}_dev.yml - ``` 1. Build Morpheus ```bash ./scripts/compile.sh From fa67e6da309c67335b4ad08acf9d4011571d3b3d Mon Sep 17 00:00:00 2001 From: Pete MacKinnon Date: Tue, 14 Jun 2022 18:44:56 -0400 Subject: [PATCH 42/73] Update mlflow-env.yml (#146) Remove unused `onnxruntime` dep Authors: - Pete MacKinnon (https://github.com/pdmack) Approvers: - Eli Fajardo (https://github.com/efajardo-nv) - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/146 --- models/mlflow/docker/conda/mlflow-env.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/models/mlflow/docker/conda/mlflow-env.yml b/models/mlflow/docker/conda/mlflow-env.yml index 9b06584b19..dac79581a2 100644 --- a/models/mlflow/docker/conda/mlflow-env.yml +++ b/models/mlflow/docker/conda/mlflow-env.yml @@ -8,6 +8,5 @@ dependencies: - onnx - openssl>=1.1.1o - pip: - - onnxruntime - mlflow From b4023b5541a6b25cd8c85ac78f56623caeadb29b Mon Sep 17 00:00:00 2001 From: Pete MacKinnon Date: Wed, 15 Jun 2022 12:38:36 -0400 Subject: [PATCH 43/73] Dockerfile COPY section needs update (#141) data dir is now underneath ./morpheus Relates to #62 Authors: - Pete MacKinnon (https://github.com/pdmack) Approvers: - Christopher Harris (https://github.com/cwharris) - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/141 --- docker/Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index f0de02c918..acfc85e1d0 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -142,7 +142,6 @@ RUN --mount=type=bind,from=conda_bld_morpheus,source=/opt/conda/conda-bld,target conda clean -afy # Only copy specific files/folders over that are necessary for runtime -COPY "./data" "./data" COPY "./docker" "./docker" COPY "./docs" "./docs" COPY "./examples" "./examples" From 4248ed8ba487e1e592315483c137b459375c8dad Mon Sep 17 00:00:00 2001 From: Pete MacKinnon Date: Wed, 15 Jun 2022 14:11:31 -0400 Subject: [PATCH 44/73] Update cuda11.5_dev.yml (#167) Add missing pkg-config for neo cmake (./scripts/compile.sh) Closes #165 Authors: - Pete MacKinnon (https://github.com/pdmack) Approvers: - Devin Robison (https://github.com/drobison00) URL: https://github.com/nv-morpheus/Morpheus/pull/167 --- docker/conda/environments/cuda11.5_dev.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/conda/environments/cuda11.5_dev.yml b/docker/conda/environments/cuda11.5_dev.yml index be4135b26d..88f578fc48 100644 --- a/docker/conda/environments/cuda11.5_dev.yml +++ b/docker/conda/environments/cuda11.5_dev.yml @@ -55,6 +55,7 @@ dependencies: - nodejs=17.4.0 - pandas=1.3 - pip + - pkg-config # for neo cmake - protobuf=3.19 - pybind11-stubgen - pydot From 849ee2b5105aae9e805e5e21a2a28c05b35f2c9e Mon Sep 17 00:00:00 2001 From: Michael Demoret <42954918+mdemoret-nv@users.noreply.github.com> Date: Wed, 15 Jun 2022 12:28:43 -0600 Subject: [PATCH 45/73] Adding in pybind11-stubgen to the conda package (#163) The docker release build fails because `pybind11-stubgen` is missing from the conda-build requirements. Fixes #140 Authors: - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - Christopher Harris (https://github.com/cwharris) URL: https://github.com/nv-morpheus/Morpheus/pull/163 --- ci/conda/recipes/morpheus/meta.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/conda/recipes/morpheus/meta.yaml b/ci/conda/recipes/morpheus/meta.yaml index f9882db910..74930a6af4 100644 --- a/ci/conda/recipes/morpheus/meta.yaml +++ b/ci/conda/recipes/morpheus/meta.yaml @@ -91,6 +91,7 @@ outputs: - librdkafka=1.6.1 - neo {{ minor_version }} - pip + - pybind11-stubgen - python {{ python }} - rapidjson=1.1 - scikit-build>=0.12 From 83cf138149cb4a63b1ea4416da98e72a4c2d0e80 Mon Sep 17 00:00:00 2001 From: David Gardner <96306125+dagardner-nv@users.noreply.github.com> Date: Fri, 17 Jun 2022 14:27:15 -0700 Subject: [PATCH 46/73] Include C++ Unittests in CI (#135) Adds test_libmorpheus to the wheel component. When installing into build/wheel and `MORPHEUS_PYTHON_INPLACE_BUILD=OFF` set the rpath to the site packages install dir. Even though we aren't installing the test into site-packages we do need it to use the installed libs. The version of `test_libmorpheus.x` in the build dir will use `libmorpheus_utils.so` from the build dir, while the version of `test_libmorpheus.x` installed into `build/wheel` will use `libmorpheus_utils.so` from `${Python3_SITELIB}/morpheus/_lib` which means that the test will fail unless the python package has been installed. Closes #133 Authors: - David Gardner (https://github.com/dagardner-nv) - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/135 --- ci/Jenkinsfile | 4 ++- ci/scripts/jenkins/build.sh | 3 ++- ci/scripts/jenkins/checks.sh | 2 ++ ci/scripts/jenkins/common.sh | 37 ++++++++++++++++----------- ci/scripts/jenkins/docs.sh | 1 + ci/scripts/jenkins/test.sh | 41 +++++++++++++++++++++++++----- morpheus/_lib/tests/CMakeLists.txt | 13 ++++++++++ 7 files changed, 77 insertions(+), 24 deletions(-) diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile index 3f4c4c685a..86c527ce70 100644 --- a/ci/Jenkinsfile +++ b/ci/Jenkinsfile @@ -10,7 +10,6 @@ pipeline { RAPIDS_VER = '22.04' CUDA_VER = '11.5' HOME = "${WORKSPACE}" - GH_TOKEN = credentials('gputester-github-token') BUILD_TYPE = sh(returnStdout: true, script: 'rapids-build-type') } stages { @@ -21,6 +20,9 @@ pipeline { options { timeout(time: 1, unit: 'HOURS') } + environment { + GH_TOKEN = credentials('gputester-github-token') + } when { environment name: 'BUILD_TYPE', value: 'pull-request' } agent { docker { diff --git a/ci/scripts/jenkins/build.sh b/ci/scripts/jenkins/build.sh index eb9df4c0ef..43421c5aaf 100755 --- a/ci/scripts/jenkins/build.sh +++ b/ci/scripts/jenkins/build.sh @@ -68,13 +68,14 @@ sccache --show-stats gpuci_logger "Installing Morpheus" cmake -DCOMPONENT=Wheel -P ${MORPHEUS_ROOT}/build/cmake_install.cmake -pip install ${MORPHEUS_ROOT}/build/wheel gpuci_logger "Archiving results" mamba pack --quiet --force --ignore-missing-files --n-threads ${PARALLEL_LEVEL} -n morpheus -o ${WORKSPACE_TMP}/conda_env.tar.gz +tar cfj "${WORKSPACE_TMP}/wheel.tar.bz" build/wheel gpuci_logger "Pushing results to ${DISPLAY_ARTIFACT_URL}" aws s3 cp --no-progress "${WORKSPACE_TMP}/conda_env.tar.gz" "${ARTIFACT_URL}/conda_env.tar.gz" +aws s3 cp --no-progress "${WORKSPACE_TMP}/wheel.tar.bz" "${ARTIFACT_URL}/wheel.tar.bz" gpuci_logger "Success" exit 0 diff --git a/ci/scripts/jenkins/checks.sh b/ci/scripts/jenkins/checks.sh index 774b4ccb38..47de55ca16 100755 --- a/ci/scripts/jenkins/checks.sh +++ b/ci/scripts/jenkins/checks.sh @@ -18,6 +18,8 @@ set -e source ${WORKSPACE}/ci/scripts/jenkins/common.sh +fetch_base_branch + conda activate rapids gpuci_logger "Installing CI dependencies" diff --git a/ci/scripts/jenkins/common.sh b/ci/scripts/jenkins/common.sh index 80334ed368..07698f6722 100644 --- a/ci/scripts/jenkins/common.sh +++ b/ci/scripts/jenkins/common.sh @@ -30,20 +30,6 @@ gpuci_logger "Retrieving base branch from GitHub API" REPO_NAME=$(basename "${GIT_URL}" .git) ORG_NAME=$(basename "$(dirname "${GIT_URL}")") PR_NUM="${GIT_BRANCH##*/}" -[[ -n "$GH_TOKEN" ]] && CURL_HEADERS=('-H' "Authorization: token ${GH_TOKEN}") -RESP=$( -curl -s \ - -H "Accept: application/vnd.github.v3+json" \ - "${CURL_HEADERS[@]}" \ - "https://api.github.com/repos/${ORG_NAME}/${REPO_NAME}/pulls/${PR_NUM}" -) - -BASE_BRANCH=$(echo "${RESP}" | jq -r '.base.ref') - -# Change target is the branch name we are merging into but due to the weird way jenkins does -# the checkout it isn't recognized by git without the origin/ prefix -export CHANGE_TARGET="origin/${BASE_BRANCH}" -gpuci_logger "Base branch: ${BASE_BRANCH}" # S3 vars export S3_URL="s3://rapids-downloads/ci/morpheus" @@ -64,6 +50,25 @@ export FETCH_STATUS=0 gpuci_logger "Environ:" env | sort +function fetch_base_branch() { + gpuci_logger "Retrieving base branch from GitHub API" + [[ -n "$GH_TOKEN" ]] && CURL_HEADERS=('-H' "Authorization: token ${GH_TOKEN}") + RESP=$( + curl -s \ + -H "Accept: application/vnd.github.v3+json" \ + "${CURL_HEADERS[@]}" \ + "https://api.github.com/repos/${ORG_NAME}/${REPO_NAME}/pulls/${PR_NUM}" + ) + + BASE_BRANCH=$(echo "${RESP}" | jq -r '.base.ref') + + # Change target is the branch name we are merging into but due to the weird way jenkins does + # the checkout it isn't recognized by git without the origin/ prefix + export CHANGE_TARGET="origin/${BASE_BRANCH}" + gpuci_logger "Base branch: ${BASE_BRANCH}" +} + + function fetch_s3() { ENDPOINT=$1 DESTINATION=$2 @@ -80,14 +85,16 @@ function restore_conda_env() { gpuci_logger "Downloading build artifacts from ${DISPLAY_ARTIFACT_URL}" fetch_s3 "${ARTIFACT_ENDPOINT}/conda_env.tar.gz" "${WORKSPACE_TMP}/conda_env.tar.gz" + fetch_s3 "${ARTIFACT_ENDPOINT}/wheel.tar.bz" "${WORKSPACE_TMP}/wheel.tar.bz" gpuci_logger "Extracting" mkdir -p /opt/conda/envs/morpheus # We are using the --no-same-owner flag since user id & group id's are inconsistent between nodes in our CI pool tar xf "${WORKSPACE_TMP}/conda_env.tar.gz" --no-same-owner --directory /opt/conda/envs/morpheus + tar xf "${WORKSPACE_TMP}/wheel.tar.bz" --no-same-owner --directory ${MORPHEUS_ROOT} - gpuci_logger "Setting test env" + gpuci_logger "Setting conda env" conda activate morpheus conda-unpack } diff --git a/ci/scripts/jenkins/docs.sh b/ci/scripts/jenkins/docs.sh index 6a85e85871..6c2990cd74 100755 --- a/ci/scripts/jenkins/docs.sh +++ b/ci/scripts/jenkins/docs.sh @@ -20,6 +20,7 @@ source ${WORKSPACE}/ci/scripts/jenkins/common.sh /usr/bin/nvidia-smi restore_conda_env +pip install ${MORPHEUS_ROOT}/build/wheel cd ${MORPHEUS_ROOT}/docs gpuci_logger "Installing Documentation dependencies" diff --git a/ci/scripts/jenkins/test.sh b/ci/scripts/jenkins/test.sh index f37b052ad4..d0647a58f5 100755 --- a/ci/scripts/jenkins/test.sh +++ b/ci/scripts/jenkins/test.sh @@ -20,7 +20,11 @@ source ${WORKSPACE}/ci/scripts/jenkins/common.sh /usr/bin/nvidia-smi restore_conda_env +pip install ${MORPHEUS_ROOT}/build/wheel +CPP_TESTS=($(find ${MORPHEUS_ROOT}/build/wheel -name "*.x")) + +gpuci_logger "Installing test dependencies" npm install --silent -g camouflage-server mamba install -q -y -c conda-forge "git-lfs=3.1.4" @@ -30,23 +34,46 @@ cd ${MORPHEUS_ROOT} git lfs install ${MORPHEUS_ROOT}/scripts/fetch_data.py fetch tests validation -gpuci_logger "Running tests" +REPORTS_DIR="${WORKSPACE_TMP}/reports" +mkdir -p ${WORKSPACE_TMP}/reports + +TEST_RESULTS=0 +for cpp_test in "${CPP_TESTS[@]}"; do + test_name=$(basename ${cpp_test}) + gpuci_logger "Running ${test_name}" + set +e + + ${cpp_test} --gtest_output="xml:${REPORTS_DIR}/report_${test_name}.xml" + TEST_RESULT=$? + TEST_RESULTS=$(($TEST_RESULTS+$TEST_RESULT)) + + set -e +done + +gpuci_logger "Running Python tests" # Running the tests from the tests dir. Normally this isn't nescesary, however since # we are testing the installed version of morpheus in site-packages and not the one # in the repo dir, the pytest coverage module reports incorrect coverage stats. cd ${MORPHEUS_ROOT}/tests + set +e -pytest --run_slow \ - --junit-xml=${WORKSPACE_TMP}/report_pytest.xml \ + +python -I -m pytest --run_slow \ + --junit-xml=${REPORTS_DIR}/report_pytest.xml \ --cov=morpheus \ --cov-report term-missing \ - --cov-report=xml:${WORKSPACE_TMP}/report_pytest_coverage.xml + --cov-report=xml:${REPORTS_DIR}/report_pytest_coverage.xml PYTEST_RESULTS=$? +TEST_RESULTS=$(($TEST_RESULTS+$PYTEST_RESULTS)) + set -e +gpuci_logger "Archiving test reports" +cd $(dirname ${REPORTS_DIR}) +tar cfj ${WORKSPACE_TMP}/test_reports.tar.bz $(basename ${REPORTS_DIR}) + gpuci_logger "Pushing results to ${DISPLAY_ARTIFACT_URL}" -aws s3 cp ${WORKSPACE_TMP}/report_pytest.xml "${ARTIFACT_URL}/report_pytest.xml" -aws s3 cp ${WORKSPACE_TMP}/report_pytest_coverage.xml "${ARTIFACT_URL}/report_pytest_coverage.xml" +aws s3 cp ${WORKSPACE_TMP}/test_reports.tar.bz "${ARTIFACT_URL}/test_reports.tar.bz" -exit ${PYTEST_RESULTS} +exit ${TEST_RESULTS} diff --git a/morpheus/_lib/tests/CMakeLists.txt b/morpheus/_lib/tests/CMakeLists.txt index eb97df5fd6..18849311bf 100644 --- a/morpheus/_lib/tests/CMakeLists.txt +++ b/morpheus/_lib/tests/CMakeLists.txt @@ -37,4 +37,17 @@ add_test( COMMAND $ ) +set_target_properties(test_libmorpheus + PROPERTIES + INSTALL_RPATH "$ORIGIN/.." +) + +install( + TARGETS + test_libmorpheus + RUNTIME DESTINATION + "${MORPHEUS_LIB_INSTALL_DIR}/tests" + COMPONENT Wheel +) + list(POP_BACK CMAKE_MESSAGE_CONTEXT) From 526f80de426780f55e1c7e9c5f91af4c015ab895 Mon Sep 17 00:00:00 2001 From: Pete MacKinnon Date: Fri, 17 Jun 2022 18:51:59 -0400 Subject: [PATCH 47/73] Update morpheus_quickstart_guide.md (#142) data dir has been relocated Relates to #62 and #141 Authors: - Pete MacKinnon (https://github.com/pdmack) Approvers: - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/142 --- docs/source/morpheus_quickstart_guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/morpheus_quickstart_guide.md b/docs/source/morpheus_quickstart_guide.md index 89907993c7..8d7e641a75 100644 --- a/docs/source/morpheus_quickstart_guide.md +++ b/docs/source/morpheus_quickstart_guide.md @@ -454,7 +454,7 @@ $ helm delete -n $NAMESPACE To publish messages to a Kafka topic, we need to copy datasets to locations where they can be accessed from the host. ```bash -kubectl -n $NAMESPACE exec sdk-cli-helper -- cp -R /workspace/data /common +kubectl -n $NAMESPACE exec sdk-cli-helper -- cp -R /workspace/examples/data /common ``` Refer to the Using Morpheus SDK Client to Run Pipelines section of the Appendix for more information regarding the commands. From 10e3fa79ed2054b666477b1d583abc597fd62021 Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Tue, 21 Jun 2022 12:32:59 -0500 Subject: [PATCH 48/73] release container build fixes (#164) Changes required to build the release container. Closes #166 Authors: - Christopher Harris (https://github.com/cwharris) - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/164 --- CMakeLists.txt | 1 + ci/conda/recipes/morpheus/meta.yaml | 64 +++++-------------- ci/conda/recipes/morpheus/morpheus_build.sh | 9 ++- ci/conda/recipes/run_conda_build.sh | 12 ++-- docker/Dockerfile | 2 +- morpheus/CMakeLists.txt | 2 + .../cmake/utils/python_module_tools.cmake | 36 ++++++----- 7 files changed, 52 insertions(+), 74 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1b7d1c567c..b19fddfad8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,6 +24,7 @@ option(BUILD_SHARED_LIBS "Default value for whether or not to build shared or st option(MORPHEUS_BUILD_BENCHMARKS "Whether or not to build benchmarks" OFF) option(MORPHEUS_BUILD_EXAMPLES "Whether or not to build examples" OFF) option(MORPHEUS_BUILD_TESTS "Whether or not to build tests" OFF) +option(MORPHEUS_BUILD_PYTHON_STUBS "Whether or not to generated .pyi stub files for C++ Python modules. Disable to avoid requiring loading the NVIDIA GPU Driver during build" ON) option(MORPHEUS_USE_CCACHE "Enable caching compilation results with ccache" OFF) option(MORPHEUS_USE_CLANG_TIDY "Enable running clang-tidy as part of the build process" OFF) option(MORPHEUS_USE_CONDA "Enables finding dependencies via conda instead of vcpkg. diff --git a/ci/conda/recipes/morpheus/meta.yaml b/ci/conda/recipes/morpheus/meta.yaml index 74930a6af4..adfecff920 100644 --- a/ci/conda/recipes/morpheus/meta.yaml +++ b/ci/conda/recipes/morpheus/meta.yaml @@ -28,46 +28,16 @@ source: git_url: ../../../.. outputs: - - name: morpheus-deps-build - build: - number: {{ GIT_DESCRIBE_NUMBER }} - string: cuda_{{ cuda_version }}_py{{ py_version }}_{{ GIT_DESCRIBE_HASH }}_{{ GIT_DESCRIBE_NUMBER }} - requirements: - run: - - {{ compiler("c") }} - - {{ compiler("cxx") }} - - {{ compiler("cuda") }} - - ccache - - cmake=3.22 - - cudatoolkit {{ cuda_version }}.* - - cudf {{ rapids_version }} - - cython >=0.29,<0.30 - - librdkafka=1.6.1 - - neo {{ minor_version }}.* - - ninja - - pip - - python {{ python }} - - rapidjson=1.1 - - scikit-build>=0.12 - - versioneer-518 - - - name: morpheus-deps-test - build: - number: {{ GIT_DESCRIBE_NUMBER }} - string: cuda_{{ cuda_version }}_py{{ py_version }}_{{ GIT_DESCRIBE_HASH }}_{{ GIT_DESCRIBE_NUMBER }} - requirements: - run: - - cudatoolkit {{ cuda_version }}.* - - pytest - - pytest-cov - - python {{ python }} - name: morpheus build: number: {{ GIT_DESCRIBE_NUMBER }} string: cuda_{{ cuda_version }}_py{{ py_version }}_{{ GIT_DESCRIBE_HASH }}_{{ GIT_DESCRIBE_NUMBER }} script_env: - - CMAKE_CUDA_ARCHITECTURES=ALL + # Note: Setting a default value here will overwrite the value from the + # shell! Defaults should be set in the run_conda_build.sh script + - CMAKE_CUDA_ARCHITECTURES + - MORPHEUS_BUILD_PYTHON_STUBS - MORPHEUS_CACHE_DIR - PARALLEL_LEVEL run_exports: @@ -81,29 +51,29 @@ outputs: - {{ compiler("c") }} - {{ compiler("cxx") }} - {{ compiler("cuda") }} - - cmake=3.22 + - cmake 3.22 - ccache - ninja host: - - cudatoolkit {{ cuda_version }}.* - cudf {{ rapids_version }} - cython >=0.29,<0.30 - - librdkafka=1.6.1 - - neo {{ minor_version }} + - libcudf {{ rapids_version }} + - librdkafka 1.7 + - neo 22.04.* - pip - pybind11-stubgen - python {{ python }} - - rapidjson=1.1 - - scikit-build>=0.12 + - rapidjson 1.1 + - scikit-build >=0.12 - versioneer-518 run: - - {{ pin_compatible('librdkafka', max_pin='x.x') }} - - click>=8 + - click >=8 + - cudf {{ rapids_version }} - cudf_kafka {{ rapids_version }} - - cupy=9.3.0 + - cupy # Version determined from cudf - distributed - - grpcio=1.41 - - mlflow>=1.23 + - grpcio # Version determined from cudf + - mlflow >=1.23 - networkx - python - tqdm @@ -129,8 +99,8 @@ outputs: - pytest about: - home: http://rapids.ai/ + home: https://github.com/nv-morpheus/Morpheus license: Apache-2.0 license_family: Apache license_file: LICENSE - summary: cuDF GPU DataFrame core library + summary: Morpheus Cybersecurity Library diff --git a/ci/conda/recipes/morpheus/morpheus_build.sh b/ci/conda/recipes/morpheus/morpheus_build.sh index c7cd1dca6d..559b46f736 100644 --- a/ci/conda/recipes/morpheus/morpheus_build.sh +++ b/ci/conda/recipes/morpheus/morpheus_build.sh @@ -38,16 +38,15 @@ CMAKE_ARGS="-DCMAKE_INSTALL_LIBDIR=lib ${CMAKE_ARGS}" CMAKE_ARGS="-DBUILD_SHARED_LIBS=ON ${CMAKE_ARGS}" CMAKE_ARGS="-DMORPHEUS_USE_CONDA=ON ${CMAKE_ARGS}" CMAKE_ARGS="-DMORPHEUS_USE_CCACHE=ON ${CMAKE_ARGS}" +CMAKE_ARGS="-DMORPHEUS_BUILD_PYTHON_STUBS=${MORPHEUS_BUILD_PYTHON_STUBS=-"ON"} ${CMAKE_ARGS}" +CMAKE_ARGS="-DMORPHEUS_PYTHON_INPLACE_BUILD=ON ${CMAKE_ARGS}" +CMAKE_ARGS="-DCMAKE_CUDA_ARCHITECTURES=${CMAKE_CUDA_ARCHITECTURES=-"ALL"} ${CMAKE_ARGS}" +CMAKE_ARGS="-DPython_EXECUTABLE=${PYTHON} ${CMAKE_ARGS}" if [[ "${USE_SCCACHE}" == "1" ]]; then CMAKE_ARGS="-DCCACHE_PROGRAM_PATH=$(which sccache) ${CMAKE_ARGS}" fi -CMAKE_ARGS="-DMORPHEUS_BUILD_PYTHON=ON ${CMAKE_ARGS}" -CMAKE_ARGS="-DMORPHEUS_PYTHON_INPLACE_BUILD=ON ${CMAKE_ARGS}" -CMAKE_ARGS="-DCMAKE_CUDA_ARCHITECTURES=${CMAKE_CUDA_ARCHITECTURES=-"ALL"} ${CMAKE_ARGS}" -CMAKE_ARGS="-DPython_EXECUTABLE=${PYTHON} ${CMAKE_ARGS}" - echo "CC : ${CC}" echo "CXX : ${CXX}" echo "CUDAHOSTCXX : ${CUDAHOSTCXX}" diff --git a/ci/conda/recipes/run_conda_build.sh b/ci/conda/recipes/run_conda_build.sh index ddc9ddbb2b..fa89d42134 100755 --- a/ci/conda/recipes/run_conda_build.sh +++ b/ci/conda/recipes/run_conda_build.sh @@ -26,14 +26,18 @@ function get_version() { echo "$(git describe --tags | grep -o -E '^([^-]*?)')" } -export PARALLEL_LEVEL=${PARALLEL_LEVEL:-$(nproc)} - # Change this to switch between build/mambabuild/debug export CONDA_COMMAND=${CONDA_COMMAND:-"mambabuild"} # Get the path to the morpheus git folder export MORPHEUS_ROOT=${MORPHEUS_ROOT:-$(git rev-parse --show-toplevel)} +# Export script_env variables that must be set for conda build +export CMAKE_CUDA_ARCHITECTURES=${CMAKE_CUDA_ARCHITECTURES:-"ALL"} +export MORPHEUS_BUILD_PYTHON_STUBS=${MORPHEUS_BUILD_PYTHON_STUBS:-"ON"} +export MORPHEUS_CACHE_DIR=${MORPHEUS_CACHE_DIR:-"${MORPHEUS_ROOT}/.cache"} +export PARALLEL_LEVEL=${PARALLEL_LEVEL:-$(nproc)} + # Set the tag for the neo commit to use export NEO_GIT_TAG=${NEO_GIT_TAG:-"5b55e37c6320c1a5747311a1e29e7ebb049d12bc"} @@ -43,7 +47,7 @@ export USE_SCCACHE=${USE_SCCACHE:-""} export CUDA="$(conda list | grep cudatoolkit | egrep -o "[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+")" export PYTHON_VER="$(python -c "import sys; print('.'.join(map(str, sys.version_info[:2])))")" -export CUDA=11.4.1 +export CUDA=11.5 echo "CUDA : ${CUDA}" echo "PYTHON_VER : ${PYTHON_VER}" echo "NEO_GIT_TAG : ${NEO_GIT_TAG}" @@ -52,7 +56,6 @@ echo "" export CMAKE_GENERATOR="Ninja" # Export variables for the cache -export MORPHEUS_CACHE_DIR=${MORPHEUS_CACHE_DIR:-"${MORPHEUS_ROOT}/.cache"} export CCACHE_DIR="${MORPHEUS_CACHE_DIR}/ccache" export CCACHE_NOHASHDIR=1 @@ -91,6 +94,7 @@ CONDA_ARGS_ARRAY+=("--variants" "{python: 3.8}") # And default channels (with optional channel alias) CONDA_ARGS_ARRAY+=("-c" "${CONDA_CHANNEL_ALIAS:+"${CONDA_CHANNEL_ALIAS%/}/"}rapidsai") CONDA_ARGS_ARRAY+=("-c" "${CONDA_CHANNEL_ALIAS:+"${CONDA_CHANNEL_ALIAS%/}/"}nvidia") +CONDA_ARGS_ARRAY+=("-c" "${CONDA_CHANNEL_ALIAS:+"${CONDA_CHANNEL_ALIAS%/}/"}nvidia/label/cuda-11.5.2") CONDA_ARGS_ARRAY+=("-c" "${CONDA_CHANNEL_ALIAS:+"${CONDA_CHANNEL_ALIAS%/}/"}nvidia/label/dev") CONDA_ARGS_ARRAY+=("-c" "conda-forge") diff --git a/docker/Dockerfile b/docker/Dockerfile index acfc85e1d0..9b30448f1f 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -121,7 +121,7 @@ RUN --mount=type=cache,id=workspace_cache,target=/workspace/.cache,sharing=locke --mount=type=cache,id=conda_pkgs,target=/opt/conda/pkgs,sharing=locked \ source activate base &&\ # Temp add CONDA_CHANNEL_ALIAS to get around conda-build 404 errors - MORPHEUS_ROOT=/workspace CONDA_BLD_PATH=/opt/conda/conda-bld CONDA_ARGS="--no-test" ./ci/conda/recipes/run_conda_build.sh morpheus + MORPHEUS_ROOT=/workspace MORPHEUS_BUILD_PYTHON_STUBS=OFF CONDA_BLD_PATH=/opt/conda/conda-bld CONDA_ARGS="--no-test" ./ci/conda/recipes/run_conda_build.sh morpheus # ============ Stage: runtime ============ # Setup container for runtime environment diff --git a/morpheus/CMakeLists.txt b/morpheus/CMakeLists.txt index 00a6184551..4bc29d3768 100644 --- a/morpheus/CMakeLists.txt +++ b/morpheus/CMakeLists.txt @@ -17,6 +17,8 @@ list(APPEND CMAKE_MESSAGE_CONTEXT "morpheus") option(MORPHEUS_PYTHON_INPLACE_BUILD "Whether or not to copy built python modules back to the source tree for debug purposes." OFF) +option(MORPHEUS_BUILD_PYTHON_STUBS + "Whether or not to generate stubs for python files." ON) set(Python3_FIND_VIRTUALENV "FIRST") set(Python3_FIND_STRATEGY "LOCATION") diff --git a/morpheus/cmake/utils/python_module_tools.cmake b/morpheus/cmake/utils/python_module_tools.cmake index 99dfddc094..0be0c29327 100644 --- a/morpheus/cmake/utils/python_module_tools.cmake +++ b/morpheus/cmake/utils/python_module_tools.cmake @@ -199,26 +199,28 @@ macro(add_python_module MODULE_NAME) # succeed add_dependencies(all_python_targets ${TARGET_NAME}) - # Before installing, create the custom command to generate the stubs - set(pybind11_stub_file "${CMAKE_CURRENT_BINARY_DIR}/${MODULE_NAME}/__init__.pyi") - - add_custom_command( - OUTPUT ${pybind11_stub_file} - COMMAND ${Python3_EXECUTABLE} -m pybind11_stubgen ${TARGET_NAME} --no-setup-py --log-level WARN -o ./ --root-module-suffix \"\" - DEPENDS ${TARGET_NAME} all_python_targets - COMMENT "Building stub for python module ${TARGET_NAME}..." - WORKING_DIRECTORY ${PROJECT_BINARY_DIR} - ) + if (MORPHEUS_BUILD_PYTHON_STUBS) + # Before installing, create the custom command to generate the stubs + set(pybind11_stub_file "${CMAKE_CURRENT_BINARY_DIR}/${MODULE_NAME}/__init__.pyi") + + add_custom_command( + OUTPUT ${pybind11_stub_file} + COMMAND ${Python3_EXECUTABLE} -m pybind11_stubgen ${TARGET_NAME} --no-setup-py --log-level WARN -o ./ --root-module-suffix \"\" + DEPENDS ${TARGET_NAME} all_python_targets + COMMENT "Building stub for python module ${TARGET_NAME}..." + WORKING_DIRECTORY ${PROJECT_BINARY_DIR} + ) - # Add a custom target to ensure the stub generation runs - add_custom_target(${TARGET_NAME}-stubs ALL - DEPENDS ${pybind11_stub_file} - ) + # Add a custom target to ensure the stub generation runs + add_custom_target(${TARGET_NAME}-stubs ALL + DEPENDS ${pybind11_stub_file} + ) - # Save the output as a target property - set_target_properties(${TARGET_NAME} PROPERTIES RESOURCE "${pybind11_stub_file}") + # Save the output as a target property + set_target_properties(${TARGET_NAME} PROPERTIES RESOURCE "${pybind11_stub_file}") - unset(pybind11_stub_file) + unset(pybind11_stub_file) + endif() if (PYMOD_INSTALL_DEST) message(STATUS " Install dest: (${TARGET_NAME}) ${PYMOD_INSTALL_DEST}") From 25f401f5713632e7b11785d15a38fcdd08b26dcf Mon Sep 17 00:00:00 2001 From: Michael Demoret <42954918+mdemoret-nv@users.noreply.github.com> Date: Tue, 21 Jun 2022 13:19:44 -0600 Subject: [PATCH 49/73] Update Morpheus to Use SRF 22.06 (#152) This PR updates all references from Neo->SRF. It also updates the CMake build to allow building SRF from source again. Authors: - Michael Demoret (https://github.com/mdemoret-nv) - Pete MacKinnon (https://github.com/pdmack) - David Gardner (https://github.com/dagardner-nv) Approvers: - Christopher Harris (https://github.com/cwharris) - David Gardner (https://github.com/dagardner-nv) - Bartley Richardson (https://github.com/BartleyR) - Devin Robison (https://github.com/drobison00) - https://github.com/raykallen URL: https://github.com/nv-morpheus/Morpheus/pull/152 --- .clang-tidy | 2 +- .pylintrc | 2 +- CONTRIBUTING.md | 2 +- ci/conda/recipes/morpheus/meta.yaml | 2 +- ci/conda/recipes/morpheus/morpheus_build.sh | 2 +- ci/conda/recipes/run_conda_build.sh | 38 --- ci/iwyu/mappings.imp | 14 +- cmake/dependencies.cmake | 6 +- cmake/deps/Configure_neo.cmake | 89 ------- cmake/deps/Configure_srf.cmake | 75 ++++++ docker/build_conda_packages.sh | 32 --- docker/conda/environments/cuda11.5_dev.yml | 10 +- .../guides/1_simple_python_stage.md | 26 +- .../guides/2_real_world_phishing.md | 38 +-- .../guides/3_simple_cpp_stage.md | 139 +++++----- .../guides/4_source_cpp_stage.md | 116 ++++---- .../abp_pcap_preprocessing.py | 8 +- .../stages/classification_stage.py | 8 +- .../stages/graph_construction_stage.py | 8 +- .../stages/graph_sage_stage.py | 8 +- examples/log_parsing/inference.py | 22 +- examples/log_parsing/postprocessing.py | 8 +- examples/log_parsing/preprocessing.py | 22 +- models/mlflow/docker/conda/mlflow-env.yml | 15 ++ morpheus.code-workspace | 14 +- .../_lib/cmake/libraries/cuda_utils.cmake | 2 +- .../_lib/cmake/python_modules/common.cmake | 2 +- .../cmake/python_modules/file_types.cmake | 2 +- .../_lib/cmake/python_modules/messages.cmake | 2 +- .../_lib/cmake/python_modules/stages.cmake | 2 +- .../include/morpheus/objects/rmm_tensor.hpp | 10 +- .../_lib/include/morpheus/objects/tensor.hpp | 2 +- .../morpheus/objects/tensor_object.hpp | 210 ++------------- .../morpheus/stages/add_classification.hpp | 97 ++++--- .../include/morpheus/stages/add_scores.hpp | 82 +++--- .../morpheus/stages/deserialization.hpp | 71 ++--- .../include/morpheus/stages/file_source.hpp | 72 ++--- .../morpheus/stages/filter_detection.hpp | 74 +++--- .../include/morpheus/stages/kafka_source.hpp | 192 +++++++------- .../morpheus/stages/preprocess_fil.hpp | 23 +- .../morpheus/stages/preprocess_nlp.hpp | 104 ++++---- .../include/morpheus/stages/serialize.hpp | 86 +++--- .../morpheus/stages/triton_inference.hpp | 138 +++++----- .../include/morpheus/stages/write_to_file.hpp | 46 ++-- .../morpheus/utilities/string_util.hpp | 69 ++--- .../include/morpheus/utilities/table_util.hpp | 29 +- morpheus/_lib/src/messages/multi.cpp | 4 +- morpheus/_lib/src/objects/file_types.cpp | 34 ++- morpheus/_lib/src/objects/rmm_tensor.cpp | 2 +- morpheus/_lib/src/objects/tensor.cpp | 2 +- morpheus/_lib/src/objects/tensor_object.cpp | 34 +-- morpheus/_lib/src/python_modules/common.cpp | 2 - morpheus/_lib/src/python_modules/messages.cpp | 24 +- morpheus/_lib/src/python_modules/stages.cpp | 77 ++++-- .../_lib/src/stages/add_classification.cpp | 25 +- morpheus/_lib/src/stages/add_scores.cpp | 31 +-- morpheus/_lib/src/stages/deserialize.cpp | 67 ++--- morpheus/_lib/src/stages/file_source.cpp | 188 ++++++------- morpheus/_lib/src/stages/filter_detection.cpp | 26 +- morpheus/_lib/src/stages/kafka_source.cpp | 249 ++++++------------ morpheus/_lib/src/stages/preprocess_fil.cpp | 33 +-- morpheus/_lib/src/stages/preprocess_nlp.cpp | 42 ++- morpheus/_lib/src/stages/serialize.cpp | 173 ++++++------ morpheus/_lib/src/stages/triton_inference.cpp | 58 ++-- morpheus/_lib/src/stages/write_to_file.cpp | 46 ++-- morpheus/_lib/src/utilities/matx_util.cu | 6 +- morpheus/_lib/src/utilities/tensor_util.cpp | 4 +- .../_lib/src/utilities/type_util_detail.cpp | 4 +- morpheus/_lib/tests/CMakeLists.txt | 4 +- morpheus/_lib/tests/test_cuda.cu | 43 ++- morpheus/messages/message_meta.py | 4 +- morpheus/messages/multi_inference_message.py | 14 +- morpheus/messages/multi_message.py | 4 +- morpheus/messages/multi_response_message.py | 10 +- morpheus/pipeline/multi_message_stage.py | 10 +- morpheus/pipeline/pipeline.py | 29 +- morpheus/pipeline/single_output_source.py | 8 +- morpheus/pipeline/single_port_stage.py | 14 +- morpheus/pipeline/source_stage.py | 16 +- morpheus/pipeline/stage.py | 4 +- morpheus/pipeline/stream_pair.py | 4 +- morpheus/pipeline/stream_wrapper.py | 35 +-- morpheus/stages/general/buffer_stage.py | 4 +- morpheus/stages/general/delay_stage.py | 4 +- morpheus/stages/general/monitor_stage.py | 22 +- morpheus/stages/general/trigger_stage.py | 14 +- morpheus/stages/inference/inference_stage.py | 30 +-- .../inference/triton_inference_stage.py | 16 +- .../stages/input/appshield_source_stage.py | 22 +- .../stages/input/cloud_trail_source_stage.py | 22 +- morpheus/stages/input/file_source_stage.py | 24 +- morpheus/stages/input/kafka_source_stage.py | 38 +-- morpheus/stages/output/write_to_file_stage.py | 20 +- .../stages/output/write_to_kafka_stage.py | 19 +- .../postprocess/add_classifications_stage.py | 20 +- .../stages/postprocess/add_scores_stage.py | 12 +- .../postprocess/filter_detections_stage.py | 18 +- .../postprocess/generate_viz_frames_stage.py | 4 +- .../stages/postprocess/ml_flow_drift_stage.py | 8 +- .../stages/postprocess/serialize_stage.py | 20 +- .../stages/postprocess/timeseries_stage.py | 18 +- .../stages/postprocess/validation_stage.py | 18 +- .../stages/preprocess/deserialize_stage.py | 20 +- morpheus/stages/preprocess/drop_null_stage.py | 14 +- .../stages/preprocess/preprocess_ae_stage.py | 4 +- .../preprocess/preprocess_base_stage.py | 12 +- .../stages/preprocess/preprocess_fil_stage.py | 8 +- .../stages/preprocess/preprocess_nlp_stage.py | 22 +- morpheus/stages/preprocess/train_ae_stage.py | 14 +- morpheus/utils/directory_watcher.py | 6 +- tests/benchmarks/static_message_source.py | 20 +- tests/test_inference_stage.py | 6 +- tests/test_messages.py | 29 +- tests/test_monitor_stage.py | 22 +- tests/utils.py | 8 +- 115 files changed, 1773 insertions(+), 2116 deletions(-) delete mode 100644 cmake/deps/Configure_neo.cmake create mode 100644 cmake/deps/Configure_srf.cmake diff --git a/.clang-tidy b/.clang-tidy index 386b9e3bae..16b33553ac 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -8,7 +8,7 @@ Checks: -*,readability-identifier-naming,modernize-*,-modernize-use-trailing-return-type,-modernize-use-nodiscard,google-readability-todo #WarningsAsErrors: '*' -HeaderFilterRegex: '.*\/include\/trtlab\/neo\/.*' +HeaderFilterRegex: '.*\/include\/morpheus\/.*' AnalyzeTemporaryDtors: false FormatStyle: file CheckOptions: diff --git a/.pylintrc b/.pylintrc index 580604cdc7..428b85fabe 100644 --- a/.pylintrc +++ b/.pylintrc @@ -3,7 +3,7 @@ # A comma-separated list of package or module names from where C extensions may # be loaded. Extensions are loading into the active Python interpreter and may # run arbitrary code. -extension-pkg-allow-list=neo,morpheus._lib +extension-pkg-allow-list=srf,morpheus._lib # Specify a score threshold to be exceeded before program exits with error. fail-under=10 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0dd4c192e0..99f95cd3fd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -301,4 +301,4 @@ Ex: ## Attribution Portions adopted from https://github.com/pytorch/pytorch/blob/master/CONTRIBUTING.md \ -Portions adopted from https://github.com/dask/dask/blob/master/docs/source/develop.rst \ No newline at end of file +Portions adopted from https://github.com/dask/dask/blob/master/docs/source/develop.rst diff --git a/ci/conda/recipes/morpheus/meta.yaml b/ci/conda/recipes/morpheus/meta.yaml index adfecff920..c3a3091003 100644 --- a/ci/conda/recipes/morpheus/meta.yaml +++ b/ci/conda/recipes/morpheus/meta.yaml @@ -59,7 +59,7 @@ outputs: - cython >=0.29,<0.30 - libcudf {{ rapids_version }} - librdkafka 1.7 - - neo 22.04.* + - srf {{ minor_version }} - pip - pybind11-stubgen - python {{ python }} diff --git a/ci/conda/recipes/morpheus/morpheus_build.sh b/ci/conda/recipes/morpheus/morpheus_build.sh index 559b46f736..08fe262fd5 100644 --- a/ci/conda/recipes/morpheus/morpheus_build.sh +++ b/ci/conda/recipes/morpheus/morpheus_build.sh @@ -23,7 +23,7 @@ CMAKE_ARGS=${CMAKE_ARGS:-""} export CCACHE_BASEDIR=$(realpath ${SRC_DIR}/..) export USE_SCCACHE=${USE_SCCACHE:-""} -# Check for some neo environment variables. Append to front of args to allow users to overwrite them +# Check for some srf environment variables. Append to front of args to allow users to overwrite them if [[ -n "${MORPHEUS_CACHE_DIR}" ]]; then # Set the cache variable, then set the Staging prefix to allow for host searching CMAKE_ARGS="-DMORPHEUS_CACHE_DIR=${MORPHEUS_CACHE_DIR} ${CMAKE_ARGS}" diff --git a/ci/conda/recipes/run_conda_build.sh b/ci/conda/recipes/run_conda_build.sh index fa89d42134..32afaa767c 100755 --- a/ci/conda/recipes/run_conda_build.sh +++ b/ci/conda/recipes/run_conda_build.sh @@ -38,9 +38,6 @@ export MORPHEUS_BUILD_PYTHON_STUBS=${MORPHEUS_BUILD_PYTHON_STUBS:-"ON"} export MORPHEUS_CACHE_DIR=${MORPHEUS_CACHE_DIR:-"${MORPHEUS_ROOT}/.cache"} export PARALLEL_LEVEL=${PARALLEL_LEVEL:-$(nproc)} -# Set the tag for the neo commit to use -export NEO_GIT_TAG=${NEO_GIT_TAG:-"5b55e37c6320c1a5747311a1e29e7ebb049d12bc"} - # Set CONDA_CHANNEL_ALIAS to mimic the conda config channel_alias property during the build CONDA_CHANNEL_ALIAS=${CONDA_CHANNEL_ALIAS:-""} export USE_SCCACHE=${USE_SCCACHE:-""} @@ -50,7 +47,6 @@ export PYTHON_VER="$(python -c "import sys; print('.'.join(map(str, sys.version_ export CUDA=11.5 echo "CUDA : ${CUDA}" echo "PYTHON_VER : ${PYTHON_VER}" -echo "NEO_GIT_TAG : ${NEO_GIT_TAG}" echo "" export CMAKE_GENERATOR="Ninja" @@ -98,42 +94,8 @@ CONDA_ARGS_ARRAY+=("-c" "${CONDA_CHANNEL_ALIAS:+"${CONDA_CHANNEL_ALIAS%/}/"}nvid CONDA_ARGS_ARRAY+=("-c" "${CONDA_CHANNEL_ALIAS:+"${CONDA_CHANNEL_ALIAS%/}/"}nvidia/label/dev") CONDA_ARGS_ARRAY+=("-c" "conda-forge") -if hasArg libneo; then - - export NEO_ROOT="${MORPHEUS_CACHE_DIR}/src_cache/libneo" - export NEO_CACHE_DIR=${MORPHEUS_CACHE_DIR} - - # First need to download the repo into the cache - if [[ ! -d "${NEO_ROOT}" ]]; then - git clone ${NEO_GIT_URL:?"Cannot build libneo. Must set NEO_GIT_URL to git repo location to allow checkout of neo repository"} ${NEO_ROOT} - fi - - pushd ${NEO_ROOT} - - # Ensure we have the latest checkout - git fetch - git checkout ${NEO_GIT_TAG} - - if [[ "$(git branch --show-current | wc -l)" == "1" ]]; then - git pull - fi - - # Set GIT_VERSION to set the project version inside of meta.yaml - export GIT_VERSION="$(get_version)" - - echo "Running conda-build for libneo..." - set -x - conda ${CONDA_COMMAND} "${CONDA_ARGS_ARRAY[@]}" ${CONDA_ARGS} ci/conda/recipes/libneo - set +x - - unset GIT_DESCRIBE_TAG - - popd -fi - if hasArg morpheus; then # Set GIT_VERSION to set the project version inside of meta.yaml - # Do this after neo in case they are different export GIT_VERSION="$(get_version)" echo "Running conda-build for morpheus..." diff --git a/ci/iwyu/mappings.imp b/ci/iwyu/mappings.imp index 1776f7ad0e..24caf7c04b 100644 --- a/ci/iwyu/mappings.imp +++ b/ci/iwyu/mappings.imp @@ -1,11 +1,11 @@ [ ## Include mappings -# neo protos -{ "include": [ "\"neo/protos/architect.pb.h\"", private, "", "public" ] }, -{ "include": [ "\"neo/protos/codable.pb.h\"", private, "", "public" ] }, -{ "include": [ "\"neo/protos/remote_descriptor.pb.h\"", private, "", "public" ] }, -{ "include": [ "\"neo/protos/tensor_meta_data.pb.h\"", private, "", "public" ] }, +# srf protos +{ "include": [ "\"srf/protos/architect.pb.h\"", private, "", "public" ] }, +{ "include": [ "\"srf/protos/codable.pb.h\"", private, "", "public" ] }, +{ "include": [ "\"srf/protos/remote_descriptor.pb.h\"", private, "", "public" ] }, +{ "include": [ "\"srf/protos/tensor_meta_data.pb.h\"", private, "", "public" ] }, # stdlib { "include": [ "", private, "", "public" ] }, @@ -87,7 +87,7 @@ # xtensor { "symbol": ["xt::no_ownership", "private", "", "public"] }, -# neo -{ "symbol": ["std::__decay_and_strip &>::__type" , "private", "", "public"] }, +# srf +{ "symbol": ["std::__decay_and_strip &>::__type" , "private", "", "public"] }, ] diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 96e7496538..16b0da95c6 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -102,10 +102,10 @@ include(deps/Configure_pybind11) set(RDKAFKA_VERSION 1.6.2) include(deps/Configure_rdkafka) -# NEO (Should come after all third party but before NVIDIA repos) +# SRF (Should come after all third party but before NVIDIA repos) # ===== -set(NEO_VERSION 22.04 CACHE STRING "Which version of Neo to use") -include(deps/Configure_neo) +set(SRF_VERSION 22.06 CACHE STRING "Which version of SRF to use") +include(deps/Configure_srf) # CuDF # ===== diff --git a/cmake/deps/Configure_neo.cmake b/cmake/deps/Configure_neo.cmake deleted file mode 100644 index 2d2cabe1a6..0000000000 --- a/cmake/deps/Configure_neo.cmake +++ /dev/null @@ -1,89 +0,0 @@ -#============================================================================= -# Copyright (c) 2020-2022, NVIDIA CORPORATION. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#============================================================================= - -function(find_and_configure_neo version) - - list(APPEND CMAKE_MESSAGE_CONTEXT "neo") - - # Check if the developer has specified a specific remote or local version of Neo - if (DEFINED CACHE{NEO_GIT_REPOSITORY} OR DEFINED CACHE{CPM_neo_SOURCE}) - rapids_cpm_find(neo ${version} - GLOBAL_TARGETS - neo::neo neo::pyneo - BUILD_EXPORT_SET - ${PROJECT_NAME}-exports - INSTALL_EXPORT_SET - ${PROJECT_NAME}-exports - CPM_ARGS - GIT_REPOSITORY ${NEO_GIT_REPOSITORY} - GIT_TAG branch-${version} - GIT_SHALLOW TRUE - OPTIONS "NEO_BUILD_EXAMPLES OFF" - "NEO_BUILD_TESTS OFF" - "NEO_BUILD_BENCHMARKS OFF" - "NEO_BUILD_PYTHON ON" - "NEO_ENABLE_XTENSOR ON" - "NEO_ENABLE_MATX ON" - "NEO_USE_CONDA ${MORPHEUS_USE_CONDA}" - "NEO_USE_CCACHE ${MORPHEUS_USE_CCACHE}" - "NEO_USE_CLANG_TIDY ${MORPHEUS_USE_CLANG_TIDY}" - "NEO_PYTHON_INPLACE_BUILD ${MORPHEUS_PYTHON_INPLACE_BUILD}" - "RMM_VERSION ${RAPIDS_VERSION}" - ) - else() - rapids_find_package(neo REQUIRED - GLOBAL_TARGETS - neo::neo neo::pyneo - BUILD_EXPORT_SET - ${PROJECT_NAME}-exports - INSTALL_EXPORT_SET - ${PROJECT_NAME}-exports - FIND_ARGS - ${version} - ) - endif() - - if(neo_ADDED) - - # Now ensure its installed - find_package(Python3 COMPONENTS Interpreter REQUIRED) - - # detect virtualenv and set Pip args accordingly - if(DEFINED ENV{VIRTUAL_ENV} OR DEFINED ENV{CONDA_PREFIX}) - set(_pip_args) - else() - set(_pip_args "--user") - endif() - - if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") - list(APPEND _pip_args "-e") - endif() - - add_custom_command( - OUTPUT ${neo_BINARY_DIR}/python/neo.egg-info/PKG-INFO - COMMAND ${Python3_EXECUTABLE} -m pip install ${_pip_args} ${neo_BINARY_DIR}/python - DEPENDS neo_python_rebuild - COMMENT "Installing neo python package" - ) - - add_custom_target( - install_neo_python ALL - DEPENDS ${neo_BINARY_DIR}/python/neo.egg-info/PKG-INFO - ) - endif() -endfunction() - -find_and_configure_neo(${NEO_VERSION}) diff --git a/cmake/deps/Configure_srf.cmake b/cmake/deps/Configure_srf.cmake new file mode 100644 index 0000000000..cfcd8806eb --- /dev/null +++ b/cmake/deps/Configure_srf.cmake @@ -0,0 +1,75 @@ +#============================================================================= +# Copyright (c) 2020-2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#============================================================================= + +function(find_and_configure_srf version) + + list(APPEND CMAKE_MESSAGE_CONTEXT "srf") + + rapids_cpm_find(srf ${version} + GLOBAL_TARGETS + srf::srf srf::pysrf + BUILD_EXPORT_SET + ${PROJECT_NAME}-exports + INSTALL_EXPORT_SET + ${PROJECT_NAME}-exports + CPM_ARGS + GIT_REPOSITORY https://github.com/nv-morpheus/SRF.git + GIT_TAG branch-${version} + GIT_SHALLOW TRUE + OPTIONS "SRF_BUILD_EXAMPLES OFF" + "SRF_BUILD_TESTS OFF" + "SRF_BUILD_BENCHMARKS OFF" + "SRF_BUILD_PYTHON ON" + "SRF_ENABLE_XTENSOR ON" + "SRF_ENABLE_MATX ON" + "SRF_USE_CONDA ${MORPHEUS_USE_CONDA}" + "SRF_USE_CCACHE ${MORPHEUS_USE_CCACHE}" + "SRF_USE_CLANG_TIDY ${MORPHEUS_USE_CLANG_TIDY}" + "SRF_PYTHON_INPLACE_BUILD ${MORPHEUS_PYTHON_INPLACE_BUILD}" + "RMM_VERSION ${RAPIDS_VERSION}" + ) + + if(srf_ADDED) + + # Now ensure its installed + find_package(Python3 COMPONENTS Interpreter REQUIRED) + + # detect virtualenv and set Pip args accordingly + if(DEFINED ENV{VIRTUAL_ENV} OR DEFINED ENV{CONDA_PREFIX}) + set(_pip_args) + else() + set(_pip_args "--user") + endif() + + if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") + list(APPEND _pip_args "-e") + endif() + + add_custom_command( + OUTPUT ${srf_BINARY_DIR}/python/srf.egg-info/PKG-INFO + COMMAND ${Python3_EXECUTABLE} -m pip install ${_pip_args} ${srf_BINARY_DIR}/python + DEPENDS srf_python_rebuild + COMMENT "Installing srf python package" + ) + + add_custom_target( + install_srf_python ALL + DEPENDS ${srf_BINARY_DIR}/python/srf.egg-info/PKG-INFO + ) + endif() +endfunction() + +find_and_configure_srf(${SRF_VERSION}) diff --git a/docker/build_conda_packages.sh b/docker/build_conda_packages.sh index ba21de89a9..9c8932077c 100755 --- a/docker/build_conda_packages.sh +++ b/docker/build_conda_packages.sh @@ -48,38 +48,6 @@ CONDA_ARGS+=("--skip-existing") DOCKER_EXTRA_ARGS=() -if hasArg libneo; then - # If libneo is specified, you must set NEO_GIT_URL - DOCKER_EXTRA_ARGS+=("--env" "NEO_GIT_URL=${NEO_GIT_URL:?"Cannot build libneo. Must set NEO_GIT_URL to git repo location to allow checkout of neo repository"}") - - url=${NEO_GIT_URL} - - # Remove the http/https/ssh - url="${url#http://}" - url="${url#https://}" - url="${url#ssh://}" - - # Remove git@ - url="${url#git@}" - - # Remove username/password - url="${url#*:*@}" - url="${url#*@}" - - # Remove remaining - url=${url%%/*} - - port=${url##*:} - url=${url%%:*} - - # Add the command to auto accept this url/port combo - if [[ -n "${port}" ]]; then - BUILD_SCRIPT="${BUILD_SCRIPT:+${BUILD_SCRIPT}\n}mkdir -p \$HOME/.ssh && ssh-keyscan -t rsa -p ${port} ${url} > ~/.ssh/known_hosts" - else - BUILD_SCRIPT="${BUILD_SCRIPT:+${BUILD_SCRIPT}\n}mkdir -p \$HOME/.ssh && ssh-keyscan -t rsa ${url} > ~/.ssh/known_hosts" - fi -fi - # Build the script to execute inside of the container (needed to set multiple statements in CONDA_ARGS) BUILD_SCRIPT="${BUILD_SCRIPT} export CONDA_ARGS=\"${CONDA_ARGS[@]}\" diff --git a/docker/conda/environments/cuda11.5_dev.yml b/docker/conda/environments/cuda11.5_dev.yml index 88f578fc48..468e242aab 100644 --- a/docker/conda/environments/cuda11.5_dev.yml +++ b/docker/conda/environments/cuda11.5_dev.yml @@ -17,7 +17,7 @@ name: morpheus channels: - rapidsai - nvidia - - nvidia/label/dev # For pre-releases of Neo. Should still default to full releases if available + - nvidia/label/dev # For pre-releases of SRF. Should still default to full releases if available - nvidia/label/cuda-11.5.2 # For cuda-nvml-dev=11.5, which is not published under nvidia channel yet. - conda-forge dependencies: @@ -42,7 +42,7 @@ dependencies: - gcc_linux-64=9.4 - gflags=2.2 - git>=2.35.3 # Needed for wildcards on safe.directory - - glog=0.5 + - glog=0.6 - gmock=1.10 - grpc-cpp>=1.43 - gtest=1.10 @@ -50,13 +50,13 @@ dependencies: - isort - mlflow>=1.23 - myst-parser==0.17 - - neo 22.04.* + - srf 22.06.* - ninja=1.10 - nodejs=17.4.0 - pandas=1.3 - pip - - pkg-config # for neo cmake - - protobuf=3.19 + - pkg-config # for srf cmake + - protobuf=3.20 - pybind11-stubgen - pydot - pytest diff --git a/docs/source/developer_guide/guides/1_simple_python_stage.md b/docs/source/developer_guide/guides/1_simple_python_stage.md index 9625ce923d..0eadb0f9dd 100644 --- a/docs/source/developer_guide/guides/1_simple_python_stage.md +++ b/docs/source/developer_guide/guides/1_simple_python_stage.md @@ -19,7 +19,7 @@ limitations under the License. ## Background -Morpheus makes use of the Neo graph-execution framework. Morpheus pipelines are built on top of Neo pipelines. Pipelines in Neo are made up of segments; however, in many common cases, a Neo pipeline will consist of only a single segment. Our Morpheus stages will interact with the Neo segment to build nodes and add them to the Neo graph. In the common case, a Morpheus stage will add a single node to the graph, but in some cases it will add multiple nodes to the graph. +Morpheus makes use of the SRF graph-execution framework. Morpheus pipelines are built on top of SRF pipelines. Pipelines in SRF are made up of segments; however, in many common cases, a SRF pipeline will consist of only a single segment. Our Morpheus stages will interact with the SRF segment to build nodes and add them to the SRF graph. In the common case, a Morpheus stage will add a single node to the graph, but in some cases it will add multiple nodes to the graph. ## The Pass Through Stage @@ -30,7 +30,7 @@ Defining this stage requires us to specify the stage type. Morpheus stages conta ```python import typing -import neo +import srf from morpheus.pipeline.single_port_stage import SinglePortStage from morpheus.pipeline.stream_pair import StreamPair @@ -59,21 +59,21 @@ Our `on_data` method accepts the incoming message and returns a message. The ret return message ``` -Finally, the `_build_single` method will be used at build time to wire our stage into the pipeline. `_build_single` receives an instance of the Neo pipeline segment along with a `StreamPair` instance. We will be using the segment instance to build a node from our stage and add it to the pipeline segment. The `StreamPair` argument is a tuple; the first element is our parent node, and the second is our parent node's output type. The return type of this method is also a `StreamPair`. Typically, we will be returning our newly constructed node along with our output type. +Finally, the `_build_single` method will be used at build time to wire our stage into the pipeline. `_build_single` receives an instance of the SRF pipeline segment along with a `StreamPair` instance. We will be using the segment instance to build a node from our stage and add it to the pipeline segment. The `StreamPair` argument is a tuple; the first element is our parent node, and the second is our parent node's output type. The return type of this method is also a `StreamPair`. Typically, we will be returning our newly constructed node along with our output type. ```python - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - node = seg.make_node(self.unique_name, self.on_data) - seg.make_edge(input_stream[0], node) + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: + node = builder.make_node(self.unique_name, self.on_data) + builder.make_edge(input_stream[0], node) ``` -In most cases, a Morpheus stage will define and build a single Neo node. In some advanced cases, a stage can construct more than one node. For our purposes, a Morpheus _stage_ defines information about the type of node(s) it builds, while the _node_ is the instance of the stage that is wired into the Neo pipeline. To build the node, we will call the `make_node` method of the segment instance, passing to it our name and our `on_data` method. We used the `unique_name` property, which will take the name property which we already defined and append a unique id to it. +In most cases, a Morpheus stage will define and build a single SRF node. In some advanced cases, a stage can construct more than one node. For our purposes, a Morpheus _stage_ defines information about the type of node(s) it builds, while the _node_ is the instance of the stage that is wired into the SRF pipeline. To build the node, we will call the `make_node` method of the segment instance, passing to it our name and our `on_data` method. We used the `unique_name` property, which will take the name property which we already defined and append a unique id to it. ```python -node = seg.make_node(self.unique_name, self.on_data) +node = builder.make_node(self.unique_name, self.on_data) ``` Next, we will define an edge connecting our new node to our parent node: ```python -seg.make_edge(input_stream[0], node) +builder.make_edge(input_stream[0], node) ``` Finally, we will return a new tuple of our node and output type. Since this is a pass through node that can accept any input type, we will return our parent's type. @@ -85,7 +85,7 @@ return node, input_stream[1] ```python import typing -import neo +import srf from morpheus.pipeline.single_port_stage import SinglePortStage from morpheus.pipeline.stream_pair import StreamPair @@ -102,9 +102,9 @@ class PassThruStage(SinglePortStage): # Return the message for the next stage return message - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - node = seg.make_node(self.unique_name, self.on_data) - seg.make_edge(input_stream[0], node) + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: + node = builder.make_node(self.unique_name, self.on_data) + builder.make_edge(input_stream[0], node) return node, input_stream[1] ``` diff --git a/docs/source/developer_guide/guides/2_real_world_phishing.md b/docs/source/developer_guide/guides/2_real_world_phishing.md index ad3526f473..194e5a6c23 100644 --- a/docs/source/developer_guide/guides/2_real_world_phishing.md +++ b/docs/source/developer_guide/guides/2_real_world_phishing.md @@ -78,7 +78,7 @@ Our `_build_single` method remains unchanged; even though we are modifying the i ```python import typing -import neo +import srf from morpheus.messages.message_meta import MessageMeta from morpheus.pipeline.single_port_stage import SinglePortStage @@ -112,9 +112,9 @@ class RecipientFeaturesStage(SinglePortStage): # Return the message for the next stage return message - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - node = seg.make_node(self.unique_name, self.on_data) - seg.make_edge(input_stream[0], node) + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: + node = builder.make_node(self.unique_name, self.on_data) + builder.make_edge(input_stream[0], node) return node, input_stream[1] ``` @@ -406,15 +406,15 @@ In this example, we will create a source that reads messages from a [RabbitMQ](h The `_build_source` method is similar to the `_build_single` method; it receives an instance of the pipeline segment and returns a `StreamPair`. However, unlike in the previous examples, source stages do not have parent stages and therefore do not receive a `StreamPair` as input. We also will no longer build our node by calling `make_node`. Instead, we will call `make_source` with the parameter `self.source_generator`, which is a method that we will define next. ```python -def _build_source(self, seg: neo.Segment) -> StreamPair: - node = seg.make_source(self.unique_name, self.source_generator) +def _build_source(self, builder: srf.Builder) -> StreamPair: + node = builder.make_source(self.unique_name, self.source_generator) return node, MessageMeta ``` -The `source_generator` method is where most of the RabbitMQ-specific code exists. Source node methods receive an instance of `neo.Subscriber` as their first argument. When we have a message that we wish to emit into the pipeline, we call the `neo.Subscriber.on_next` method. +The `source_generator` method is where most of the RabbitMQ-specific code exists. Source node methods receive an instance of `srf.Subscriber` as their first argument. When we have a message that we wish to emit into the pipeline, we call the `srf.Subscriber.on_next` method. ```python -def source_generator(self, subscriber: neo.Subscriber): +def source_generator(self, subscriber: srf.Subscriber): try: while subscriber.is_subscribed(): (method_frame, header_frame, body) = self._channel.basic_get(self._queue_name) @@ -447,7 +447,7 @@ import time from datetime import timedelta from io import StringIO -import neo +import srf import pika import cudf @@ -511,11 +511,11 @@ class RabbitMQSourceStage(SingleOutputSource): def name(self) -> str: return "from-rabbitmq" - def _build_source(self, seg: neo.Segment) -> StreamPair: - node = seg.make_source(self.unique_name, self.source_generator) + def _build_source(self, builder: srf.Builder) -> StreamPair: + node = builder.make_source(self.unique_name, self.source_generator) return node, MessageMeta - def source_generator(self, subscriber: neo.Subscriber): + def source_generator(self, subscriber: srf.Subscriber): try: while subscriber.is_subscribed(): (method_frame, header_frame, body) = self._channel.basic_get(self._queue_name) @@ -550,9 +550,9 @@ class WriteToRabbitMQStage(SinglePortStage): In our `_build_single` we will be making use of the `make_sink` method rather than `make_node` or `make_source` ```python -def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - node = seg.make_sink(self.unique_name, self.on_data, self.on_error, self.on_complete) - seg.make_edge(input_stream[0], node) +def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: + node = builder.make_sink(self.unique_name, self.on_data, self.on_error, self.on_complete) + builder.make_edge(input_stream[0], node) return input_stream ``` @@ -591,7 +591,7 @@ import logging import typing from io import StringIO -import neo +import srf import pika import cudf @@ -645,9 +645,9 @@ class WriteToRabbitMQStage(SinglePortStage): def accepted_types(self) -> typing.Tuple: return (MessageMeta, ) - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - node = seg.make_sink(self.unique_name, self.on_data, self.on_error, self.on_complete) - seg.make_edge(input_stream[0], node) + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: + node = builder.make_sink(self.unique_name, self.on_data, self.on_error, self.on_complete) + builder.make_edge(input_stream[0], node) return input_stream def on_data(self, message: MessageMeta): diff --git a/docs/source/developer_guide/guides/3_simple_cpp_stage.md b/docs/source/developer_guide/guides/3_simple_cpp_stage.md index 9cc18600ee..2bca67a363 100644 --- a/docs/source/developer_guide/guides/3_simple_cpp_stage.md +++ b/docs/source/developer_guide/guides/3_simple_cpp_stage.md @@ -59,13 +59,14 @@ template // by default, emit type == class PythonNode : ... ``` -Both the `PythonSource` and `PythonNode` classes are defined in the `pyneo/node.hpp` header. +Both the `PythonSource` and `PythonNode` classes are defined in the `pysrf/node.hpp` header. -Note: `SourceT` and `SinkT` types are typically `shared_ptr`s to a Morpheus message type. For example, `std::shared_ptr`. +Note: `SourceT` and `SinkT` types are typically `shared_ptr`s to a Morpheus message type. For example, `std::shared_ptr`. This allows the reference counting mechanisms used in Python and C++ to share the same count, properly cleaning up the objects when they are no longer referenced. Note: The C++ implementation of a stage must receive and emit the same message types as the Python implementation. -Note: The "Python" in the `PythonSource` & `PythonNode` class names refers to the fact that these classes contain Python interfaces, not the implementation language. +Note: The "Python" in the `PythonSource` & `PythonNode` class names refers to the fact that these classes read and write +objects registered with python, not the implementation language. ## A Simple Pass Through Stage @@ -73,12 +74,12 @@ As in our Python guide, we will start with a simple pass through stage which can While our Python implementation accepts messages of any type (in the form of Python objects), on the C++ side we don't have that flexibility since our node is subject to C++ static typing rules. In practice, this isn't a limitation as we usually know which specific message types we need to work with. -To start with, we have our Morpheus and Neo-specific includes: +To start with, we have our Morpheus and SRF-specific includes: ```cpp #include // for MultiMessage -#include //for Segment -#include // for PythonNode +#include //for Segment +#include // for PythonNode ``` We'll want to define our stage in its own namespace. In this case, we will name it `morpheus_example`, giving us a namespace and class definition that look like this: @@ -90,38 +91,38 @@ namespace morpheus_example { using namespace morpheus; -class PassThruStage : public neo::pyneo::PythonNode, std::shared_ptr> +class PassThruStage : public srf::pysrf::PythonNode, std::shared_ptr> { public: - using base_t = neo::pyneo::PythonNode, std::shared_ptr>; - using base_t::operator_fn_t; - using base_t::reader_type_t; - using base_t::writer_type_t; + using base_t = srf::pysrf::PythonNode, std::shared_ptr>; + using base_t::subscribe_fn_t; + using base_t::sink_type_t; + using base_t::source_type_t; -PassThruStage(const neo::Segment &seg, const std::string &name); + PassThruStage(); -operator_fn_t build_operator(); + subscribe_fn_t build_operator(); }; ``` We explicitly set the visibility for the stage object in the namespace to default. This is due to a pybind11 requirement for module implementations to default symbol visibility to hidden (`-fvisibility=hidden`). More details about this can be found in the [pybind11 documentation](https://pybind11.readthedocs.io/en/stable/faq.html#someclass-declared-with-greater-visibility-than-the-type-of-its-field-someclass-member-wattributes). -For simplicity, we defined `base_t` as an alias for our base class type because the definition can be quite long. Our base class type also defines a few additional type aliases for us: `operator_fn_t`, `reader_type_t` and `writer_type_t`. The `reader_type_t` and `writer_type_t` aliases are shortcuts for specifying that we are a reader and writer of `std::shared_ptr`, respectively. `operator_fn_t` (read as "operator function type") is an alias for: +For simplicity, we defined `base_t` as an alias for our base class type because the definition can be quite long. Our base class type also defines a few additional type aliases for us: `subscribe_fn_t`, `sink_type_t` and `source_type_t`. The `sink_type_t` and `source_type_t` aliases are shortcuts for the sink and source types that this stage will be reading and writing. In this case both the `sink_type_t` and `source_type_t` resolve to `std::shared_ptr`. `subscribe_fn_t` (read as "subscribe function type") is an alias for: ```cpp -std::function(const Observable& source)> +std::function, rxcpp::subscriber)> ``` -This means that a Neo operator function accepts an `Observable` of type `T` and returns an observable of type `R`. In our case, both `T` and `R` are `std::shared_ptr`. +This means that a SRF subscribe function accepts an `rxcpp::observable` of type `T` and `rxcpp::subscriber` of type `R` and returns a subscription. In our case, both `T` and `R` are `std::shared_ptr`. -All Morpheus C++ stages receive an instance of a Neo Segment and a name. Typically this is the Python class' `unique_name` property. Note that C++ segments don't receive an instance of the Morpheus config. Therefore, if there are any attributes in the config needed by the C++ class, it is the responsibility of the Python class to extract them and pass them in as parameters to the C++ class. +All Morpheus C++ stages receive an instance of a SRF Segment Builder and a name (Typically this is the Python class' `unique_name` property) when constructed from Python. Note that C++ segments don't receive an instance of the Morpheus config. Therefore, if there are any attributes in the config needed by the C++ class, it is the responsibility of the Python class to extract them and pass them in as parameters to the C++ class. -We will also define an interface proxy object to keep the class definition separated from the Python interface. This isn't strictly required, but it is a convention used internally by Morpheus. Our proxy object will define a static method named `init` which is responsible for constructing a `PassThruStage` instance and returning it wrapped in a `shared_ptr`. There are many common Python types that pybind11 [automatically converts](https://pybind11.readthedocs.io/en/latest/advanced/cast/overview.html#conversion-table) to their associated C++ types. The Neo `Segment` is a C++ object with Python bindings. The proxy interface object is used to help insulate Python bindings from internal implementation details. +We will also define an interface proxy object to keep the class definition separated from the Python interface. This isn't strictly required, but it is a convention used internally by Morpheus. Our proxy object will define a static method named `init` which is responsible for constructing a `PassThruStage` instance and returning it wrapped in a `shared_ptr`. There are many common Python types that pybind11 [automatically converts](https://pybind11.readthedocs.io/en/latest/advanced/cast/overview.html#conversion-table) to their associated C++ types. The SRF `Builder` is a C++ object with Python bindings. The proxy interface object is used to help insulate Python bindings from internal implementation details. ```cpp struct PassThruStageInterfaceProxy { - static std::shared_ptr init(neo::Segment &seg, const std::string &name); + static std::shared_ptr> init(srf::segment::Builder &builder, const std::string &name); }; ``` @@ -133,8 +134,8 @@ Putting it all together, our header file looks like this: #pragma once #include // for MultiMessage -#include //for Segment -#include // for PythonNode +#include //for Segment +#include // for PythonNode #include #include @@ -146,22 +147,22 @@ namespace morpheus_example { using namespace morpheus; -class PassThruStage : public neo::pyneo::PythonNode, std::shared_ptr> +class PassThruStage : public srf::pysrf::PythonNode, std::shared_ptr> { public: - using base_t = neo::pyneo::PythonNode, std::shared_ptr>; - using base_t::operator_fn_t; - using base_t::reader_type_t; - using base_t::writer_type_t; + using base_t = srf::pysrf::PythonNode, std::shared_ptr>; + using base_t::subscribe_fn_t; + using base_t::sink_type_t; + using base_t::source_type_t; - PassThruStage(const neo::Segment &seg, const std::string &name); + PassThruStage(); - operator_fn_t build_operator(); + subscribe_fn_t build_operator(); }; struct PassThruStageInterfaceProxy { - static std::shared_ptr init(neo::Segment &seg, const std::string &name); + static std::shared_ptr> init(srf::segment::Builder &builder, const std::string &name); }; #pragma GCC visibility pop @@ -180,24 +181,38 @@ Our includes section looks like: #include ``` -The constructor for our class is responsible for passing the output of `build_operator` to our base class, as well as calling the constructor for `neo::SegmentObject`: +The constructor for our class is responsible for passing the output of `build_operator` to our base class, as well as calling the constructor for `PythonNode`: ```cpp -PassThruStage::PassThruStage(const neo::Segment& seg, const std::string& name) : - neo::SegmentObject(seg, name), - PythonNode(seg, name, build_operator()) +PassThruStage::PassThruStage() : + PythonNode(base_t::op_factory_from_sub_fn(build_operator())) {} ``` -The `build_operator` method defines an observer who is subscribed to our input `Observable`. The observer consists of three functions that are typically lambdas: `on_next`, `on_error`, and `on_completed`. Typically, these three functions call the associated methods on the output subscriber. +We can see that the output of `build_operator()` is not passed directly to the `PythonNode` constructor and instead gets passed to `base_t::op_factory_from_sub_fn()`. This is because reactive operators can be defined two ways: + +1. Using the short form `std::function(rxcpp::observable)` which is good when you can use an existing `rxcpp` operator +2. Using the long form `std::function, rxcpp::subscriber)>` which allows for more customization and better control over the lifetime of objects. + +It's possible to convert between the two signatures which is exactly what `base_t::op_factory_from_sub_fn()` does. If you wanted to use the short form, you could define the constructor of `PassThruStage` using: ```cpp -PassThruStage::operator_fn_t PassThruStage::build_operator() +PassThruStage::PassThruStage() : + PythonNode([](rxcpp::observable obs){ return obs; }) +{} +``` + +However, this doesnt illustrate well how to customize a stage. So we will be using the long form signature for our examples. + +The `build_operator` method defines an observer who is subscribed to our input `rxcpp::observable`. The observer consists of three functions that are typically lambdas: `on_next`, `on_error`, and `on_completed`. Typically, these three functions call the associated methods on the output subscriber. + +```cpp +PassThruStage::subscribe_fn_t PassThruStage::build_operator() { - return [this](neo::Observable& input, neo::Subscriber& output) { + return [this](rxcpp::observable& input, rxcpp::subscriber& output) { return input.subscribe( - neo::make_observer( - [this, &output](reader_type_t&& x) { output.on_next(std::move(x)); }, + rxcpp::make_observer( + [this, &output](sink_type_t&& x) { output.on_next(std::move(x)); }, [&](std::exception_ptr error_ptr) { output.on_error(error_ptr); }, [&]() { output.on_completed(); })); }; @@ -209,7 +224,7 @@ Note the use of `std::move` in the `on_next` function. In Morpheus, our messages There are situations in which a C++ stage does need to interact with Python, and therefore acquiring the GIL is a requirement. In these situations, it is important to ensure that the GIL is released before calling the `on_next` method. This is typically accomplished using pybind11's [gil_scoped_acquire](https://pybind11.readthedocs.io/en/stable/advanced/misc.html#global-interpreter-lock-gil) RAII class inside of a code block. Consider the following `on_next` lambda function from Morpheus' `SerializeStage`: ```cpp -[this, &output](reader_type_t &&msg) { +[this, &output](sink_type_t &&msg) { auto table_info = this->get_meta(msg); std::shared_ptr meta; { @@ -224,16 +239,16 @@ We scoped the acquisition of the GIL such that it is held only for the parts of ## Python Proxy and Interface -The three things that all proxy interfaces need to do are: -1. Construct the stage wrapped in a `shared_ptr` -1. Register the stage with the Neo segment -1. Return a `shared_ptr` to the stage +The things that all proxy interfaces need to do are: +1. Construct the stage using the `srf::segment::Builder::construct_object` method +2. Return a `shared_ptr` to the stage wrapped in a `srf::segment::Object` ```cpp -std::shared_ptr PassThruStageInterfaceProxy::init(neo::Segment& seg, const std::string& name) +std::shared_ptr> +PassThruStageInterfaceProxy::init(srf::segment::Builder& builder, const std::string& name) { - auto stage = std::make_shared(seg, name); - seg.register_node(stage); + auto stage = builder.construct_object(name); + return stage; } ``` @@ -246,9 +261,9 @@ namespace py = pybind11; // Define the pybind11 module m. PYBIND11_MODULE(morpheus_example, m) { - py::class_>( + py::class_>>( m, "PassThruStage", py::multiple_inheritance()) - .def(py::init<>(&PassThruStageInterfaceProxy::init), py::arg("segment"), py::arg("name")); + .def(py::init<>(&PassThruStageInterfaceProxy::init), py::arg("builder"), py::arg("name")); } ``` @@ -263,25 +278,25 @@ PYBIND11_MODULE(morpheus_example, m) namespace morpheus_example { -PassThruStage::PassThruStage(const neo::Segment& seg, const std::string& name) : - neo::SegmentObject(seg, name), - PythonNode(seg, name, build_operator()) +PassThruStage::PassThruStage() : + PythonNode(base_t::op_factory_from_sub_fn(build_operator())) {} -PassThruStage::operator_fn_t PassThruStage::build_operator() +PassThruStage::subscribe_fn_t PassThruStage::build_operator() { - return [this](neo::Observable& input, neo::Subscriber& output) { + return [this](rxcpp::observable& input, rxcpp::subscriber& output) { return input.subscribe( - neo::make_observer([this, &output](reader_type_t&& x) { output.on_next(std::move(x)); }, + rxcpp::make_observer([this, &output](sink_type_t&& x) { output.on_next(std::move(x)); }, [&](std::exception_ptr error_ptr) { output.on_error(error_ptr); }, [&]() { output.on_completed(); })); }; } -std::shared_ptr PassThruStageInterfaceProxy::init(neo::Segment& seg, const std::string& name) +std::shared_ptr> +PassThruStageInterfaceProxy::init(srf::segment::Builder& builder, const std::string& name) { - auto stage = std::make_shared(seg, name); - seg.register_node(stage); + auto stage = builder.construct_object(name); + return stage; } @@ -290,7 +305,7 @@ namespace py = pybind11; // Define the pybind11 module m. PYBIND11_MODULE(morpheus_example, m) { - py::class_>( + py::class_>>( m, "PassThruStage", py::multiple_inheritance()) .def(py::init<>(&PassThruStageInterfaceProxy::init), py::arg("segment"), py::arg("name")); } @@ -314,13 +329,13 @@ As mentioned in the previous section, we will need to override the `supports_cpp def supports_cpp_node(self): return True -def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: +def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: if self._build_cpp_node(): print("building cpp") - node = morpheus_example_cpp.PassThruStage(seg, self.unique_name) + node = morpheus_example_cpp.PassThruStage(builder, self.unique_name) else: - node = seg.make_node(self.unique_name, self.on_data) + node = builder.make_node(self.unique_name, self.on_data) - seg.make_edge(input_stream[0], node) + builder.make_edge(input_stream[0], node) return node, input_stream[1] ``` diff --git a/docs/source/developer_guide/guides/4_source_cpp_stage.md b/docs/source/developer_guide/guides/4_source_cpp_stage.md index c9d3ff7110..7a2f55178f 100644 --- a/docs/source/developer_guide/guides/4_source_cpp_stage.md +++ b/docs/source/developer_guide/guides/4_source_cpp_stage.md @@ -27,8 +27,8 @@ Our includes section looks like: ```cpp #include // for MessageMeta -#include // for Segment -#include // for PythonSource +#include // for Segment +#include // for PythonSource #include // for table_with_metadata #include // for AmqpClient::Channel::ptr_t @@ -49,21 +49,19 @@ namespace morpheus_rabbit { using namespace std::literals; using namespace morpheus; -class RabbitMQSourceStage : public neo::pyneo::PythonSource> +class RabbitMQSourceStage : public srf::pysrf::PythonSource> { public: - using base_t = neo::pyneo::PythonSource>; + using base_t = srf::pysrf::PythonSource>; using base_t::source_type_t; ``` -Our base class defines `source_type_t` as an alias for `Writer>::writer_type_t` which we are going to use as it will appear in some of our function signatures. The way to think about `source_type_t` is that the stage we are writing emits objects of type `MessageMeta`. +Our base class defines `source_type_t` as an alias for `std::shared_ptr` which we are going to use as it will appear in some of our function signatures. The way to think about `source_type_t` is that the stage we are writing emits objects of type `MessageMeta`. The class we are deriving from, `PythonSource`, defines this type to make writing function signatures easier. Our constructor looks similar to the constructor of our Python class with the majority of the parameters being specific to communicating with RabbitMQ. In this case the default destructor is sufficient. ```cpp -RabbitMQSourceStage(const neo::Segment &segment, - const std::string &name, - const std::string &host, +RabbitMQSourceStage(const std::string &host, const std::string &exchange, const std::string &exchange_type = "fanout"s, const std::string &queue_name = ""s, @@ -74,13 +72,13 @@ RabbitMQSourceStage(const neo::Segment &segment, Our class will require a few private methods ```cpp -neo::Observable build_observable(); -void source_generator(neo::Subscriber &sub); +rxcpp::observable build_observable(); +void source_generator(rxcpp::subscriber sub); cudf::io::table_with_metadata from_json(const std::string &body) const; void close(); ``` -The `build_observable` method is responsible for constructing a Neo `Observable` for our source type, the result of which will be passed into our base's constructor. A Neo `Observable` is constructed by passing it a reference to a function (typically a lambda) which receives a reference to a Neo `Subscriber`. Typically, this function is the center of a source stage, making calls to the `Subscriber`'s `on_next`, `on_error`, and `on_completed` methods. For this example, the RabbitMQ-specific logic was broken out into the `source_generator` method, which should be analogous to the `source_generator` method from the Python class, and will emit new messages into the pipeline by calling `subscriber.on_next(message)`. +The `build_observable` method is responsible for constructing an `rxcpp::observable` for our source type, the result of which will be passed into our base's constructor. A `rxcpp::observable` is constructed by passing it a reference to a function (typically a lambda) which receives a reference to an `rxcpp::subscriber`. Typically, this function is the center of a source stage, making calls to the `subscriber`'s `on_next`, `on_error`, and `on_completed` methods. For this example, the RabbitMQ-specific logic was broken out into the `source_generator` method, which should be analogous to the `source_generator` method from the Python class, and will emit new messages into the pipeline by calling `subscriber.on_next(message)`. The `from_json` method parses a JSON string to a cuDF [table_with_metadata](https://docs.rapids.ai/api/libcudf/stable/structcudf_1_1io_1_1table__with__metadata.html). Lastly, the `close` method disconnects from the RabbitMQ exchange. @@ -99,7 +97,7 @@ Wrapping it all together, our header file should look like this: #pragma once #include // for MessageMeta -#include // for neo::pyneo::PythonSource +#include // for srf::pysrf::PythonSource #include // for cudf::io::table_with_metadata @@ -117,15 +115,13 @@ namespace morpheus_rabbit { using namespace std::literals; using namespace morpheus; -class RabbitMQSourceStage : public neo::pyneo::PythonSource> +class RabbitMQSourceStage : public srf::pysrf::PythonSource> { public: - using base_t = neo::pyneo::PythonSource>; + using base_t = srf::pysrf::PythonSource>; using base_t::source_type_t; - RabbitMQSourceStage(const neo::Segment &segment, - const std::string &name, - const std::string &host, + RabbitMQSourceStage(const std::string &host, const std::string &exchange, const std::string &exchange_type = "fanout"s, const std::string &queue_name = ""s, @@ -134,8 +130,8 @@ class RabbitMQSourceStage : public neo::pyneo::PythonSource build_observable(); - void source_generator(neo::Subscriber &sub); + rxcpp::observable build_observable(); + void source_generator(rxcpp::subscriber sub); cudf::io::table_with_metadata from_json(const std::string &body) const; void close(); @@ -154,7 +150,7 @@ struct RabbitMQSourceStageInterfaceProxy * @brief Create and initialize a RabbitMQSourceStage, and return the result. */ static std::shared_ptr init( - neo::Segment &segment, + srf::segment::Builder& builder, const std::string &name, const std::string &host, const std::string &exchange, @@ -173,8 +169,8 @@ Our includes section looks like: ```cpp #include "rabbitmq_source.hpp" -#include -#include +#include +#include #include #include @@ -189,9 +185,9 @@ Our includes section looks like: #include ``` -The two Neo includes bring in the actual definitions for Neo `Segment` and `SegmentObject`. The [Google Logging Library](https://github.com/google/glog) (glog) is used by Morpheus for logging; however, the choice of a logger is up to the individual developer. +The two SRF includes bring in the actual definitions for SRF `Builder` and `SegmentObject`. The [Google Logging Library](https://github.com/google/glog) (glog) is used by Morpheus for logging; however, the choice of a logger is up to the individual developer. -Neo uses the [Boost.Fiber](https://www.boost.org/doc/libs/1_77_0/libs/fiber/doc/html/fiber/overview.html) library to perform task scheduling. In the future, Neo will likely expose a configuration option to choose between fibers or `std::thread`. +SRF uses the [Boost.Fiber](https://www.boost.org/doc/libs/1_77_0/libs/fiber/doc/html/fiber/overview.html) library to perform task scheduling. In the future, SRF will likely expose a configuration option to choose between fibers or `std::thread`. For now, all Morpheus stages, both Python and C++, are executed within a fiber. In general, authors of a stage don't need to be too concerned about this detail, with two notable exceptions: 1. Rather than yielding or sleeping a thread, stage authors should instead call [boost::this_fiber::yield](https://www.boost.org/doc/libs/master/libs/fiber/doc/html/fiber/fiber_mgmt/this_fiber.html#this_fiber_yield) and [boost::this_fiber::sleep_for](https://www.boost.org/doc/libs/master/libs/fiber/doc/html/fiber/fiber_mgmt/this_fiber.html#this_fiber_sleep_for), respectively. 1. In cases where thread-local storage is desired, [fiber local storage](https://www.boost.org/doc/libs/1_77_0/libs/fiber/doc/html/fiber/fls.html) should be used instead. @@ -201,15 +197,12 @@ Authors of stages that require concurrency are free to choose their own concurre The definition for our constructor looks like this: ```cpp -RabbitMQSourceStage::RabbitMQSourceStage(const neo::Segment &segment, - const std::string &name, - const std::string &host, +RabbitMQSourceStage::RabbitMQSourceStage(const std::string &host, const std::string &exchange, const std::string &exchange_type, const std::string &queue_name, std::chrono::milliseconds poll_interval) : - neo::SegmentObject(segment, name), - base_t(segment, name, build_observable()), + base_t(build_observable()), m_channel{AmqpClient::Channel::Create(host)}, m_poll_interval{poll_interval} { @@ -222,28 +215,28 @@ RabbitMQSourceStage::RabbitMQSourceStage(const neo::Segment &segment, The key thing to note is that the third argument in the invocation of our base's constructor is our observable: ```cpp -base_t(segment, name, build_observable()) +base_t(build_observable()) ``` The observable argument to the constructor contains an empty default value, allowing stage authors to later define the observable by calling the `set_source_observable` method. The constructor could instead be written as: ```cpp -base_t(segment, name) +base_t() { this->set_source_observable(build_observable()); } ``` Our `build_observable` method returns an observable, which needs to do three things: -1. Emit data into the pipeline by calling `Subscriber`'s `on_next` method. In our example, this occurs in the `source_generator` method. -1. When an error occurs, call the `Subscriber`'s `on_error` method. -1. When we are done, call the `Subscriber`'s `on_complete` method. -Note: For some source stages, such as ones that read input data from a file, there is a clear point where the stage is complete. Others such as this one are intended to continue running until it is shut down. For the latter situation, the stage can poll the `Subscriber`'s `is_subscribed` method, which will return a value of `false` on shut down. +1. Emit data into the pipeline by calling `rxcpp::subscriber`'s `on_next` method. In our example, this occurs in the `source_generator` method. +1. When an error occurs, call the `rxcpp::subscriber`'s `on_error` method. +1. When we are done, call the `rxcpp::subscriber`'s `on_complete` method. +Note: For some source stages, such as ones that read input data from a file, there is a clear point where the stage is complete. Others such as this one are intended to continue running until it is shut down. For the latter situation, the stage can poll the `rxcpp::subscriber`'s `is_subscribed` method, which will return a value of `false` on shut down. ```cpp -neo::Observable RabbitMQSourceStage::build_observable() +rxcpp::observable RabbitMQSourceStage::build_observable() { - return neo::Observable([this](neo::Subscriber &subscriber) { + return rxcpp::observable<>::create([this](rxcpp::subscriber subscriber) { try { this->source_generator(subscriber); @@ -261,10 +254,10 @@ neo::Observable RabbitMQSourceStage::build_o } ``` -As a design decision, we left the majority of the RabbitMQ specific code in the `source_generator` method, leaving Morpheus specific code in the `build_observable` method. For each message that we receive and can successfully parse, we call the `Subscriber`'s `on_next` method. When there are no messages in the queue, we yield the fiber by sleeping, potentially allowing the scheduler to perform a context switch. +As a design decision, we left the majority of the RabbitMQ specific code in the `source_generator` method, leaving Morpheus specific code in the `build_observable` method. For each message that we receive and can successfully parse, we call the `rxcpp::subscriber`'s `on_next` method. When there are no messages in the queue, we yield the fiber by sleeping, potentially allowing the scheduler to perform a context switch. ```cpp -void RabbitMQSourceStage::source_generator(neo::Subscriber &subscriber) +void RabbitMQSourceStage::source_generator(rxcpp::subscriber subscriber) { const std::string consumer_tag = m_connection->BasicConsume(m_queue_name, "", true, false); while (subscriber.is_subscribed()) @@ -320,7 +313,7 @@ void RabbitMQSourceStage::close() ```cpp std::shared_ptr -RabbitMQSourceStageInterfaceProxy::init(neo::Segment &segment, +RabbitMQSourceStageInterfaceProxy::init(srf::segment::Builder& builder, const std::string &name, const std::string &host, const std::string &exchange, @@ -329,8 +322,8 @@ RabbitMQSourceStageInterfaceProxy::init(neo::Segment &segment, std::chrono::milliseconds poll_interval) { auto stage = - std::make_shared(segment, name, host, exchange, exchange_type, queue_name, poll_interval); - segment.register_node(stage); + builder.construct_object(name, host, exchange, exchange_type, queue_name, poll_interval); + return stage; } @@ -339,10 +332,10 @@ namespace py = pybind11; // Define the pybind11 module m. PYBIND11_MODULE(morpheus_rabbit, m) { - py::class_>( + py::class_>>( m, "RabbitMQSourceStage", py::multiple_inheritance()) .def(py::init<>(&RabbitMQSourceStageInterfaceProxy::init), - py::arg("segment"), + py::arg("builder"), py::arg("name"), py::arg("host"), py::arg("exchange"), @@ -358,8 +351,8 @@ Wrapping it all together, our source file should look like: ```cpp #include "rabbitmq_source.hpp" -#include -#include +#include +#include #include #include @@ -375,15 +368,12 @@ Wrapping it all together, our source file should look like: namespace morpheus_rabbit { -RabbitMQSourceStage::RabbitMQSourceStage(const neo::Segment &segment, - const std::string &name, - const std::string &host, +RabbitMQSourceStage::RabbitMQSourceStage(const std::string &host, const std::string &exchange, const std::string &exchange_type, const std::string &queue_name, std::chrono::milliseconds poll_interval) : - neo::SegmentObject(segment, name), - base_t(segment, name, build_observable()), + base_t(build_observable()), m_channel{AmqpClient::Channel::Create(host)}, m_poll_interval{poll_interval} { @@ -392,9 +382,9 @@ RabbitMQSourceStage::RabbitMQSourceStage(const neo::Segment &segment, m_channel->BindQueue(m_queue_name, exchange); } -neo::Observable RabbitMQSourceStage::build_observable() +rxcpp::observable RabbitMQSourceStage::build_observable() { - return neo::Observable([this](neo::Subscriber &subscriber) { + return rxcpp::observable([this](rxcpp::subscriber subscriber) { try { this->source_generator(subscriber); @@ -411,7 +401,7 @@ neo::Observable RabbitMQSourceStage::build_o }); } -void RabbitMQSourceStage::source_generator(neo::Subscriber &subscriber) +void RabbitMQSourceStage::source_generator(rxcpp::subscriber subscriber) { const std::string consumer_tag = m_channel->BasicConsume(m_queue_name, "", true, false); while (subscriber.is_subscribed()) @@ -455,8 +445,8 @@ void RabbitMQSourceStage::close() } // ************ WriteToFileStageInterfaceProxy ************* // -std::shared_ptr -RabbitMQSourceStageInterfaceProxy::init(neo::Segment &segment, +std::shared_ptr> +RabbitMQSourceStageInterfaceProxy::init(srf::segment::Builder& builder, const std::string &name, const std::string &host, const std::string &exchange, @@ -465,8 +455,8 @@ RabbitMQSourceStageInterfaceProxy::init(neo::Segment &segment, std::chrono::milliseconds poll_interval) { auto stage = - std::make_shared(segment, name, host, exchange, exchange_type, queue_name, poll_interval); - segment.register_node(stage); + builder.construct_object(name, host, exchange, exchange_type, queue_name, poll_interval); + return stage; } @@ -475,10 +465,10 @@ namespace py = pybind11; // Define the pybind11 module m. PYBIND11_MODULE(morpheus_rabbit, m) { - py::class_>( + py::class_>>( m, "RabbitMQSourceStage", py::multiple_inheritance()) .def(py::init<>(&RabbitMQSourceStageInterfaceProxy::init), - py::arg("segment"), + py::arg("builder"), py::arg("name"), py::arg("host"), py::arg("exchange"), @@ -539,10 +529,10 @@ def connect(self): Lastly, our `_build_source` method needs to be updated to build a C++ node when `morpheus.config.CppConfig` is configured to `True` by using the `self._build_cpp_node()` method. ```python -def _build_source(self, seg: neo.Segment) -> StreamPair: +def _build_source(self, builder: srf.Builder) -> StreamPair: if self._build_cpp_node(): node = morpheus_rabbit_cpp.RabbitMQSourceStage( - seg, + builder, self.unique_name, self._host, self._exchange, @@ -552,6 +542,6 @@ def _build_source(self, seg: neo.Segment) -> StreamPair: ) else: self.connect() - node = seg.make_source(self.unique_name, self.source_generator) + node = builder.make_source(self.unique_name, self.source_generator) return node, MessageMeta ``` diff --git a/examples/abp_pcap_detection/abp_pcap_preprocessing.py b/examples/abp_pcap_detection/abp_pcap_preprocessing.py index 7ffee619aa..741ddb24c4 100644 --- a/examples/abp_pcap_detection/abp_pcap_preprocessing.py +++ b/examples/abp_pcap_detection/abp_pcap_preprocessing.py @@ -16,12 +16,12 @@ from functools import partial import cupy as cp -import neo import numpy as np +import srf import cudf -import morpheus._lib.stages as neos +import morpheus._lib.stages as _stages from morpheus.config import Config from morpheus.messages import InferenceMemoryFIL from morpheus.messages import MultiInferenceFILMessage @@ -187,5 +187,5 @@ def _get_preprocess_fn(self) -> typing.Callable[[MultiMessage], MultiInferenceMe fea_cols=self.features, ) - def _get_preprocess_node(self, seg: neo.Segment): - return neos.AbpPcapPreprocessingStage(seg, self.unique_name) + def _get_preprocess_node(self, builder: srf.Builder): + return _stages.AbpPcapPreprocessingStage(builder, self.unique_name) diff --git a/examples/gnn_fraud_detection_pipeline/stages/classification_stage.py b/examples/gnn_fraud_detection_pipeline/stages/classification_stage.py index 6d736c2fcc..7192b63f8c 100644 --- a/examples/gnn_fraud_detection_pipeline/stages/classification_stage.py +++ b/examples/gnn_fraud_detection_pipeline/stages/classification_stage.py @@ -15,7 +15,7 @@ import typing -import neo +import srf import cuml @@ -52,7 +52,7 @@ def _process_message(self, message: GraphSAGEMultiMessage): return message - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - node = seg.make_node(self.unique_name, self._process_message) - seg.make_edge(input_stream[0], node) + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: + node = builder.make_node(self.unique_name, self._process_message) + builder.make_edge(input_stream[0], node) return node, MultiMessage diff --git a/examples/gnn_fraud_detection_pipeline/stages/graph_construction_stage.py b/examples/gnn_fraud_detection_pipeline/stages/graph_construction_stage.py index d56156cd64..ff8d1dd185 100644 --- a/examples/gnn_fraud_detection_pipeline/stages/graph_construction_stage.py +++ b/examples/gnn_fraud_detection_pipeline/stages/graph_construction_stage.py @@ -16,9 +16,9 @@ import dataclasses import typing -import neo import networkx as nx import pandas as pd +import srf from stellargraph import StellarGraph import cudf @@ -97,7 +97,7 @@ def _process_message(self, message: MultiMessage): mess_offset=message.mess_offset, mess_count=message.mess_count) - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - node = seg.make_node(self.unique_name, self._process_message) - seg.make_edge(input_stream[0], node) + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: + node = builder.make_node(self.unique_name, self._process_message) + builder.make_edge(input_stream[0], node) return node, FraudGraphMultiMessage diff --git a/examples/gnn_fraud_detection_pipeline/stages/graph_sage_stage.py b/examples/gnn_fraud_detection_pipeline/stages/graph_sage_stage.py index 28263734bf..004cf3065b 100644 --- a/examples/gnn_fraud_detection_pipeline/stages/graph_sage_stage.py +++ b/examples/gnn_fraud_detection_pipeline/stages/graph_sage_stage.py @@ -16,7 +16,7 @@ import dataclasses import typing -import neo +import srf import tensorflow as tf from stellargraph.mapper import HinSAGENodeGenerator @@ -94,7 +94,7 @@ def _process_message(self, message: FraudGraphMultiMessage): mess_offset=message.mess_offset, mess_count=message.mess_count) - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - node = seg.make_node(self.unique_name, self._process_message) - seg.make_edge(input_stream[0], node) + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: + node = builder.make_node(self.unique_name, self._process_message) + builder.make_edge(input_stream[0], node) return node, GraphSAGEMultiMessage diff --git a/examples/log_parsing/inference.py b/examples/log_parsing/inference.py index 99034605bc..8e2b114db1 100644 --- a/examples/log_parsing/inference.py +++ b/examples/log_parsing/inference.py @@ -17,11 +17,11 @@ from functools import partial import cupy as cp -import neo import numpy as np +import srf import tritonclient.grpc as tritonclient -from neo.core import operators as ops from scipy.special import softmax +from srf.core import operators as ops from messages import MultiPostprocLogParsingMessage from messages import MultiResponseLogParsingMessage @@ -191,12 +191,12 @@ def supports_cpp_node(self): # Get the value from the worker class return False - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: stream = input_stream[0] out_type = MultiResponseLogParsingMessage - def py_inference_fn(input: neo.Observable, output: neo.Subscriber): + def py_inference_fn(obs: srf.Observable, sub: srf.Subscriber): worker = self._get_inference_worker(self._inf_queue) @@ -218,9 +218,9 @@ def on_next(x: MultiInferenceMessage): for batch in batches: outstanding_requests += 1 - fut = neo.Future() + fut = srf.Future() - def set_output_fut(resp: ResponseMemoryLogParsing, b, f: neo.Future): + def set_output_fut(resp: ResponseMemoryLogParsing, b, f: srf.Future): nonlocal outstanding_requests m = self._convert_one_response(memory, b, resp) @@ -237,18 +237,18 @@ def set_output_fut(resp: ResponseMemoryLogParsing, b, f: neo.Future): return output_message - input.pipe(ops.map(on_next)).subscribe(output) + obs.pipe(ops.map(on_next)).subscribe(sub) assert outstanding_requests == 0, "Not all inference requests were completed" if (self._build_cpp_node()): - node = self._get_cpp_inference_node(seg) + node = self._get_cpp_inference_node(builder) else: - node = seg.make_node_full(self.unique_name, py_inference_fn) + node = builder.make_node_full(self.unique_name, py_inference_fn) # Set the concurrency level to be up with the thread count - node.concurrency = self._thread_count - seg.make_edge(stream, node) + node.launch_options.pe_count = self._thread_count + builder.make_edge(stream, node) stream = node diff --git a/examples/log_parsing/postprocessing.py b/examples/log_parsing/postprocessing.py index 4ddfa2dee9..cc47a60942 100644 --- a/examples/log_parsing/postprocessing.py +++ b/examples/log_parsing/postprocessing.py @@ -16,9 +16,9 @@ import typing from collections import defaultdict -import neo import numpy as np import pandas as pd +import srf from messages import MultiPostprocLogParsingMessage from messages import MultiResponseLogParsingMessage @@ -137,11 +137,11 @@ def __decode_cleanup(self, df): return df - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: # Convert the messages to rows of strings - stream = seg.make_node(self.unique_name, self._postprocess) + stream = builder.make_node(self.unique_name, self._postprocess) - seg.make_edge(input_stream[0], stream) + builder.make_edge(input_stream[0], stream) return stream, MessageMeta diff --git a/examples/log_parsing/preprocessing.py b/examples/log_parsing/preprocessing.py index e6be76f051..0b8f4af3b0 100644 --- a/examples/log_parsing/preprocessing.py +++ b/examples/log_parsing/preprocessing.py @@ -16,11 +16,11 @@ import typing from functools import partial -import neo +import srf import cudf -import morpheus._lib.stages as neos +import morpheus._lib.stages as _stages from morpheus.config import Config from morpheus.messages import InferenceMemoryNLP from morpheus.messages import MultiInferenceMessage @@ -163,12 +163,12 @@ def _get_preprocess_fn(self) -> typing.Callable[[MultiMessage], MultiInferenceMe truncation=self._truncation, add_special_tokens=self._add_special_tokens) - def _get_preprocess_node(self, seg: neo.Segment): - return neos.PreprocessNLPStage(seg, - self.unique_name, - self._vocab_hash_file, - self._seq_length, - self._truncation, - self._do_lower_case, - self._add_special_tokens, - self._stride) + def _get_preprocess_node(self, builder: srf.Builder): + return _stages.PreprocessNLPStage(builder, + self.unique_name, + self._vocab_hash_file, + self._seq_length, + self._truncation, + self._do_lower_case, + self._add_special_tokens, + self._stride) diff --git a/models/mlflow/docker/conda/mlflow-env.yml b/models/mlflow/docker/conda/mlflow-env.yml index dac79581a2..a465e85769 100644 --- a/models/mlflow/docker/conda/mlflow-env.yml +++ b/models/mlflow/docker/conda/mlflow-env.yml @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: mlflow channels: - conda-forge diff --git a/morpheus.code-workspace b/morpheus.code-workspace index 8f71d89402..a4ee3e30c2 100644 --- a/morpheus.code-workspace +++ b/morpheus.code-workspace @@ -330,7 +330,7 @@ "justMyCode": false }, { - "name": "Debug Neo from Python (Morpheus-NLP)", + "name": "Debug SRF from Python (Morpheus-NLP)", "type": "cppdbg", "request": "launch", "program": "python", @@ -415,7 +415,7 @@ ], "symbolLoadInfo": { "loadAll": false, - "exceptionList": "libneo*.so;cudf_helpers.*;executor.*;morpheus.*;node.*;options.*;pipeline.*;segment.*;subscriber.*;stages.*;messages.*;common*.so" + "exceptionList": "libsrf*.so;cudf_helpers.*;executor.*;morpheus.*;node.*;options.*;pipeline.*;segment.*;subscriber.*;stages.*;messages.*;common*.so" }, "miDebuggerPath": "gdb", "sourceFileMap": { @@ -426,7 +426,7 @@ }, }, { - "name": "Debug Neo from Python (Morpheus-FIL)", + "name": "Debug SRF from Python (Morpheus-FIL)", "type": "cppdbg", "request": "launch", "program": "python", @@ -441,7 +441,7 @@ // "--use_cpp=False", "pipeline-fil", "from-file", - "--filename=models/datasets/validation-data/phishing-email-validation-data.jsonlines", + "--filename=models/datasets/validation-data/abp-validation-data.csv", "--repeat=10", "--iterative", // "from-kafka", @@ -508,7 +508,7 @@ ], "symbolLoadInfo": { "loadAll": false, - "exceptionList": "libneo*.so;cudf_helpers.*;executor.*;morpheus.*;node.*;options.*;pipeline.*;segment.*;subscriber.*;stages.*;messages.*;common*.so" + "exceptionList": "libsrf*.so;cudf_helpers.*;executor.*;morpheus.*;node.*;options.*;pipeline.*;segment.*;subscriber.*;stages.*;messages.*;common*.so" }, "miDebuggerPath": "gdb", "sourceFileMap": { @@ -519,7 +519,7 @@ }, }, { - "name": "Debug Neo from Python (Morpheus-AE)", + "name": "Debug SRF from Python (Morpheus-AE)", "type": "cppdbg", "request": "launch", "program": "python", @@ -599,7 +599,7 @@ ], "symbolLoadInfo": { "loadAll": false, - "exceptionList": "libneo*.so;cudf_helpers.*;executor.*;morpheus.*;node.*;options.*;pipeline.*;segment.*;subscriber.*;stages.*;messages.*;common*.so" + "exceptionList": "libsrf*.so;cudf_helpers.*;executor.*;morpheus.*;node.*;options.*;pipeline.*;segment.*;subscriber.*;stages.*;messages.*;common*.so" }, "miDebuggerPath": "gdb", "sourceFileMap": { diff --git a/morpheus/_lib/cmake/libraries/cuda_utils.cmake b/morpheus/_lib/cmake/libraries/cuda_utils.cmake index 71a9e1e0bb..bc769d6230 100644 --- a/morpheus/_lib/cmake/libraries/cuda_utils.cmake +++ b/morpheus/_lib/cmake/libraries/cuda_utils.cmake @@ -30,7 +30,7 @@ target_include_directories(cuda_utils target_link_libraries(cuda_utils PUBLIC - neo::pyneo + srf::pysrf matx::matx cudf::cudf Python3::NumPy diff --git a/morpheus/_lib/cmake/python_modules/common.cmake b/morpheus/_lib/cmake/python_modules/common.cmake index 6175086646..c5e1845b79 100644 --- a/morpheus/_lib/cmake/python_modules/common.cmake +++ b/morpheus/_lib/cmake/python_modules/common.cmake @@ -22,7 +22,7 @@ morpheus_add_pybind11_module( "${MORPHEUS_LIB_ROOT}/include" LINK_TARGETS morpheus - neo::pyneo + srf::pysrf OUTPUT_TARGET common_target INSTALL_DEST diff --git a/morpheus/_lib/cmake/python_modules/file_types.cmake b/morpheus/_lib/cmake/python_modules/file_types.cmake index e8c1b2b095..d89906d057 100644 --- a/morpheus/_lib/cmake/python_modules/file_types.cmake +++ b/morpheus/_lib/cmake/python_modules/file_types.cmake @@ -22,7 +22,7 @@ morpheus_add_pybind11_module( "${MORPHEUS_LIB_ROOT}/include" LINK_TARGETS morpheus - neo::pyneo + srf::pysrf OUTPUT_TARGET file_types_target INSTALL_DEST diff --git a/morpheus/_lib/cmake/python_modules/messages.cmake b/morpheus/_lib/cmake/python_modules/messages.cmake index a285645809..c2e26d4fc2 100644 --- a/morpheus/_lib/cmake/python_modules/messages.cmake +++ b/morpheus/_lib/cmake/python_modules/messages.cmake @@ -22,7 +22,7 @@ morpheus_add_pybind11_module( "${MORPHEUS_LIB_ROOT}/include" LINK_TARGETS morpheus - neo::pyneo + srf::pysrf OUTPUT_TARGET messages_target INSTALL_DEST diff --git a/morpheus/_lib/cmake/python_modules/stages.cmake b/morpheus/_lib/cmake/python_modules/stages.cmake index 86d167063f..edec24f416 100644 --- a/morpheus/_lib/cmake/python_modules/stages.cmake +++ b/morpheus/_lib/cmake/python_modules/stages.cmake @@ -22,7 +22,7 @@ morpheus_add_pybind11_module( "${MORPHEUS_LIB_ROOT}/include" LINK_TARGETS morpheus - neo::pyneo + srf::pysrf OUTPUT_TARGET stages_target INSTALL_DEST diff --git a/morpheus/_lib/include/morpheus/objects/rmm_tensor.hpp b/morpheus/_lib/include/morpheus/objects/rmm_tensor.hpp index 24d0549c62..2f31640715 100644 --- a/morpheus/_lib/include/morpheus/objects/rmm_tensor.hpp +++ b/morpheus/_lib/include/morpheus/objects/rmm_tensor.hpp @@ -18,19 +18,13 @@ #pragma once #include -#include #include -#include - #include #include #include -#include -#include - #include #include #include @@ -51,7 +45,7 @@ class RMMTensor : public ITensor std::vector shape, std::vector stride = {}); - ~RMMTensor() = default; + ~RMMTensor() override = default; /** * TODO(Documentation) @@ -87,7 +81,7 @@ class RMMTensor : public ITensor /** * TODO(Documentation) */ - std::shared_ptr get_memory() const override; + std::shared_ptr get_memory() const override; /** * TODO(Documentation) diff --git a/morpheus/_lib/include/morpheus/objects/tensor.hpp b/morpheus/_lib/include/morpheus/objects/tensor.hpp index 628671235f..038c110510 100644 --- a/morpheus/_lib/include/morpheus/objects/tensor.hpp +++ b/morpheus/_lib/include/morpheus/objects/tensor.hpp @@ -22,7 +22,7 @@ #include #include -#include +#include #include diff --git a/morpheus/_lib/include/morpheus/objects/tensor_object.hpp b/morpheus/_lib/include/morpheus/objects/tensor_object.hpp index 71aa642e67..8d26f4ee90 100644 --- a/morpheus/_lib/include/morpheus/objects/tensor_object.hpp +++ b/morpheus/_lib/include/morpheus/objects/tensor_object.hpp @@ -19,24 +19,17 @@ #include -#include -#include -#include -#include -#include // for memory_kind_type -#include +#include -#include // for cudaMemcpyDeviceToHost & cudaMemcpy +#include +#include +#include +#include // for memory_kind_type +#include // for cudaMemcpyDeviceToHost & cudaMemcpy #include // for CHECK - #include -#include -#include -#include -#include - #include #include #include // for size_t, byte @@ -75,7 +68,7 @@ std::string join(IterT begin, IterT end, std::string const& separator) template std::string array_to_str(IterT begin, IterT end) { - return CONCAT_STR("[" << join(begin, end, ", ") << "]"); + return MORPHEUS_CONCAT_STR("[" << join(begin, end, ", ") << "]"); } template @@ -123,24 +116,21 @@ enum class TensorStorageType }; template -using HostContainer = std::vector>; - -template -using DeviceContainer = rmm::device_uvector; +using HostContainer = std::vector>; // NOLINT(readability-identifier-naming) template -using HostArray = xt::xarray_container>; +using DeviceContainer = rmm::device_uvector; // NOLINT(readability-identifier-naming) -template -using HostTensor = xt::xtensor_container, R>; +struct MemoryDescriptor +{}; struct ITensorStorage { virtual ~ITensorStorage() = default; virtual void* data() const = 0; // virtual const void* data() const = 0; - virtual std::size_t bytes() const = 0; - virtual std::shared_ptr get_memory() const = 0; + virtual std::size_t bytes() const = 0; + virtual std::shared_ptr get_memory() const = 0; // virtual TensorStorageType storage_type() const = 0; }; @@ -188,30 +178,6 @@ struct ITensor : public ITensorStorage, public ITensorOperations } }; -struct IHostTensor : public ITensor -{ - ~IHostTensor() override = default; - - // todo: test for column major - this only works with row major - auto bytes_view() - { - using byte_t = std::byte; - xt::xarray::shape_type shape(this->rank() + 1); - xt::xarray::shape_type stride(this->rank() + 1); - for (int i = 0; i < this->rank(); ++i) - { - shape[i] = this->shape(i); - } - shape[this->rank()] = this->dtype().item_size(); - stride[this->rank()] = 1; - for (int i = this->rank() - 1; i < 0; --i) - { - stride[i] = this->stride(i) * this->dtype().item_size(); - } - return xt::adapt(static_cast(this->data()), this->bytes(), xt::no_ownership(), shape, stride); - } -}; - #if 0 template class TensorDescriptor @@ -368,13 +334,13 @@ template #endif -class TensorView : public neo::memory::blob +class TensorView : public srf::memory::blob { public: TensorView() = delete; - TensorView(neo::memory::blob bv, DataType dtype, std::vector shape); - TensorView(neo::memory::blob bv, DataType dtype, std::vector shape, std::vector stride); + TensorView(srf::memory::blob bv, DataType dtype, std::vector shape); + TensorView(srf::memory::blob bv, DataType dtype, std::vector shape, std::vector stride); const DataType& dtype() const; @@ -400,7 +366,7 @@ struct TensorObject final { TensorObject() = default; - TensorObject(std::shared_ptr md, std::shared_ptr tensor) : + TensorObject(std::shared_ptr md, std::shared_ptr tensor) : m_md(std::move(md)), m_tensor(std::move(tensor)) {} @@ -498,7 +464,7 @@ struct TensorObject final out_data.resize(this->bytes()); - NEO_CHECK_CUDA(cudaMemcpy(&out_data[0], this->data(), this->bytes(), cudaMemcpyDeviceToHost)); + SRF_CHECK_CUDA(cudaMemcpy(&out_data[0], this->data(), this->bytes(), cudaMemcpyDeviceToHost)); return out_data; } @@ -525,7 +491,7 @@ struct TensorObject final T output; - NEO_CHECK_CUDA( + SRF_CHECK_CUDA( cudaMemcpy(&output, static_cast(this->data()) + offset, sizeof(T), cudaMemcpyDeviceToHost)); return output; @@ -553,7 +519,7 @@ struct TensorObject final T output; - NEO_CHECK_CUDA( + SRF_CHECK_CUDA( cudaMemcpy(&output, static_cast(this->data()) + offset, sizeof(T), cudaMemcpyDeviceToHost)); return output; @@ -599,7 +565,7 @@ struct TensorObject final DCHECK(this->bytes() == other.bytes()) << "Left and right bytes should be the same if all other test passed"; // Perform the copy operation - NEO_CHECK_CUDA(cudaMemcpy(this->data(), other.data(), this->bytes(), cudaMemcpyDeviceToDevice)); + SRF_CHECK_CUDA(cudaMemcpy(this->data(), other.data(), this->bytes(), cudaMemcpyDeviceToDevice)); return *this; } @@ -609,7 +575,7 @@ struct TensorObject final return m_tensor; } - std::shared_ptr get_memory() const + std::shared_ptr get_memory() const { return m_md; } @@ -634,138 +600,8 @@ struct TensorObject final void throw_on_invalid_storage(); private: - std::shared_ptr m_md; + std::shared_ptr m_md; std::shared_ptr m_tensor; }; -class GenericTensor : public ITensor -{ - public: - GenericTensor(std::shared_ptr md, - size_t offset, - DataType dtype, - const std::vector& shape, - const std::vector& stride = {}); - ~GenericTensor() = default; - - std::shared_ptr get_memory() const final - { - return m_md; - } - - void* data() const override - { - return static_cast(m_md->data()) + m_offset; - } - - DataType dtype() const override - { - return m_dtype; - } - - RankType rank() const final - { - return m_shape.size(); - } - - std::size_t count() const final - { - return std::accumulate(m_shape.begin(), m_shape.end(), 1, std::multiplies<>()); - } - - std::size_t bytes() const final - { - return count() * m_dtype.item_size(); - } - - std::size_t shape(std::size_t idx) const final - { - DCHECK_LT(idx, m_shape.size()); - return m_shape.at(idx); - } - - std::size_t stride(std::size_t idx) const final - { - DCHECK_LT(idx, m_stride.size()); - return m_stride.at(idx); - } - - bool is_compact() const final - { - TensorIndex ttl = 1; - for (int i = rank() - 1; i >= 0; i--) - { - if (stride(i) != ttl) - { - return false; - } - - ttl *= shape(i); - } - return true; - } - - std::shared_ptr slice(const std::vector& min_dims, - const std::vector& max_dims) const override - { - // Calc new offset - size_t offset = std::transform_reduce( - m_stride.begin(), m_stride.end(), min_dims.begin(), m_offset, std::plus<>(), std::multiplies<>()); - - // Calc new shape - std::vector shape; - std::transform(max_dims.begin(), max_dims.end(), min_dims.begin(), std::back_inserter(shape), std::minus<>()); - - // Stride remains the same - return std::make_shared(m_md, offset, m_dtype, shape, m_stride); - } - - std::shared_ptr reshape(const std::vector& dims) const override - { - if (is_compact()) - { - return std::make_shared(m_md, m_offset, m_dtype, dims); - } - else - { - throw std::runtime_error("Not supported non-compact reshape"); - } - } - - std::shared_ptr deep_copy() const override - { - auto copied_memory = m_md->get_allocator()->allocate_descriptor(m_md->size()).make_shared(); - - if (copied_memory->type() == neo::memory::memory_kind_type::device || - copied_memory->type() == neo::memory::memory_kind_type::managed) - { - NEO_CHECK_CUDA(cudaMemcpy(copied_memory->data(), m_md->data(), m_md->size(), cudaMemcpyDeviceToDevice)); - } - else - { - throw std::runtime_error("Not implemented"); - } - - return std::make_shared(copied_memory, m_offset, m_dtype, m_shape, m_stride); - } - - std::shared_ptr as_type(DataType dtype) const override - { - throw std::runtime_error("Not implemented"); - } - - protected: - private: - // Memory info - std::shared_ptr m_md; - size_t m_offset; - - // Type info - DataType m_dtype; - - // Shape info - std::vector m_shape; - std::vector m_stride; -}; - } // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/stages/add_classification.hpp b/morpheus/_lib/include/morpheus/stages/add_classification.hpp index 02ac1f8ad5..b430314560 100644 --- a/morpheus/_lib/include/morpheus/stages/add_classification.hpp +++ b/morpheus/_lib/include/morpheus/stages/add_classification.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,69 +17,66 @@ #pragma once - #include -#include -#include +#include +#include -#include #include - +#include namespace morpheus { - /****** Component public implementations *******************/ - /****** AddClassificationStage********************************/ +/****** Component public implementations *******************/ +/****** AddClassificationStage********************************/ +/** + * TODO(Documentation) + */ +#pragma GCC visibility push(default) +class AddClassificationsStage : public srf::pysrf::PythonNode, + std::shared_ptr> +{ + public: + using base_t = + srf::pysrf::PythonNode, std::shared_ptr>; + using typename base_t::sink_type_t; + using typename base_t::source_type_t; + using typename base_t::subscribe_fn_t; + /** * TODO(Documentation) */ -#pragma GCC visibility push(default) - class AddClassificationsStage : public neo::pyneo::PythonNode, - std::shared_ptr> { - public: - using base_t = - neo::pyneo::PythonNode, std::shared_ptr>; - using base_t::operator_fn_t; - using base_t::reader_type_t; - using base_t::writer_type_t; + AddClassificationsStage(float threshold, + std::size_t num_class_labels, + std::map idx2label); - /** - * TODO(Documentation) - */ - AddClassificationsStage(const neo::Segment &parent, - const std::string &name, - float threshold, - std::size_t num_class_labels, - std::map idx2label); + private: + /** + * TODO(Documentation) + */ + subscribe_fn_t build_operator(); - private: - /** - * TODO(Documentation) - */ - operator_fn_t build_operator(); + float m_threshold; + std::size_t m_num_class_labels; + std::map m_idx2label; +}; - float m_threshold; - std::size_t m_num_class_labels; - std::map m_idx2label; - }; +/****** AddClassificationStageInterfaceProxy******************/ +/** + * @brief Interface proxy, used to insulate python bindings. + */ - /****** AddClassificationStageInterfaceProxy******************/ +struct AddClassificationStageInterfaceProxy +{ /** - * @brief Interface proxy, used to insulate python bindings. + * @brief Create and initialize a AddClassificationStage, and return the result. */ - - struct AddClassificationStageInterfaceProxy { - - /** - * @brief Create and initialize a AddClassificationStage, and return the result. - */ - static std::shared_ptr - init(neo::Segment &parent, - const std::string &name, - float threshold, - std::size_t num_class_labels, - std::map idx2label); - }; + static std::shared_ptr> init( + srf::segment::Builder &builder, + const std::string &name, + float threshold, + std::size_t num_class_labels, + std::map idx2label); +}; #pragma GCC visibility pop -} \ No newline at end of file +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/stages/add_scores.hpp b/morpheus/_lib/include/morpheus/stages/add_scores.hpp index 2db6b6b152..63f1b6a23e 100644 --- a/morpheus/_lib/include/morpheus/stages/add_scores.hpp +++ b/morpheus/_lib/include/morpheus/stages/add_scores.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,60 +17,56 @@ #pragma once - #include -#include -#include +#include +#include -#include #include - +#include namespace morpheus { - /****** Component public implementations *******************/ - /****** AddScoresStage********************************/ - /** - * TODO(Documentation) - */ +/****** Component public implementations *******************/ +/****** AddScoresStage********************************/ +/** + * TODO(Documentation) + */ #pragma GCC visibility push(default) - class AddScoresStage : public neo::pyneo::PythonNode, - std::shared_ptr> { - public: - using base_t = - neo::pyneo::PythonNode, std::shared_ptr>; - using base_t::operator_fn_t; - using base_t::reader_type_t; - using base_t::writer_type_t; +class AddScoresStage : public srf::pysrf::PythonNode, + std::shared_ptr> +{ + public: + using base_t = + srf::pysrf::PythonNode, std::shared_ptr>; + using typename base_t::sink_type_t; + using typename base_t::source_type_t; + using typename base_t::subscribe_fn_t; - AddScoresStage(const neo::Segment &parent, - const std::string &name, - std::size_t num_class_labels, - std::map idx2label); + AddScoresStage(std::size_t num_class_labels, std::map idx2label); - /** - * TODO(Documentation) - */ - operator_fn_t build_operator(); + /** + * TODO(Documentation) + */ + subscribe_fn_t build_operator(); - std::size_t m_num_class_labels; - std::map m_idx2label; - }; + std::size_t m_num_class_labels; + std::map m_idx2label; +}; - /****** AddScoresStageInterfaceProxy******************/ +/****** AddScoresStageInterfaceProxy******************/ +/** + * @brief Interface proxy, used to insulate python bindings. + */ +struct AddScoresStageInterfaceProxy +{ /** - * @brief Interface proxy, used to insulate python bindings. + * @brief Create and initialize a AddScoresStage, and return the result. */ - struct AddScoresStageInterfaceProxy { - - /** - * @brief Create and initialize a AddScoresStage, and return the result. - */ - static std::shared_ptr init(neo::Segment &parent, - const std::string &name, - std::size_t num_class_labels, - std::map idx2label); - }; + static std::shared_ptr> init(srf::segment::Builder &builder, + const std::string &name, + std::size_t num_class_labels, + std::map idx2label); +}; #pragma GCC visibility pop -} \ No newline at end of file +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/stages/deserialization.hpp b/morpheus/_lib/include/morpheus/stages/deserialization.hpp index 7926fff47b..25c1a1d46a 100644 --- a/morpheus/_lib/include/morpheus/stages/deserialization.hpp +++ b/morpheus/_lib/include/morpheus/stages/deserialization.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,52 +17,53 @@ #pragma once - #include #include -#include -#include +#include +#include -#include #include - +#include namespace morpheus { - /****** Component public implementations *******************/ - /****** DeserializationStage********************************/ - /** - * TODO(Documentation) - */ +/****** Component public implementations *******************/ +/****** DeserializationStage********************************/ +/** + * TODO(Documentation) + */ #pragma GCC visibility push(default) - class DeserializeStage - : public neo::pyneo::PythonNode, std::shared_ptr> { - public: - using base_t = neo::pyneo::PythonNode, std::shared_ptr>; - using base_t::operator_fn_t; - using base_t::reader_type_t; - using base_t::writer_type_t; +class DeserializeStage : public srf::pysrf::PythonNode, std::shared_ptr> +{ + public: + using base_t = srf::pysrf::PythonNode, std::shared_ptr>; + using typename base_t::sink_type_t; + using typename base_t::source_type_t; + using typename base_t::subscribe_fn_t; - DeserializeStage(const neo::Segment &parent, const std::string &name, size_t batch_size); + DeserializeStage(size_t batch_size); - private: - /** - * TODO(Documentation) - */ - operator_fn_t build_operator(); + private: + /** + * TODO(Documentation) + */ + subscribe_fn_t build_operator(); - size_t m_batch_size; - }; + size_t m_batch_size; +}; - /****** DeserializationStageInterfaceProxy******************/ +/****** DeserializationStageInterfaceProxy******************/ +/** + * @brief Interface proxy, used to insulate python bindings. + */ +struct DeserializeStageInterfaceProxy +{ /** - * @brief Interface proxy, used to insulate python bindings. + * @brief Create and initialize a DeserializationStage, and return the result. */ - struct DeserializeStageInterfaceProxy { - /** - * @brief Create and initialize a DeserializationStage, and return the result. - */ - static std::shared_ptr init(neo::Segment &parent, const std::string &name, size_t batch_size); - }; + static std::shared_ptr> init(srf::segment::Builder &builder, + const std::string &name, + size_t batch_size); +}; #pragma GCC visibility pop -} \ No newline at end of file +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/stages/file_source.hpp b/morpheus/_lib/include/morpheus/stages/file_source.hpp index 0e995d23d5..6d2426cbf5 100644 --- a/morpheus/_lib/include/morpheus/stages/file_source.hpp +++ b/morpheus/_lib/include/morpheus/stages/file_source.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,48 +19,52 @@ #include -#include +#include +#include -#include #include - +#include namespace morpheus { - /****** Component public implementations *******************/ - /****** FileSourceStage*************************************/ - /** - * TODO(Documentation) - */ +/****** Component public implementations *******************/ +/****** FileSourceStage*************************************/ +/** + * TODO(Documentation) + */ #pragma GCC visibility push(default) - class FileSourceStage : public neo::pyneo::PythonSource> { - public: - using base_t = neo::pyneo::PythonSource>; - using base_t::source_type_t; +class FileSourceStage : public srf::pysrf::PythonSource> +{ + public: + using base_t = srf::pysrf::PythonSource>; + using typename base_t::source_type_t; + using typename base_t::subscriber_fn_t; - FileSourceStage(const neo::Segment &parent, const std::string &name, std::string filename, int repeat = 1); + FileSourceStage(std::string filename, int repeat = 1); - private: - - /** - * TODO(Documentation) - */ - cudf::io::table_with_metadata load_table(); - - std::string m_filename; - int m_repeat{1}; - }; + private: + subscriber_fn_t build(); + /** + * TODO(Documentation) + */ + cudf::io::table_with_metadata load_table(); + std::string m_filename; + int m_repeat{1}; +}; - /****** FileSourceStageInterfaceProxy***********************/ +/****** FileSourceStageInterfaceProxy***********************/ +/** + * @brief Interface proxy, used to insulate python bindings. + */ +struct FileSourceStageInterfaceProxy +{ /** - * @brief Interface proxy, used to insulate python bindings. + * @brief Create and initialize a FileSourceStage, and return the result. */ - struct FileSourceStageInterfaceProxy { - /** - * @brief Create and initialize a FileSourceStage, and return the result. - */ - static std::shared_ptr - init(neo::Segment &parent, const std::string &name, std::string filename, int repeat = 1); - }; + static std::shared_ptr> init(srf::segment::Builder &builder, + const std::string &name, + std::string filename, + int repeat = 1); +}; #pragma GCC visibility pop -} // Morpheus \ No newline at end of file +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/stages/filter_detection.hpp b/morpheus/_lib/include/morpheus/stages/filter_detection.hpp index 87108749ce..e3b1e53e0f 100644 --- a/morpheus/_lib/include/morpheus/stages/filter_detection.hpp +++ b/morpheus/_lib/include/morpheus/stages/filter_detection.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,54 +17,54 @@ #pragma once - #include -#include -#include +#include +#include -#include #include - +#include namespace morpheus { - /****** Component public implementations *******************/ - /****** FilterDetectionStage********************************/ - /** - * TODO(Documentation) - */ +/****** Component public implementations *******************/ +/****** FilterDetectionStage********************************/ +/** + * TODO(Documentation) + */ #pragma GCC visibility push(default) - class FilterDetectionsStage : public neo::pyneo::PythonNode, - std::shared_ptr> { - public: - using base_t = - neo::pyneo::PythonNode, std::shared_ptr>; - using base_t::operator_fn_t; - using base_t::reader_type_t; - using base_t::writer_type_t; +class FilterDetectionsStage : public srf::pysrf::PythonNode, + std::shared_ptr> +{ + public: + using base_t = + srf::pysrf::PythonNode, std::shared_ptr>; + using typename base_t::sink_type_t; + using typename base_t::source_type_t; + using typename base_t::subscribe_fn_t; - FilterDetectionsStage(const neo::Segment &parent, const std::string &name, float threshold); + FilterDetectionsStage(float threshold); - private: - operator_fn_t build_operator(); + private: + subscribe_fn_t build_operator(); - float m_threshold; - std::size_t m_num_class_labels; - std::map m_idx2label; - }; + float m_threshold; + std::size_t m_num_class_labels; + std::map m_idx2label; +}; - /****** FilterDetectionStageInterfaceProxy******************/ +/****** FilterDetectionStageInterfaceProxy******************/ +/** + * @brief Interface proxy, used to insulate python bindings. + */ +struct FilterDetectionStageInterfaceProxy +{ /** - * @brief Interface proxy, used to insulate python bindings. + * @brief Create and initialize a FilterDetectionStage, and return the result. */ - struct FilterDetectionStageInterfaceProxy { - - /** - * @brief Create and initialize a FilterDetectionStage, and return the result. - */ - static std::shared_ptr - init(neo::Segment &parent, const std::string &name, float threshold); - }; + static std::shared_ptr> init(srf::segment::Builder &builder, + const std::string &name, + float threshold); +}; #pragma GCC visibility pop -} \ No newline at end of file +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/stages/kafka_source.hpp b/morpheus/_lib/include/morpheus/stages/kafka_source.hpp index 0b162fe871..eb1eb8e4ee 100644 --- a/morpheus/_lib/include/morpheus/stages/kafka_source.hpp +++ b/morpheus/_lib/include/morpheus/stages/kafka_source.hpp @@ -19,116 +19,110 @@ #include -#include -#include -#include +#include +#include +#include +#include -#include #include +#include -#include #include +#include #include - namespace morpheus { - /****** Component public implementations *******************/ - /****** KafkaSourceStage************************************/ +/****** Component public implementations *******************/ +/****** KafkaSourceStage************************************/ +/** + * TODO(Documentation) + */ +#pragma GCC visibility push(default) + +class KafkaSourceStage : public srf::pysrf::PythonSource> +{ + public: + using base_t = srf::pysrf::PythonSource>; + using typename base_t::source_type_t; + using typename base_t::subscriber_fn_t; + + KafkaSourceStage(size_t max_batch_size, + std::string topic, + int32_t batch_timeout_ms, + std::map config, + bool disable_commit = false, + bool disable_pre_filtering = false); + + ~KafkaSourceStage() override = default; + + /** + * @return maximum batch size for KafkaSource + */ + std::size_t max_batch_size(); + + /** + * @return batch timeout in ms + */ + int32_t batch_timeout_ms(); + + private: /** * TODO(Documentation) */ -#pragma GCC visibility push(default) - class KafkaSourceStage : public neo::pyneo::PythonSource> { - public: - using base_t = neo::pyneo::PythonSource>; - using base_t::source_type_t; - - KafkaSourceStage(const neo::Segment &parent, - const std::string &name, - size_t max_batch_size, - std::string topic, - int32_t batch_timeout_ms, - std::map config, - bool disable_commit = false, - bool disable_pre_filtering = false); - - ~KafkaSourceStage() override = default; - - - /** - * @return maximum batch size for KafkaSource - */ - std::size_t max_batch_size(); - - /** - * @return batch timeout in ms - */ - int32_t batch_timeout_ms(); - - private: - /** - * TODO(Documentation) - */ - void start() override; - - /** - * TODO(Documentation) - */ - std::unique_ptr build_kafka_conf(const std::map &config_in); - - /** - * TODO(Documentation) - */ - neo::SharedFuture launch_tasks(std::vector> &&tasks); - - /** - * TODO(Documentation) - */ - std::unique_ptr create_consumer(); - - /** - * TODO(Documentation) - */ - cudf::io::table_with_metadata load_table(const std::string &buffer); - - /** - * TODO(Documentation) - */ - std::shared_ptr - process_batch(std::vector> &&message_batch); - - size_t m_max_batch_size{128}; - uint32_t m_batch_timeout_ms{100}; - - std::string m_topic{"test_pcap"}; - std::map m_config; - - bool m_disable_commit{false}; - bool m_disable_pre_filtering{false}; - bool m_requires_commit{false}; // Whether or not manual committing is required - std::vector>> m_task_queues; - - void *m_rebalancer; - }; - - /****** KafkaSourceStageInferenceProxy**********************/ + subscriber_fn_t build(); + + /** + * TODO(Documentation) + */ + std::unique_ptr build_kafka_conf(const std::map &config_in); + + /** + * TODO(Documentation) + */ + std::unique_ptr create_consumer(RdKafka::RebalanceCb &rebalancer); + + /** + * TODO(Documentation) + */ + cudf::io::table_with_metadata load_table(const std::string &buffer); + + /** + * TODO(Documentation) + */ + std::shared_ptr process_batch( + std::vector> &&message_batch); + + size_t m_max_batch_size{128}; + uint32_t m_batch_timeout_ms{100}; + + std::string m_topic{"test_pcap"}; + std::map m_config; + + bool m_disable_commit{false}; + bool m_disable_pre_filtering{false}; + bool m_requires_commit{false}; // Whether or not manual committing is required + + void *m_rebalancer; +}; + +/****** KafkaSourceStageInferenceProxy**********************/ +/** + * @brief Interface proxy, used to insulate python bindings. + */ +struct KafkaSourceStageInterfaceProxy +{ /** - * @brief Interface proxy, used to insulate python bindings. + * @brief Create and initialize a KafkaSourceStage, and return the result. */ - struct KafkaSourceStageInterfaceProxy { - /** - * @brief Create and initialize a KafkaSourceStage, and return the result. - */ - static std::shared_ptr init( - neo::Segment &parent, - const std::string &name, - size_t max_batch_size, - std::string topic, - int32_t batch_timeout_ms, - std::map config, - bool disable_commits, - bool disable_pre_filtering); - }; + static std::shared_ptr> init(srf::segment::Builder &builder, + const std::string &name, + size_t max_batch_size, + std::string topic, + int32_t batch_timeout_ms, + std::map config, + bool disable_commits, + bool disable_pre_filtering); +}; #pragma GCC visibility pop -} \ No newline at end of file +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/stages/preprocess_fil.hpp b/morpheus/_lib/include/morpheus/stages/preprocess_fil.hpp index 09d692f16c..481a47a4c4 100644 --- a/morpheus/_lib/include/morpheus/stages/preprocess_fil.hpp +++ b/morpheus/_lib/include/morpheus/stages/preprocess_fil.hpp @@ -20,7 +20,8 @@ #include #include -#include +#include +#include #include #include @@ -33,21 +34,21 @@ namespace morpheus { */ #pragma GCC visibility push(default) class PreprocessFILStage - : public neo::pyneo::PythonNode, std::shared_ptr> + : public srf::pysrf::PythonNode, std::shared_ptr> { public: - using base_t = neo::pyneo::PythonNode, std::shared_ptr>; - using base_t::operator_fn_t; - using base_t::reader_type_t; - using base_t::writer_type_t; + using base_t = srf::pysrf::PythonNode, std::shared_ptr>; + using typename base_t::sink_type_t; + using typename base_t::source_type_t; + using typename base_t::subscribe_fn_t; - PreprocessFILStage(const neo::Segment& parent, const std::string& name, const std::vector& features); + PreprocessFILStage(const std::vector& features); private: /** * TODO(Documentation) */ - operator_fn_t build_operator(); + subscribe_fn_t build_operator(); std::vector m_fea_cols; std::string m_vocab_file; @@ -62,9 +63,9 @@ struct PreprocessFILStageInterfaceProxy /** * @brief Create and initialize a PreprocessFILStage, and return the result. */ - static std::shared_ptr init(neo::Segment& parent, - const std::string& name, - const std::vector& features); + static std::shared_ptr> init(srf::segment::Builder& builder, + const std::string& name, + const std::vector& features); }; #pragma GCC visibility pop } // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/stages/preprocess_nlp.hpp b/morpheus/_lib/include/morpheus/stages/preprocess_nlp.hpp index dd8be4bedd..7b0c6c2682 100644 --- a/morpheus/_lib/include/morpheus/stages/preprocess_nlp.hpp +++ b/morpheus/_lib/include/morpheus/stages/preprocess_nlp.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,68 +20,66 @@ #include #include -#include +#include +#include -#include #include +#include +namespace morpheus { +/****** Component public implementations *******************/ +/****** PreprocessNLPStage**********************************/ +/** + * TODO(Documentation) + */ +#pragma GCC visibility push(default) +class PreprocessNLPStage + : public srf::pysrf::PythonNode, std::shared_ptr> +{ + public: + using base_t = srf::pysrf::PythonNode, std::shared_ptr>; + using typename base_t::sink_type_t; + using typename base_t::source_type_t; + using typename base_t::subscribe_fn_t; + PreprocessNLPStage(std::string vocab_hash_file, + uint32_t sequence_length, + bool truncation, + bool do_lower_case, + bool add_special_token, + int stride = -1); -namespace morpheus { - /****** Component public implementations *******************/ - /****** PreprocessNLPStage**********************************/ + private: /** * TODO(Documentation) */ -#pragma GCC visibility push(default) - class PreprocessNLPStage - : public neo::pyneo::PythonNode, std::shared_ptr> { - public: - using base_t = neo::pyneo::PythonNode, std::shared_ptr>; - using base_t::operator_fn_t; - using base_t::reader_type_t; - using base_t::writer_type_t; - - PreprocessNLPStage(const neo::Segment &parent, - const std::string &name, - std::string vocab_hash_file, - uint32_t sequence_length, - bool truncation, - bool do_lower_case, - bool add_special_token, - int stride = -1); - - private: - /** - * TODO(Documentation) - */ - operator_fn_t build_operator(); + subscribe_fn_t build_operator(); - std::string m_vocab_hash_file; - uint32_t m_sequence_length; - bool m_truncation; - bool m_do_lower_case; - bool m_add_special_token; - int m_stride{-1}; - }; + std::string m_vocab_hash_file; + uint32_t m_sequence_length; + bool m_truncation; + bool m_do_lower_case; + bool m_add_special_token; + int m_stride{-1}; +}; - - /****** PreprocessNLPStageInferenceProxy********************/ +/****** PreprocessNLPStageInferenceProxy********************/ +/** + * @brief Interface proxy, used to insulate python bindings. + */ +struct PreprocessNLPStageInterfaceProxy +{ /** - * @brief Interface proxy, used to insulate python bindings. + * @brief Create and initialize a ProcessNLPStage, and return the result. */ - struct PreprocessNLPStageInterfaceProxy { - /** - * @brief Create and initialize a ProcessNLPStage, and return the result. - */ - static std::shared_ptr init(neo::Segment &parent, - const std::string &name, - std::string vocab_hash_file, - uint32_t sequence_length, - bool truncation, - bool do_lower_case, - bool add_special_token, - int stride = -1); - }; + static std::shared_ptr> init(srf::segment::Builder &builder, + const std::string &name, + std::string vocab_hash_file, + uint32_t sequence_length, + bool truncation, + bool do_lower_case, + bool add_special_token, + int stride = -1); +}; #pragma GCC visibility pop -} \ No newline at end of file +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/stages/serialize.hpp b/morpheus/_lib/include/morpheus/stages/serialize.hpp index cb5c865b39..0072645b48 100644 --- a/morpheus/_lib/include/morpheus/stages/serialize.hpp +++ b/morpheus/_lib/include/morpheus/stages/serialize.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,8 +19,8 @@ #include -#include -#include +#include +#include #include #include @@ -28,58 +28,58 @@ #include namespace morpheus { - /****** Component public implementations *******************/ - /****** SerializeStage********************************/ - /** - * TODO(Documentation) - */ +/****** Component public implementations *******************/ +/****** SerializeStage********************************/ +/** + * TODO(Documentation) + */ #pragma GCC visibility push(default) - class SerializeStage : public neo::pyneo::PythonNode, std::shared_ptr> { - public: - using base_t = neo::pyneo::PythonNode, std::shared_ptr>; - using base_t::operator_fn_t; - using base_t::reader_type_t; - using base_t::writer_type_t; +class SerializeStage : public srf::pysrf::PythonNode, std::shared_ptr> +{ + public: + using base_t = srf::pysrf::PythonNode, std::shared_ptr>; + using typename base_t::sink_type_t; + using typename base_t::source_type_t; + using typename base_t::subscribe_fn_t; - SerializeStage(const neo::Segment &parent, - const std::string &name, - const std::vector &include, - const std::vector &exclude, - bool fixed_columns = true); + SerializeStage(const std::vector &include, + const std::vector &exclude, + bool fixed_columns = true); - private: - void make_regex_objs(const std::vector ®ex_strs, std::vector ®ex_objs); + private: + void make_regex_objs(const std::vector ®ex_strs, std::vector ®ex_objs); - bool match_column(const std::vector &patterns, const std::string &column) const; + bool match_column(const std::vector &patterns, const std::string &column) const; - bool include_column(const std::string &column) const; + bool include_column(const std::string &column) const; - bool exclude_column(const std::string &column) const; + bool exclude_column(const std::string &column) const; - TableInfo get_meta(reader_type_t &msg); + TableInfo get_meta(sink_type_t &msg); - operator_fn_t build_operator(); + subscribe_fn_t build_operator(); - bool m_fixed_columns; - std::vector m_include; - std::vector m_exclude; - std::vector m_column_names; - }; + bool m_fixed_columns; + std::vector m_include; + std::vector m_exclude; + std::vector m_column_names; +}; - /****** WriteToFileStageInterfaceProxy******************/ +/****** WriteToFileStageInterfaceProxy******************/ +/** + * @brief Interface proxy, used to insulate python bindings. + */ +struct SerializeStageInterfaceProxy +{ /** - * @brief Interface proxy, used to insulate python bindings. + * @brief Create and initialize a SerializeStage, and return the result. */ - struct SerializeStageInterfaceProxy { - /** - * @brief Create and initialize a SerializeStage, and return the result. - */ - static std::shared_ptr init(neo::Segment &parent, - const std::string &name, - const std::vector &include, - const std::vector &exclude, - bool fixed_columns = true); - }; + static std::shared_ptr> init(srf::segment::Builder &builder, + const std::string &name, + const std::vector &include, + const std::vector &exclude, + bool fixed_columns = true); +}; #pragma GCC visibility pop } // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/stages/triton_inference.hpp b/morpheus/_lib/include/morpheus/stages/triton_inference.hpp index 8057a0ac05..fe1c5db068 100644 --- a/morpheus/_lib/include/morpheus/stages/triton_inference.hpp +++ b/morpheus/_lib/include/morpheus/stages/triton_inference.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,90 +18,90 @@ #pragma once #include -#include +#include #include -#include -#include +#include +#include #include -#include #include - +#include namespace morpheus { - /****** Component public implementations *******************/ - /****** InferenceClientStage********************************/ - /** - * TODO(Documentation) - */ +/****** Component public implementations *******************/ +/****** InferenceClientStage********************************/ +/** + * TODO(Documentation) + */ #pragma GCC visibility push(default) - class InferenceClientStage - : public neo::pyneo::PythonNode, std::shared_ptr> { - public: - using base_t = neo::pyneo::PythonNode, std::shared_ptr>; - using base_t::operator_fn_t; - using base_t::reader_type_t; - using base_t::writer_type_t; +class InferenceClientStage + : public srf::pysrf::PythonNode, std::shared_ptr> +{ + public: + using base_t = + srf::pysrf::PythonNode, std::shared_ptr>; + using typename base_t::sink_type_t; + using typename base_t::source_type_t; + using typename base_t::subscribe_fn_t; - InferenceClientStage(const neo::Segment &parent, - const std::string &name, - std::string model_name, - std::string server_url, - bool force_convert_inputs, - bool use_shared_memory, - bool needs_logits, - std::map inout_mapping = {}); + InferenceClientStage(std::string model_name, + std::string server_url, + bool force_convert_inputs, + bool use_shared_memory, + bool needs_logits, + std::map inout_mapping = {}); - private: - /** - * TODO(Documentation) - */ - bool is_default_grpc_port(std::string &server_url); - - /** - * TODO(Documentation) - */ - void connect_with_server(); + private: + /** + * TODO(Documentation) + */ + bool is_default_grpc_port(std::string &server_url); - /** - * TODO(Documentation) - */ - operator_fn_t build_operator(); + /** + * TODO(Documentation) + */ + void connect_with_server(); - std::string m_model_name; - std::string m_server_url; - bool m_force_convert_inputs; - bool m_use_shared_memory; - bool m_needs_logits{true}; - std::map m_inout_mapping; + /** + * TODO(Documentation) + */ + subscribe_fn_t build_operator(); - // Below are settings created during handshake with server - // std::shared_ptr m_client; - std::vector m_model_inputs; - std::vector m_model_outputs; - triton::client::InferOptions m_options; - int m_max_batch_size{-1}; - }; + std::string m_model_name; + std::string m_server_url; + bool m_force_convert_inputs; + bool m_use_shared_memory; + bool m_needs_logits{true}; + std::map m_inout_mapping; + // Below are settings created during handshake with server + // std::shared_ptr m_client; + std::vector m_model_inputs; + std::vector m_model_outputs; + triton::client::InferOptions m_options; + int m_max_batch_size{-1}; +}; - /****** InferenceClientStageInferenceProxy******************/ +/****** InferenceClientStageInferenceProxy******************/ +/** + * @brief Interface proxy, used to insulate python bindings. + */ +struct InferenceClientStageInterfaceProxy +{ /** - * @brief Interface proxy, used to insulate python bindings. + * @brief Create and initialize a InferenceClientStage, and return the result. */ - struct InferenceClientStageInterfaceProxy { - /** - * @brief Create and initialize a InferenceClientStage, and return the result. - */ - static std::shared_ptr init(neo::Segment &parent, - const std::string &name, - std::string model_name, - std::string server_url, - bool force_convert_inputs, - bool use_shared_memory, - bool needs_logits, - std::map inout_mapping); - }; + static std::shared_ptr> init( + srf::segment::Builder &builder, + const std::string &name, + std::string model_name, + std::string server_url, + bool force_convert_inputs, + bool use_shared_memory, + bool needs_logits, + std::map inout_mapping); +}; #pragma GCC visibility pop -} \ No newline at end of file +} // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/stages/write_to_file.hpp b/morpheus/_lib/include/morpheus/stages/write_to_file.hpp index 46fa3bc323..71b1b9b12f 100644 --- a/morpheus/_lib/include/morpheus/stages/write_to_file.hpp +++ b/morpheus/_lib/include/morpheus/stages/write_to_file.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,8 +22,8 @@ #include #include -#include -#include +#include +#include #include #include @@ -36,20 +36,18 @@ namespace morpheus { * TODO(Documentation) */ #pragma GCC visibility push(default) -class WriteToFileStage : public neo::pyneo::PythonNode, std::shared_ptr> +class WriteToFileStage : public srf::pysrf::PythonNode, std::shared_ptr> { public: - using base_t = neo::pyneo::PythonNode, std::shared_ptr>; - using base_t::operator_fn_t; - using base_t::reader_type_t; - using base_t::writer_type_t; + using base_t = srf::pysrf::PythonNode, std::shared_ptr>; + using typename base_t::sink_type_t; + using typename base_t::source_type_t; + using typename base_t::subscribe_fn_t; /** * TODO(Documentation) */ - WriteToFileStage(const neo::Segment &parent, - const std::string &name, - const std::string &filename, + WriteToFileStage(const std::string &filename, std::ios::openmode mode = std::ios::out, FileTypes file_type = FileTypes::Auto); @@ -59,23 +57,15 @@ class WriteToFileStage : public neo::pyneo::PythonNodeget_info(), m_fstream); - } + void write_json(sink_type_t &msg); - void write_csv(reader_type_t &msg) - { - // Call df_to_csv passing our fstream - df_to_csv(msg->get_info(), m_fstream, m_is_first); - } + void write_csv(sink_type_t &msg); - operator_fn_t build_operator(); + subscribe_fn_t build_operator(); bool m_is_first; std::ofstream m_fstream; - std::function m_write_func; + std::function m_write_func; }; /****** WriteToFileStageInterfaceProxy******************/ @@ -87,11 +77,11 @@ struct WriteToFileStageInterfaceProxy /** * @brief Create and initialize a WriteToFileStage, and return the result. */ - static std::shared_ptr init(neo::Segment &parent, - const std::string &name, - const std::string &filename, - const std::string &mode = "w", - FileTypes file_type = FileTypes::Auto); + static std::shared_ptr> init(srf::segment::Builder &builder, + const std::string &name, + const std::string &filename, + const std::string &mode = "w", + FileTypes file_type = FileTypes::Auto); }; #pragma GCC visibility pop diff --git a/morpheus/_lib/include/morpheus/utilities/string_util.hpp b/morpheus/_lib/include/morpheus/utilities/string_util.hpp index 2395970d8d..70dfbab36a 100644 --- a/morpheus/_lib/include/morpheus/utilities/string_util.hpp +++ b/morpheus/_lib/include/morpheus/utilities/string_util.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,42 +17,47 @@ #pragma once -#include - -#include #include +#include namespace morpheus { - /****** Component public implementations *******************/ - /****** StringUtil****************************************/ + +// Concats multiple strings together using ostringstream. Use with MORPHEUS_CONCAT_STR("Start [" << my_int << "]") +#define MORPHEUS_CONCAT_STR(strs) ((std::ostringstream&)(std::ostringstream() << strs)).str() + +/****** Component public implementations *******************/ +/****** StringUtil****************************************/ +/** + * @brief Structure that encapsulates string utilities. + */ +struct StringUtil +{ /** - * @brief Structure that encapsulates string utilities. + * TODO(Documentation) */ - struct StringUtil { - /** - * TODO(Documentation) - */ - template - static std::string join(IterT begin, IterT end, std::string const &separator) { - std::ostringstream result; - if (begin != end) - result << *begin++; - while (begin != end) - result << separator << *begin++; - return result.str(); - } + template + static std::string join(IterT begin, IterT end, std::string const& separator) + { + std::ostringstream result; + if (begin != end) + result << *begin++; + while (begin != end) + result << separator << *begin++; + return result.str(); + } - /** - * TODO(Documentation) - */ - template - static std::string array_to_str(IterT begin, IterT end) { - return CONCAT_STR("[" << join(begin, end, ", ") << "]"); - } + /** + * TODO(Documentation) + */ + template + static std::string array_to_str(IterT begin, IterT end) + { + return MORPHEUS_CONCAT_STR("[" << join(begin, end, ", ") << "]"); + } - /** - * TODO(Documentation) - */ - static bool str_contains(const std::string& str, const std::string& search_str); - }; + /** + * TODO(Documentation) + */ + static bool str_contains(const std::string& str, const std::string& search_str); +}; } // namespace morpheus diff --git a/morpheus/_lib/include/morpheus/utilities/table_util.hpp b/morpheus/_lib/include/morpheus/utilities/table_util.hpp index 0dc27ec593..656c53d270 100644 --- a/morpheus/_lib/include/morpheus/utilities/table_util.hpp +++ b/morpheus/_lib/include/morpheus/utilities/table_util.hpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,10 +15,10 @@ * limitations under the License. */ -#include -#include -#include #include +#include +#include +#include #include #include @@ -31,15 +31,16 @@ #pragma once namespace morpheus { - /****** Component public implementations *******************/ - /****** CuDFTableUtil****************************************/ +/****** Component public implementations *******************/ +/****** CuDFTableUtil****************************************/ +/** + * @brief Structure that encapsulates cuDF table utilities. + */ +struct CuDFTableUtil +{ /** - * @brief Structure that encapsulates cuDF table utilities. + * TODO(Documentation) */ - struct CuDFTableUtil { - /** - * TODO(Documentation) - */ - static cudf::io::table_with_metadata load_table(const std::string &filename); - }; -} \ No newline at end of file + static cudf::io::table_with_metadata load_table(const std::string &filename); +}; +} // namespace morpheus diff --git a/morpheus/_lib/src/messages/multi.cpp b/morpheus/_lib/src/messages/multi.cpp index c1660ddbb3..61e1d7a24b 100644 --- a/morpheus/_lib/src/messages/multi.cpp +++ b/morpheus/_lib/src/messages/multi.cpp @@ -105,7 +105,7 @@ void MultiMessage::set_meta(const std::vector &column_names, const if (row_stride == 1) { // column major just use cudaMemcpy - NEO_CHECK_CUDA(cudaMemcpy(const_cast(cv.data()), + SRF_CHECK_CUDA(cudaMemcpy(const_cast(cv.data()), tensors[i].data(), tensors[i].bytes(), cudaMemcpyDeviceToDevice)); @@ -113,7 +113,7 @@ void MultiMessage::set_meta(const std::vector &column_names, const else { const auto item_size = tensors[i].dtype().item_size(); - NEO_CHECK_CUDA(cudaMemcpy2D(const_cast(cv.data()), + SRF_CHECK_CUDA(cudaMemcpy2D(const_cast(cv.data()), item_size, tensors[i].data(), row_stride * item_size, diff --git a/morpheus/_lib/src/objects/file_types.cpp b/morpheus/_lib/src/objects/file_types.cpp index e5ed6a9f62..f9e37d53d4 100644 --- a/morpheus/_lib/src/objects/file_types.cpp +++ b/morpheus/_lib/src/objects/file_types.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,28 +17,34 @@ #include -#include +#include #include #include - namespace morpheus { - FileTypes FileTypesInterfaceProxy::determine_file_type(const std::string &filename) { - return morpheus::determine_file_type(filename); - } +FileTypes FileTypesInterfaceProxy::determine_file_type(const std::string &filename) +{ + return morpheus::determine_file_type(filename); } +} // namespace morpheus -morpheus::FileTypes morpheus::determine_file_type(const std::string &filename) { +morpheus::FileTypes morpheus::determine_file_type(const std::string &filename) +{ auto filename_path = std::filesystem::path(filename); - if (filename_path.extension() == ".json" || filename_path.extension() == ".jsonlines") { + if (filename_path.extension() == ".json" || filename_path.extension() == ".jsonlines") + { return FileTypes::JSON; - } else if (filename_path.extension() == ".csv") { + } + else if (filename_path.extension() == ".csv") + { return FileTypes::CSV; - } else { - throw std::runtime_error(CONCAT_STR("Unsupported extension '" - << filename_path.extension() - << "' with 'auto' type. 'auto' only works with: csv, json")); } -} \ No newline at end of file + else + { + throw std::runtime_error(MORPHEUS_CONCAT_STR("Unsupported extension '" + << filename_path.extension() + << "' with 'auto' type. 'auto' only works with: csv, json")); + } +} diff --git a/morpheus/_lib/src/objects/rmm_tensor.cpp b/morpheus/_lib/src/objects/rmm_tensor.cpp index 52e54e8329..0895854afa 100644 --- a/morpheus/_lib/src/objects/rmm_tensor.cpp +++ b/morpheus/_lib/src/objects/rmm_tensor.cpp @@ -53,7 +53,7 @@ RMMTensor::RMMTensor(std::shared_ptr device_buffer, << "Inconsistent tensor. Tensor values would extend past the end of the device_buffer"; } -std::shared_ptr RMMTensor::get_memory() const +std::shared_ptr RMMTensor::get_memory() const { return nullptr; } diff --git a/morpheus/_lib/src/objects/tensor.cpp b/morpheus/_lib/src/objects/tensor.cpp index 9a389976c2..e5b1d9670f 100644 --- a/morpheus/_lib/src/objects/tensor.cpp +++ b/morpheus/_lib/src/objects/tensor.cpp @@ -58,7 +58,7 @@ std::vector Tensor::get_host_data() const out_data.resize(this->bytes_count()); - NEO_CHECK_CUDA(cudaMemcpy(&out_data[0], this->data(), this->bytes_count(), cudaMemcpyDeviceToHost)); + SRF_CHECK_CUDA(cudaMemcpy(&out_data[0], this->data(), this->bytes_count(), cudaMemcpyDeviceToHost)); return out_data; } diff --git a/morpheus/_lib/src/objects/tensor_object.cpp b/morpheus/_lib/src/objects/tensor_object.cpp index 3f66ba0024..8a70f2c138 100644 --- a/morpheus/_lib/src/objects/tensor_object.cpp +++ b/morpheus/_lib/src/objects/tensor_object.cpp @@ -19,9 +19,8 @@ #include -#include // for MemoryDescriptor -#include // for blob -#include // for DataType +#include // for blob +#include // for DataType #include @@ -39,8 +38,8 @@ static void set_contiguous_stride(const std::vector& shape, std::ve } } -TensorView::TensorView(neo::memory::blob bv, DataType dtype, std::vector shape) : - neo::memory::blob(std::move(bv)), +TensorView::TensorView(srf::memory::blob bv, DataType dtype, std::vector shape) : + srf::memory::blob(std::move(bv)), m_dtype(std::move(dtype)), m_shape(std::move(shape)) { @@ -50,11 +49,11 @@ TensorView::TensorView(neo::memory::blob bv, DataType dtype, std::vector shape, std::vector stride) : - neo::memory::blob(std::move(bv)), + srf::memory::blob(std::move(bv)), m_dtype(std::move(dtype)), m_shape(std::move(shape)), m_stride(std::move(stride)) @@ -74,27 +73,6 @@ bool TensorView::is_contiguous() const return TensorUtils::has_contiguous_stride(shape(), stride()); } -GenericTensor::GenericTensor(std::shared_ptr md, - size_t offset, - DataType dtype, - const std::vector& shape, - const std::vector& stride) : - m_md(std::move(md)), - m_offset(offset), - m_dtype(std::move(dtype)), - m_shape(std::move(shape)), - m_stride(std::move(stride)) -{ - if (m_stride.empty()) - { - TensorUtils::set_contiguous_stride(m_shape, m_stride); - } - - CHECK_EQ(m_shape.size(), m_stride.size()); - - // throw_on_invalid_storage(); -} - const DataType& TensorView::dtype() const { return m_dtype; diff --git a/morpheus/_lib/src/python_modules/common.cpp b/morpheus/_lib/src/python_modules/common.cpp index d9b107539e..4c9d714038 100644 --- a/morpheus/_lib/src/python_modules/common.cpp +++ b/morpheus/_lib/src/python_modules/common.cpp @@ -28,8 +28,6 @@ namespace py = pybind11; PYBIND11_MODULE(common, m) { - google::InitGoogleLogging("morpheus"); - m.doc() = R"pbdoc( ----------------------- .. currentmodule:: morpheus.common diff --git a/morpheus/_lib/src/python_modules/messages.cpp b/morpheus/_lib/src/python_modules/messages.cpp index ae0e5ea433..85cdf74f9d 100644 --- a/morpheus/_lib/src/python_modules/messages.cpp +++ b/morpheus/_lib/src/python_modules/messages.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,7 +15,6 @@ * limitations under the License. */ - #include #include #include @@ -60,30 +59,21 @@ PYBIND11_MODULE(messages, m) // Load the cudf helpers load_cudf_helpers(); - neo::pyneo::import(m, "cupy"); - neo::pyneo::import(m, "morpheus._lib.common"); + srf::pysrf::import(m, "cupy"); + srf::pysrf::import(m, "morpheus._lib.common"); // Required for SegmentObject - neo::pyneo::import(m, "neo.core.node"); + srf::pysrf::import(m, "srf.core.node"); // Allows python objects to keep DataTable objects alive py::class_>(m, "DataTable"); - neo::node::EdgeConnector, py::object>::register_converter(); - neo::node::EdgeConnector>::register_converter(); - - neo::node::EdgeConnector, py::object>::register_converter(); - neo::node::EdgeConnector>::register_converter(); - py::class_>(m, "MessageMeta") .def(py::init<>(&MessageMetaInterfaceProxy::init_python), py::arg("df")) .def_property_readonly("count", &MessageMetaInterfaceProxy::count) .def_property_readonly("df", &MessageMetaInterfaceProxy::get_data_frame, py::return_value_policy::move) .def_static("make_from_file", &MessageMetaInterfaceProxy::init_cpp); - neo::node::EdgeConnector, py::object>::register_converter(); - neo::node::EdgeConnector>::register_converter(); - py::class_>(m, "MultiMessage") .def(py::init<>(&MultiMessageInterfaceProxy::init), py::arg("meta"), @@ -137,9 +127,6 @@ PYBIND11_MODULE(messages, m) .def_property( "seq_ids", &InferenceMemoryFILInterfaceProxy::get_seq_ids, &InferenceMemoryFILInterfaceProxy::set_seq_ids); - neo::node::EdgeConnector, py::object>::register_converter(); - neo::node::EdgeConnector>::register_converter(); - py::class_>(m, "MultiInferenceMessage") .def(py::init<>(&MultiInferenceMessageInterfaceProxy::init), py::arg("meta"), @@ -196,9 +183,6 @@ PYBIND11_MODULE(messages, m) .def_property( "probs", &ResponseMemoryProbsInterfaceProxy::get_probs, &ResponseMemoryProbsInterfaceProxy::set_probs); - neo::node::EdgeConnector, py::object>::register_converter(); - neo::node::EdgeConnector>::register_converter(); - py::class_>(m, "MultiResponseMessage") .def(py::init<>(&MultiResponseMessageInterfaceProxy::init), py::arg("meta"), diff --git a/morpheus/_lib/src/python_modules/stages.cpp b/morpheus/_lib/src/python_modules/stages.cpp index 25d44cf328..f5a9cb71a6 100644 --- a/morpheus/_lib/src/python_modules/stages.cpp +++ b/morpheus/_lib/src/python_modules/stages.cpp @@ -28,7 +28,7 @@ #include #include -#include +#include namespace morpheus { namespace py = pybind11; @@ -47,53 +47,63 @@ PYBIND11_MODULE(stages, m) // Load the cudf helpers load_cudf_helpers(); - neo::pyneo::import(m, "cupy"); - neo::pyneo::import(m, "morpheus._lib.messages"); - neo::pyneo::import(m, "morpheus._lib.file_types"); + srf::pysrf::import(m, "cupy"); + srf::pysrf::import(m, "morpheus._lib.messages"); + srf::pysrf::import(m, "morpheus._lib.file_types"); - py::class_>( + py::class_, + srf::segment::ObjectProperties, + std::shared_ptr>>( m, "AddClassificationsStage", py::multiple_inheritance()) .def(py::init<>(&AddClassificationStageInterfaceProxy::init), - py::arg("parent"), + py::arg("builder"), py::arg("name"), py::arg("threshold"), py::arg("num_class_labels"), py::arg("idx2label")); - py::class_>( - m, "AddScoresStage", py::multiple_inheritance()) + py::class_, + srf::segment::ObjectProperties, + std::shared_ptr>>(m, "AddScoresStage", py::multiple_inheritance()) .def(py::init<>(&AddScoresStageInterfaceProxy::init), - py::arg("parent"), + py::arg("builder"), py::arg("name"), py::arg("num_class_labels"), py::arg("idx2label")); - py::class_>( + py::class_, + srf::segment::ObjectProperties, + std::shared_ptr>>( m, "DeserializeStage", py::multiple_inheritance()) .def(py::init<>(&DeserializeStageInterfaceProxy::init), - py::arg("parent"), + py::arg("builder"), py::arg("name"), py::arg("batch_size")); - py::class_>( - m, "FileSourceStage", py::multiple_inheritance()) + py::class_, + srf::segment::ObjectProperties, + std::shared_ptr>>(m, "FileSourceStage", py::multiple_inheritance()) .def(py::init<>(&FileSourceStageInterfaceProxy::init), - py::arg("parent"), + py::arg("builder"), py::arg("name"), py::arg("filename"), py::arg("repeat")); - py::class_>( + py::class_, + srf::segment::ObjectProperties, + std::shared_ptr>>( m, "FilterDetectionsStage", py::multiple_inheritance()) .def(py::init<>(&FilterDetectionStageInterfaceProxy::init), - py::arg("parent"), + py::arg("builder"), py::arg("name"), py::arg("threshold")); - py::class_>( + py::class_, + srf::segment::ObjectProperties, + std::shared_ptr>>( m, "InferenceClientStage", py::multiple_inheritance()) .def(py::init<>(&InferenceClientStageInterfaceProxy::init), - py::arg("parent"), + py::arg("builder"), py::arg("name"), py::arg("model_name"), py::arg("server_url"), @@ -102,10 +112,12 @@ PYBIND11_MODULE(stages, m) py::arg("needs_logits"), py::arg("inout_mapping") = py::dict()); - py::class_>( + py::class_, + srf::segment::ObjectProperties, + std::shared_ptr>>( m, "KafkaSourceStage", py::multiple_inheritance()) .def(py::init<>(&KafkaSourceStageInterfaceProxy::init), - py::arg("parent"), + py::arg("builder"), py::arg("name"), py::arg("max_batch_size"), py::arg("topic"), @@ -114,17 +126,21 @@ PYBIND11_MODULE(stages, m) py::arg("disable_commits") = false, py::arg("disable_pre_filtering") = false); - py::class_>( + py::class_, + srf::segment::ObjectProperties, + std::shared_ptr>>( m, "PreprocessFILStage", py::multiple_inheritance()) .def(py::init<>(&PreprocessFILStageInterfaceProxy::init), - py::arg("parent"), + py::arg("builder"), py::arg("name"), py::arg("features")); - py::class_>( + py::class_, + srf::segment::ObjectProperties, + std::shared_ptr>>( m, "PreprocessNLPStage", py::multiple_inheritance()) .def(py::init<>(&PreprocessNLPStageInterfaceProxy::init), - py::arg("parent"), + py::arg("builder"), py::arg("name"), py::arg("vocab_hash_file"), py::arg("sequence_length"), @@ -133,19 +149,22 @@ PYBIND11_MODULE(stages, m) py::arg("add_special_token"), py::arg("stride")); - py::class_>( - m, "SerializeStage", py::multiple_inheritance()) + py::class_, + srf::segment::ObjectProperties, + std::shared_ptr>>(m, "SerializeStage", py::multiple_inheritance()) .def(py::init<>(&SerializeStageInterfaceProxy::init), - py::arg("parent"), + py::arg("builder"), py::arg("name"), py::arg("include"), py::arg("exclude"), py::arg("fixed_columns") = true); - py::class_>( + py::class_, + srf::segment::ObjectProperties, + std::shared_ptr>>( m, "WriteToFileStage", py::multiple_inheritance()) .def(py::init<>(&WriteToFileStageInterfaceProxy::init), - py::arg("parent"), + py::arg("builder"), py::arg("name"), py::arg("filename"), py::arg("mode") = "w", diff --git a/morpheus/_lib/src/stages/add_classification.cpp b/morpheus/_lib/src/stages/add_classification.cpp index 8bd4128d9c..5ff733989e 100644 --- a/morpheus/_lib/src/stages/add_classification.cpp +++ b/morpheus/_lib/src/stages/add_classification.cpp @@ -27,13 +27,10 @@ namespace morpheus { // Component public implementations // ************ AddClassificationStage **************************** // -AddClassificationsStage::AddClassificationsStage(const neo::Segment& parent, - const std::string& name, - float threshold, +AddClassificationsStage::AddClassificationsStage(float threshold, std::size_t num_class_labels, std::map idx2label) : - neo::SegmentObject(parent, name), - PythonNode(parent, name, build_operator()), + PythonNode(base_t::op_factory_from_sub_fn(build_operator())), m_threshold(threshold), m_num_class_labels(num_class_labels), m_idx2label(std::move(idx2label)) @@ -41,11 +38,11 @@ AddClassificationsStage::AddClassificationsStage(const neo::Segment& parent, CHECK(m_idx2label.size() <= m_num_class_labels) << "idx2label should represent a subset of the class_labels"; } -AddClassificationsStage::operator_fn_t AddClassificationsStage::build_operator() +AddClassificationsStage::subscribe_fn_t AddClassificationsStage::build_operator() { - return [this](neo::Observable& input, neo::Subscriber& output) { - return input.subscribe(neo::make_observer( - [this, &output](reader_type_t&& x) { + return [this](rxcpp::observable input, rxcpp::subscriber output) { + return input.subscribe(rxcpp::make_observer( + [this, &output](sink_type_t x) { const auto& probs = x->get_probs(); const auto& shape = probs.get_shape(); const auto& stride = probs.get_stride(); @@ -60,7 +57,7 @@ AddClassificationsStage::operator_fn_t AddClassificationsStage::build_operator() // A bit ugly, but we cant get access to the rmm::device_buffer here. So make a copy auto tmp_buffer = std::make_shared(probs.bytes(), rmm::cuda_stream_per_thread); - NEO_CHECK_CUDA( + SRF_CHECK_CUDA( cudaMemcpy(tmp_buffer->data(), probs.data(), tmp_buffer->size(), cudaMemcpyDeviceToDevice)); // Depending on the input the stride is given in bytes or elements, @@ -113,16 +110,14 @@ AddClassificationsStage::operator_fn_t AddClassificationsStage::build_operator() } // ************ AddClassificationStageInterfaceProxy ************* // -std::shared_ptr AddClassificationStageInterfaceProxy::init( - neo::Segment& parent, +std::shared_ptr> AddClassificationStageInterfaceProxy::init( + srf::segment::Builder& builder, const std::string& name, float threshold, std::size_t num_class_labels, std::map idx2label) { - auto stage = std::make_shared(parent, name, threshold, num_class_labels, idx2label); - - parent.register_node(stage); + auto stage = builder.construct_object(name, threshold, num_class_labels, idx2label); return stage; } diff --git a/morpheus/_lib/src/stages/add_scores.cpp b/morpheus/_lib/src/stages/add_scores.cpp index ae08b69a5a..fd7ef90dc8 100644 --- a/morpheus/_lib/src/stages/add_scores.cpp +++ b/morpheus/_lib/src/stages/add_scores.cpp @@ -27,23 +27,19 @@ namespace morpheus { // Component public implementations // ************ AddScoresStage **************************** // -AddScoresStage::AddScoresStage(const neo::Segment& parent, - const std::string& name, - std::size_t num_class_labels, - std::map idx2label) : - neo::SegmentObject(parent, name), - PythonNode(parent, name, build_operator()), +AddScoresStage::AddScoresStage(std::size_t num_class_labels, std::map idx2label) : + PythonNode(base_t::op_factory_from_sub_fn(build_operator())), m_num_class_labels(num_class_labels), m_idx2label(std::move(idx2label)) { CHECK(m_idx2label.size() <= m_num_class_labels) << "idx2label should represent a subset of the class_labels"; } -AddScoresStage::operator_fn_t AddScoresStage::build_operator() +AddScoresStage::subscribe_fn_t AddScoresStage::build_operator() { - return [this](neo::Observable& input, neo::Subscriber& output) { - return input.subscribe(neo::make_observer( - [this, &output](reader_type_t&& x) { + return [this](rxcpp::observable input, rxcpp::subscriber output) { + return input.subscribe(rxcpp::make_observer( + [this, &output](sink_type_t x) { const auto& probs = x->get_probs(); const auto& shape = probs.get_shape(); const auto& stride = probs.get_stride(); @@ -57,7 +53,7 @@ AddScoresStage::operator_fn_t AddScoresStage::build_operator() auto tmp_buffer = std::make_shared(probs.bytes(), rmm::cuda_stream_per_thread); - NEO_CHECK_CUDA( + SRF_CHECK_CUDA( cudaMemcpy(tmp_buffer->data(), probs.data(), tmp_buffer->size(), cudaMemcpyDeviceToDevice)); // Depending on the input the stride is given in bytes or elements, @@ -101,14 +97,13 @@ AddScoresStage::operator_fn_t AddScoresStage::build_operator() } // ************ AddScoresStageInterfaceProxy ************* // -std::shared_ptr AddScoresStageInterfaceProxy::init(neo::Segment& parent, - const std::string& name, - std::size_t num_class_labels, - std::map idx2label) +std::shared_ptr> AddScoresStageInterfaceProxy::init( + srf::segment::Builder& builder, + const std::string& name, + std::size_t num_class_labels, + std::map idx2label) { - auto stage = std::make_shared(parent, name, num_class_labels, idx2label); - - parent.register_node(stage); + auto stage = builder.construct_object(name, num_class_labels, std::move(idx2label)); return stage; } diff --git a/morpheus/_lib/src/stages/deserialize.cpp b/morpheus/_lib/src/stages/deserialize.cpp index ea344711a3..b3a18c717c 100644 --- a/morpheus/_lib/src/stages/deserialize.cpp +++ b/morpheus/_lib/src/stages/deserialize.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,8 +17,8 @@ #include -#include -#include +#include +#include #include #include @@ -27,39 +27,40 @@ #include namespace morpheus { - // Component public implementations - // ************ DeserializationStage **************************** // - DeserializeStage::DeserializeStage(const neo::Segment &parent, const std::string &name, size_t batch_size) : - neo::SegmentObject(parent, name), - PythonNode(parent, name, build_operator()), - m_batch_size(batch_size) {} +// Component public implementations +// ************ DeserializationStage **************************** // +DeserializeStage::DeserializeStage(size_t batch_size) : + PythonNode(base_t::op_factory_from_sub_fn(build_operator())), + m_batch_size(batch_size) +{} - DeserializeStage::operator_fn_t DeserializeStage::build_operator() { - return [this](neo::Observable &input, neo::Subscriber &output) { - return input.subscribe(neo::make_observer( - [this, &output](reader_type_t &&x) { - // Make one large MultiMessage - auto full_message = std::make_shared(x, 0, x->count()); +DeserializeStage::subscribe_fn_t DeserializeStage::build_operator() +{ + return [this](rxcpp::observable input, rxcpp::subscriber output) { + return input.subscribe(rxcpp::make_observer( + [this, &output](sink_type_t x) { + // Make one large MultiMessage + auto full_message = std::make_shared(x, 0, x->count()); - // Loop over the MessageMeta and create sub-batches - for (size_t i = 0; i < x->count(); i += this->m_batch_size) { - auto next = full_message->get_slice(i, std::min(i + this->m_batch_size, x->count())); + // Loop over the MessageMeta and create sub-batches + for (size_t i = 0; i < x->count(); i += this->m_batch_size) + { + auto next = full_message->get_slice(i, std::min(i + this->m_batch_size, x->count())); - output.on_next(std::move(next)); - } - }, - [&](std::exception_ptr error_ptr) { output.on_error(error_ptr); }, - [&]() { output.on_completed(); })); - }; - } - - // ************ DeserializationStageInterfaceProxy ************* // - std::shared_ptr - DeserializeStageInterfaceProxy::init(neo::Segment &parent, const std::string &name, size_t batch_size) { - auto stage = std::make_shared(parent, name, batch_size); + output.on_next(std::move(next)); + } + }, + [&](std::exception_ptr error_ptr) { output.on_error(error_ptr); }, + [&]() { output.on_completed(); })); + }; +} - parent.register_node(stage); +// ************ DeserializationStageInterfaceProxy ************* // +std::shared_ptr> DeserializeStageInterfaceProxy::init( + srf::segment::Builder &builder, const std::string &name, size_t batch_size) +{ + auto stage = builder.construct_object(name, batch_size); - return stage; - } + return stage; } +} // namespace morpheus diff --git a/morpheus/_lib/src/stages/file_source.cpp b/morpheus/_lib/src/stages/file_source.cpp index 0283af50d5..67df61d83e 100644 --- a/morpheus/_lib/src/stages/file_source.cpp +++ b/morpheus/_lib/src/stages/file_source.cpp @@ -17,7 +17,7 @@ #include -#include +#include #include #include @@ -40,122 +40,130 @@ #include namespace morpheus { - // Component public implementations - // ************ FileSourceStage ************* // - FileSourceStage::FileSourceStage(const neo::Segment &parent, const std::string &name, std::string filename, - int repeat) : - neo::SegmentObject(parent, name), - base_t(parent, name), - m_filename(std::move(filename)), - m_repeat(repeat) { - this->set_source_observable(neo::Observable([this](neo::Subscriber &sub) { - auto data_table = this->load_table(); - - // Using 0 will default to creating a new range index - int index_col_count = 0; - - // Check if we have a first column with INT64 data type - if (data_table.metadata.column_names.size() >= 1 && - data_table.tbl->get_column(0).type().id() == cudf::type_id::INT64) { - std::regex index_regex(R"((unnamed: 0|id))", - std::regex_constants::ECMAScript | std::regex_constants::icase); - - // Get the column name - auto col_name = data_table.metadata.column_names[0]; - - // Check it against some common terms - if (std::regex_search(col_name, index_regex)) { - // Also, if its the hideous 'Unnamed: 0', then just use an empty string - if (col_name == "Unnamed: 0") { - data_table.metadata.column_names[0] = ""; - } - - index_col_count = 1; +// Component public implementations +// ************ FileSourceStage ************* // +FileSourceStage::FileSourceStage(std::string filename, int repeat) : + PythonSource(build()), + m_filename(std::move(filename)), + m_repeat(repeat) +{} + +FileSourceStage::subscriber_fn_t FileSourceStage::build() +{ + return [this](rxcpp::subscriber output) { + auto data_table = this->load_table(); + + // Using 0 will default to creating a new range index + int index_col_count = 0; + + // Check if we have a first column with INT64 data type + if (data_table.metadata.column_names.size() >= 1 && + data_table.tbl->get_column(0).type().id() == cudf::type_id::INT64) + { + std::regex index_regex(R"((unnamed: 0|id))", + std::regex_constants::ECMAScript | std::regex_constants::icase); + + // Get the column name + auto col_name = data_table.metadata.column_names[0]; + + // Check it against some common terms + if (std::regex_search(col_name, index_regex)) + { + // Also, if its the hideous 'Unnamed: 0', then just use an empty string + if (col_name == "Unnamed: 0") + { + data_table.metadata.column_names[0] = ""; } - } - // Next, create the message metadata. This gets reused for repeats - auto meta = MessageMeta::create_from_cpp(std::move(data_table), index_col_count); + index_col_count = 1; + } + } - // Always push at least 1 - sub.on_next(meta); + // Next, create the message metadata. This gets reused for repeats + auto meta = MessageMeta::create_from_cpp(std::move(data_table), index_col_count); - for (cudf::size_type repeat_idx = 1; repeat_idx < m_repeat; ++repeat_idx) { - // Clone the previous meta object - { - pybind11::gil_scoped_acquire gil; + // Always push at least 1 + output.on_next(meta); - // Use the copy function - auto df = meta->get_py_table().attr("copy")(); + for (cudf::size_type repeat_idx = 1; repeat_idx < m_repeat; ++repeat_idx) + { + // Clone the previous meta object + { + pybind11::gil_scoped_acquire gil; - pybind11::int_ df_len = pybind11::len(df); + // Use the copy function + auto df = meta->get_py_table().attr("copy")(); - pybind11::object index = df.attr("index"); + pybind11::int_ df_len = pybind11::len(df); - df.attr("index") = index + df_len; + pybind11::object index = df.attr("index"); - meta = MessageMeta::create_from_python(std::move(df)); - } + df.attr("index") = index + df_len; - sub.on_next(meta); + meta = MessageMeta::create_from_python(std::move(df)); } - sub.on_completed(); - })); - } + output.on_next(meta); + } - cudf::io::table_with_metadata FileSourceStage::load_table() { - auto file_path = std::filesystem::path(m_filename); + output.on_completed(); + }; +} - if (file_path.extension() == ".json" || file_path.extension() == ".jsonlines") { - // First, load the file into json - auto options = cudf::io::json_reader_options::builder(cudf::io::source_info{m_filename}).lines(true); +cudf::io::table_with_metadata FileSourceStage::load_table() +{ + auto file_path = std::filesystem::path(m_filename); - auto tbl = cudf::io::read_json(options.build()); + if (file_path.extension() == ".json" || file_path.extension() == ".jsonlines") + { + // First, load the file into json + auto options = cudf::io::json_reader_options::builder(cudf::io::source_info{m_filename}).lines(true); - auto found = std::find(tbl.metadata.column_names.begin(), tbl.metadata.column_names.end(), "data"); + auto tbl = cudf::io::read_json(options.build()); - if (found == tbl.metadata.column_names.end()) - return tbl; + auto found = std::find(tbl.metadata.column_names.begin(), tbl.metadata.column_names.end(), "data"); - // Super ugly but cudf cant handle newlines and add extra escapes. So we need to convert - // \\n -> \n - // \\/ -> \/ - auto columns = tbl.tbl->release(); + if (found == tbl.metadata.column_names.end()) + return tbl; - size_t idx = found - tbl.metadata.column_names.begin(); + // Super ugly but cudf cant handle newlines and add extra escapes. So we need to convert + // \\n -> \n + // \\/ -> \/ + auto columns = tbl.tbl->release(); - auto updated_data = cudf::strings::replace( - cudf::strings_column_view{columns[idx]->view()}, cudf::string_scalar("\\n"), - cudf::string_scalar("\n")); + size_t idx = found - tbl.metadata.column_names.begin(); - updated_data = cudf::strings::replace( - cudf::strings_column_view{updated_data->view()}, cudf::string_scalar("\\/"), - cudf::string_scalar("/")); + auto updated_data = cudf::strings::replace( + cudf::strings_column_view{columns[idx]->view()}, cudf::string_scalar("\\n"), cudf::string_scalar("\n")); - columns[idx] = std::move(updated_data); + updated_data = cudf::strings::replace( + cudf::strings_column_view{updated_data->view()}, cudf::string_scalar("\\/"), cudf::string_scalar("/")); - tbl.tbl = std::move(std::make_unique(std::move(columns))); + columns[idx] = std::move(updated_data); - return tbl; - } else if (file_path.extension() == ".csv") { - auto options = cudf::io::csv_reader_options::builder(cudf::io::source_info{m_filename}); + tbl.tbl = std::move(std::make_unique(std::move(columns))); - return cudf::io::read_csv(options.build()); - } else { - LOG(FATAL) << "Unknown extension for file: " << m_filename; - throw std::runtime_error("Unknown extension"); - } + return tbl; } + else if (file_path.extension() == ".csv") + { + auto options = cudf::io::csv_reader_options::builder(cudf::io::source_info{m_filename}); - // ************ FileSourceStageInterfaceProxy ************ // - std::shared_ptr - FileSourceStageInterfaceProxy::init(neo::Segment &parent, const std::string &name, std::string filename, - int repeat) { - auto stage = std::make_shared(parent, name, filename, repeat); + return cudf::io::read_csv(options.build()); + } + else + { + LOG(FATAL) << "Unknown extension for file: " << m_filename; + throw std::runtime_error("Unknown extension"); + } +} - parent.register_node(stage); +// ************ FileSourceStageInterfaceProxy ************ // +std::shared_ptr> FileSourceStageInterfaceProxy::init( + srf::segment::Builder &builder, const std::string &name, std::string filename, int repeat) +{ + auto stage = builder.construct_object(name, filename, repeat); - return stage; - } + return stage; } +} // namespace morpheus diff --git a/morpheus/_lib/src/stages/filter_detection.cpp b/morpheus/_lib/src/stages/filter_detection.cpp index ea47afbad2..53b71dd295 100644 --- a/morpheus/_lib/src/stages/filter_detection.cpp +++ b/morpheus/_lib/src/stages/filter_detection.cpp @@ -27,18 +27,17 @@ namespace morpheus { // Component public implementations // ************ FilterDetectionStage **************************** // -FilterDetectionsStage::FilterDetectionsStage(const neo::Segment &parent, const std::string &name, float threshold) : - neo::SegmentObject(parent, name), - PythonNode(parent, name, build_operator()), +FilterDetectionsStage::FilterDetectionsStage(float threshold) : + PythonNode(base_t::op_factory_from_sub_fn(build_operator())), m_threshold(threshold) {} -FilterDetectionsStage::operator_fn_t FilterDetectionsStage::build_operator() +FilterDetectionsStage::subscribe_fn_t FilterDetectionsStage::build_operator() { return - [this](neo::Observable &input, neo::Subscriber &output) { - return input.subscribe(neo::make_observer( - [this, &output](reader_type_t &&x) { + [this](rxcpp::observable input, rxcpp::subscriber output) { + return input.subscribe(rxcpp::make_observer( + [this, &output](sink_type_t x) { const auto &probs = x->get_probs(); const auto &shape = probs.get_shape(); const auto &stride = probs.get_stride(); @@ -53,7 +52,7 @@ FilterDetectionsStage::operator_fn_t FilterDetectionsStage::build_operator() auto tmp_buffer = std::make_shared(probs.count() * probs.dtype_size(), rmm::cuda_stream_per_thread); - NEO_CHECK_CUDA( + SRF_CHECK_CUDA( cudaMemcpy(tmp_buffer->data(), probs.data(), tmp_buffer->size(), cudaMemcpyDeviceToDevice)); // Depending on the input the stride is given in bytes or elements, @@ -79,7 +78,7 @@ FilterDetectionsStage::operator_fn_t FilterDetectionsStage::build_operator() std::vector host_bool_values(num_rows); // Copy bools back to host - NEO_CHECK_CUDA(cudaMemcpy(host_bool_values.data(), + SRF_CHECK_CUDA(cudaMemcpy(host_bool_values.data(), thresh_bool_buffer->data(), thresh_bool_buffer->size(), cudaMemcpyDeviceToHost)); @@ -113,13 +112,10 @@ FilterDetectionsStage::operator_fn_t FilterDetectionsStage::build_operator() } // ************ FilterDetectionStageInterfaceProxy ************* // -std::shared_ptr FilterDetectionStageInterfaceProxy::init(neo::Segment &parent, - const std::string &name, - float threshold) +std::shared_ptr> FilterDetectionStageInterfaceProxy::init( + srf::segment::Builder &builder, const std::string &name, float threshold) { - auto stage = std::make_shared(parent, name, threshold); - - parent.register_node(stage); + auto stage = builder.construct_object(name, threshold); return stage; } diff --git a/morpheus/_lib/src/stages/kafka_source.cpp b/morpheus/_lib/src/stages/kafka_source.cpp index 9b3376d24c..3caf6e3887 100644 --- a/morpheus/_lib/src/stages/kafka_source.cpp +++ b/morpheus/_lib/src/stages/kafka_source.cpp @@ -21,8 +21,9 @@ #include #include -#include -#include +#include +#include +#include #include #include @@ -44,6 +45,7 @@ #include #include #include +#include "srf/runnable/forward.hpp" #define CHECK_KAFKA(command, expected, msg) \ { \ @@ -65,12 +67,10 @@ class KafkaSourceStage__UnsubscribedException : public std::exception class KafkaSourceStage__Rebalancer : public RdKafka::RebalanceCb { public: - KafkaSourceStage__Rebalancer( - std::function(std::vector> &&)> task_launch_fn, - std::function batch_timeout_fn, - std::function max_batch_size_fn, - std::function display_str_fn, - std::function> &)> process_fn); + KafkaSourceStage__Rebalancer(std::function batch_timeout_fn, + std::function max_batch_size_fn, + std::function display_str_fn, + std::function> &)> process_fn); void rebalance_cb(RdKafka::KafkaConsumer *consumer, RdKafka::ErrorCode err, @@ -80,8 +80,7 @@ class KafkaSourceStage__Rebalancer : public RdKafka::RebalanceCb bool is_rebalanced(); - private: - std::vector> partition_progress_step(RdKafka::Queue *queue) + std::vector> partition_progress_step(RdKafka::KafkaConsumer *consumer) { // auto batch_timeout = std::chrono::milliseconds(m_parent.batch_timeout_ms()); auto batch_timeout = std::chrono::milliseconds(m_batch_timeout_fn()); @@ -98,7 +97,7 @@ class KafkaSourceStage__Rebalancer : public RdKafka::RebalanceCb DCHECK(remaining_ms >= 0) << "Cant have negative reminaing time"; - std::unique_ptr msg{queue->consume(std::min(10L, remaining_ms))}; + std::unique_ptr msg{consumer->consume(std::min(10L, remaining_ms))}; switch (msg->err()) { @@ -108,11 +107,6 @@ class KafkaSourceStage__Rebalancer : public RdKafka::RebalanceCb break; case RdKafka::ERR_NO_ERROR: - // VLOG(10) << this->display_str( - // CONCAT_STR("Got message. Topic: " << msg->topic_name() << ", Part: " << - // msg->partition() - // << ", Offset: " << msg->offset())); - messages.emplace_back(std::move(msg)); break; case RdKafka::ERR__PARTITION_EOF: @@ -132,25 +126,23 @@ class KafkaSourceStage__Rebalancer : public RdKafka::RebalanceCb return std::move(messages); } + private: bool m_is_rebalanced{false}; - std::function(std::vector> &&)> m_task_launcher_fn; std::function m_batch_timeout_fn; std::function m_max_batch_size_fn; std::function m_display_str_fn; std::function> &)> m_process_fn; boost::fibers::recursive_mutex m_mutex; - neo::SharedFuture m_partition_future; + srf::SharedFuture m_partition_future; }; KafkaSourceStage__Rebalancer::KafkaSourceStage__Rebalancer( - std::function(std::vector> &&)> task_launch_fn, std::function batch_timeout_fn, std::function max_batch_size_fn, std::function display_str_fn, std::function> &)> process_fn) : - m_task_launcher_fn(std::move(task_launch_fn)), m_batch_timeout_fn(std::move(batch_timeout_fn)), m_max_batch_size_fn(std::move(max_batch_size_fn)), m_display_str_fn(std::move(display_str_fn)), @@ -178,71 +170,6 @@ void KafkaSourceStage__Rebalancer::rebalance_cb(RdKafka::KafkaConsumer *consumer { CHECK_KAFKA(consumer->assign(partitions), RdKafka::ERR_NO_ERROR, "Error during assign"); } - - std::vector> tasks; - - for (auto partition : partitions) - { - auto queue_ptr = consumer->get_partition_queue(partition); - - // Now forward to one of the running queues - // queue->forward(m_parent.m_queues[i % m_parent.m_queues.size()].get()); - queue_ptr->forward(nullptr); - - auto topic = partition->topic(); - auto part = partition->partition(); - auto offset = partition->offset(); - - auto partition_ptr = RdKafka::TopicPartition::create(topic, part, offset); - - tasks.emplace_back([q = queue_ptr, p = partition_ptr, consumer, this]() { - auto partition = std::unique_ptr(p); - auto queue = std::unique_ptr(q); - - while (m_is_rebalanced) - { - // Build the batch - auto messages = this->partition_progress_step(queue.get()); - - try - { - // Process the messages. Returns true if we need to commit - auto should_commit = m_process_fn(messages); - - if (should_commit) - { - int64_t max_offset = -1000; - for (auto &m : messages) - { - DCHECK(m->partition() == partition->partition()) - << "Inconsistent error. Message partition does not match fiber partition"; - - max_offset = std::max(max_offset, m->offset()); - } - - // Find the last message for this partition - partition->set_offset(max_offset + 1); - - CHECK_KAFKA(consumer->commitAsync(std::vector{partition.get()}), - RdKafka::ERR_NO_ERROR, - "Error during commitAsync"); - } - } catch (KafkaSourceStage__UnsubscribedException &) - { - // Return false for unsubscribed error - return false; - } - } - - // Return true if we exited normally - return true; - }); - } - - // Set this before launching the tasks - m_is_rebalanced = true; - - m_partition_future = std::move(m_task_launcher_fn(std::move(tasks))); } else if (err == RdKafka::ERR__REVOKE_PARTITIONS) { @@ -259,15 +186,6 @@ void KafkaSourceStage__Rebalancer::rebalance_cb(RdKafka::KafkaConsumer *consumer { CHECK_KAFKA(consumer->unassign(), RdKafka::ERR_NO_ERROR, "Error during unassign"); } - - // Stop all processing queues - m_is_rebalanced = false; - - // Wait until all processing has completed - if (m_partition_future.valid()) - { - m_partition_future.wait(); - } } else { @@ -296,33 +214,41 @@ bool KafkaSourceStage__Rebalancer::is_rebalanced() return m_is_rebalanced; } +class KafkaRebalancer : public RdKafka::RebalanceCb +{ + private: + std::unique_ptr m_consumer; +}; + // Component public implementations // ************ KafkaStage ************************* // -KafkaSourceStage::KafkaSourceStage(const neo::Segment &parent, - const std::string &name, - std::size_t max_batch_size, +KafkaSourceStage::KafkaSourceStage(std::size_t max_batch_size, std::string topic, int32_t batch_timeout_ms, std::map config, bool disable_commit, bool disable_pre_filtering) : - neo::SegmentObject(parent, name), - base_t(parent, name), + PythonSource(build()), m_max_batch_size(max_batch_size), m_topic(std::move(topic)), m_batch_timeout_ms(batch_timeout_ms), m_config(std::move(config)), m_disable_commit(disable_commit), m_disable_pre_filtering(disable_pre_filtering) +{} + +KafkaSourceStage::subscriber_fn_t KafkaSourceStage::build() { - this->set_source_observable(neo::Observable([this](neo::Subscriber &sub) { + return [this](rxcpp::subscriber sub) -> void { // Build rebalancer KafkaSourceStage__Rebalancer rebalancer( - [this](std::vector> &&tasks) { return this->launch_tasks(std::move(tasks)); }, [this]() { return this->batch_timeout_ms(); }, [this]() { return this->max_batch_size(); }, - [this](const std::string str_to_display) { return this->display_str(str_to_display); }, - [&sub, this](std::vector> &message_batch) { + [this](const std::string str_to_display) { + auto &ctx = srf::runnable::Context::get_runtime_context(); + return MORPHEUS_CONCAT_STR(ctx.info() << " " << str_to_display); + }, + [sub, this](std::vector> &message_batch) { // If we are unsubscribed, throw an error to break the loops if (!sub.is_subscribed()) { @@ -351,13 +277,36 @@ KafkaSourceStage::KafkaSourceStage(const neo::Segment &parent, return m_requires_commit; }); + auto &context = srf::runnable::Context::get_runtime_context(); + // Build consumer - m_rebalancer = &rebalancer; - auto consumer = this->create_consumer(); + auto consumer = this->create_consumer(rebalancer); + + // Wait for all to connect + context.barrier(); try { - rebalancer.rebalance_loop(consumer.get()); + while (sub.is_subscribed()) + { + std::vector> message_batch = + rebalancer.partition_progress_step(consumer.get()); + + std::shared_ptr batch; + + try + { + batch = std::move(this->process_batch(std::move(message_batch))); + } catch (std::exception &ex) + { + LOG(ERROR) << "Exception in process_batch. Msg: " << ex.what(); + + break; + } + + sub.on_next(std::move(batch)); + } + } catch (std::exception &ex) { LOG(ERROR) << "Exception in rebalance_loop. Msg: " << ex.what(); @@ -370,7 +319,7 @@ KafkaSourceStage::KafkaSourceStage(const neo::Segment &parent, m_rebalancer = nullptr; sub.on_completed(); - })); + }; } std::size_t KafkaSourceStage::max_batch_size() @@ -383,20 +332,6 @@ int32_t KafkaSourceStage::batch_timeout_ms() return m_batch_timeout_ms; } -void KafkaSourceStage::start() -{ - // Save off the queues before setting our concurrency back to 1 - for (size_t i = 0; i < this->concurrency(); ++i) - { - m_task_queues.push_back(this->resources().fiber_pool().next_task_queue()); - } - - this->concurrency(1); - - // Call the default start - neo::pyneo::PythonSource>::start(); -} - std::unique_ptr KafkaSourceStage::build_kafka_conf(const std::map &config_in) { // Copy the config @@ -440,41 +375,12 @@ std::unique_ptr KafkaSourceStage::build_kafka_conf(const std::map return std::move(kafka_conf); } -neo::SharedFuture KafkaSourceStage::launch_tasks(std::vector> &&tasks) +std::unique_ptr KafkaSourceStage::create_consumer(RdKafka::RebalanceCb &rebalancer) { - std::vector> partition_futures; - - // Loop over tasks enqueuing onto saved fiber queues - for (size_t i = 0; i < tasks.size(); ++i) - { - partition_futures.emplace_back( - this->m_task_queues[i % this->m_task_queues.size()]->enqueue(std::move(tasks[i]))); - } - - // Launch a new task to await on the futures - return this->m_task_queues[tasks.size() % this->m_task_queues.size()]->enqueue([partition_futures]() { - bool ret_val = true; - - for (auto &f : partition_futures) - { - if (!f.get()) - { - // Return false if any return false - ret_val = false; - } - } - - return ret_val; - }); -} - -std::unique_ptr KafkaSourceStage::create_consumer() -{ - auto rebalancer = static_cast(m_rebalancer); auto kafka_conf = this->build_kafka_conf(m_config); std::string errstr; - if (RdKafka::Conf::ConfResult::CONF_OK != kafka_conf->set("rebalance_cb", rebalancer, errstr)) + if (RdKafka::Conf::ConfResult::CONF_OK != kafka_conf->set("rebalance_cb", &rebalancer, errstr)) { LOG(FATAL) << "Error occurred while setting Kafka rebalance function. Error: " << errstr; } @@ -528,7 +434,8 @@ std::unique_ptr KafkaSourceStage::create_consumer() std::map> topic_parts; - VLOG(10) << this->display_str(CONCAT_STR("Subscribed to " << md->topics()->size() << " topics:")); + auto &ctx = srf::runnable::Context::get_runtime_context(); + VLOG(10) << ctx.info() << MORPHEUS_CONCAT_STR(" Subscribed to " << md->topics()->size() << " topics:"); for (auto const &topic : *(md->topics())) { @@ -560,11 +467,14 @@ std::unique_ptr KafkaSourceStage::create_consumer() auto positions = foreach_map(toppar_list, [](const std::unique_ptr &x) { return x->offset(); }); - VLOG(10) << this->display_str(CONCAT_STR( - " Topic: '" << topic->topic() - << "', Parts: " << StringUtil::array_to_str(part_ids.begin(), part_ids.end()) - << ", Committed: " << StringUtil::array_to_str(committed.begin(), committed.end()) - << ", Positions: " << StringUtil::array_to_str(positions.begin(), positions.end()))); + auto &ctx = srf::runnable::Context::get_runtime_context(); + VLOG(10) << ctx.info() + << MORPHEUS_CONCAT_STR( + " Topic: '" << topic->topic() + << "', Parts: " << StringUtil::array_to_str(part_ids.begin(), part_ids.end()) + << ", Committed: " << StringUtil::array_to_str(committed.begin(), committed.end()) + << ", Positions: " + << StringUtil::array_to_str(positions.begin(), positions.end())); } return std::move(consumer); @@ -641,19 +551,18 @@ std::shared_ptr KafkaSourceStage::process_batch( } // ************ KafkaStageInterfaceProxy ************ // -std::shared_ptr KafkaSourceStageInterfaceProxy::init(neo::Segment &parent, - const std::string &name, - size_t max_batch_size, - std::string topic, - int32_t batch_timeout_ms, - std::map config, - bool disable_commits, - bool disable_pre_filtering) +std::shared_ptr> KafkaSourceStageInterfaceProxy::init( + srf::segment::Builder &builder, + const std::string &name, + size_t max_batch_size, + std::string topic, + int32_t batch_timeout_ms, + std::map config, + bool disable_commits, + bool disable_pre_filtering) { - auto stage = std::make_shared( - parent, name, max_batch_size, topic, batch_timeout_ms, config, disable_commits, disable_pre_filtering); - - parent.register_node(stage); + auto stage = builder.construct_object( + name, max_batch_size, topic, batch_timeout_ms, config, disable_commits, disable_pre_filtering); return stage; } diff --git a/morpheus/_lib/src/stages/preprocess_fil.cpp b/morpheus/_lib/src/stages/preprocess_fil.cpp index 0cce14c29b..3a5a1a1058 100644 --- a/morpheus/_lib/src/stages/preprocess_fil.cpp +++ b/morpheus/_lib/src/stages/preprocess_fil.cpp @@ -22,8 +22,8 @@ #include #include -#include -#include +#include +#include #include #include @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -44,19 +45,16 @@ namespace morpheus { // Component public implementations // ************ PreprocessFILStage ************************* // -PreprocessFILStage::PreprocessFILStage(const neo::Segment &parent, - const std::string &name, - const std::vector &features) : - neo::SegmentObject(parent, name), - PythonNode(parent, name, build_operator()), +PreprocessFILStage::PreprocessFILStage(const std::vector &features) : + PythonNode(base_t::op_factory_from_sub_fn(build_operator())), m_fea_cols(std::move(features)) {} -PreprocessFILStage::operator_fn_t PreprocessFILStage::build_operator() +PreprocessFILStage::subscribe_fn_t PreprocessFILStage::build_operator() { - return [this](neo::Observable &input, neo::Subscriber &output) { - return input.subscribe(neo::make_observer( - [this, &output](reader_type_t &&x) { + return [this](rxcpp::observable input, rxcpp::subscriber output) { + return input.subscribe(rxcpp::make_observer( + [&output, this](sink_type_t x) { // TODO(MDD): Add some sort of lock here to prevent fixing columns after they have been accessed auto df_meta = x->get_meta(m_fea_cols); auto df_meta_col_names = df_meta.get_column_names(); @@ -114,14 +112,14 @@ PreprocessFILStage::operator_fn_t PreprocessFILStage::build_operator() auto float_data = cudf::cast(curr_col, cudf::data_type(cudf::type_id::FLOAT32))->release(); // Do the copy here before it goes out of scope - NEO_CHECK_CUDA(cudaMemcpy(curr_ptr, + SRF_CHECK_CUDA(cudaMemcpy(curr_ptr, float_data.data->data(), df_just_features.num_rows() * sizeof(float), cudaMemcpyDeviceToDevice)); } else { - NEO_CHECK_CUDA(cudaMemcpy(curr_ptr, + SRF_CHECK_CUDA(cudaMemcpy(curr_ptr, curr_col.data(), df_just_features.num_rows() * sizeof(float), cudaMemcpyDeviceToDevice)); @@ -162,13 +160,10 @@ PreprocessFILStage::operator_fn_t PreprocessFILStage::build_operator() } // ************ PreprocessFILStageInterfaceProxy *********** // -std::shared_ptr PreprocessFILStageInterfaceProxy::init(neo::Segment &parent, - const std::string &name, - const std::vector &features) +std::shared_ptr> PreprocessFILStageInterfaceProxy::init( + srf::segment::Builder &builder, const std::string &name, const std::vector &features) { - auto stage = std::make_shared(parent, name, features); - - parent.register_node(stage); + auto stage = builder.construct_object(name, features); return stage; } diff --git a/morpheus/_lib/src/stages/preprocess_nlp.cpp b/morpheus/_lib/src/stages/preprocess_nlp.cpp index 4b350239cb..6db54444ba 100644 --- a/morpheus/_lib/src/stages/preprocess_nlp.cpp +++ b/morpheus/_lib/src/stages/preprocess_nlp.cpp @@ -20,8 +20,8 @@ #include #include -#include -#include +#include +#include #include #include @@ -37,16 +37,13 @@ namespace morpheus { // Component public implementations // ************ PreprocessNLPStage ************************* // -PreprocessNLPStage::PreprocessNLPStage(const neo::Segment &parent, - const std::string &name, - std::string vocab_hash_file, +PreprocessNLPStage::PreprocessNLPStage(std::string vocab_hash_file, uint32_t sequence_length, bool truncation, bool do_lower_case, bool add_special_token, int stride) : - neo::SegmentObject(parent, name), - PythonNode(parent, name, build_operator()), + PythonNode(base_t::op_factory_from_sub_fn(build_operator())), m_vocab_hash_file(std::move(vocab_hash_file)), m_sequence_length(sequence_length), m_truncation(truncation), @@ -55,9 +52,9 @@ PreprocessNLPStage::PreprocessNLPStage(const neo::Segment &parent, m_stride(stride) {} -PreprocessNLPStage::operator_fn_t PreprocessNLPStage::build_operator() +PreprocessNLPStage::subscribe_fn_t PreprocessNLPStage::build_operator() { - return [this](neo::Observable &input, neo::Subscriber &output) { + return [this](rxcpp::observable input, rxcpp::subscriber output) { uint32_t stride = m_stride; // Auto calc stride to be 75% of sequence length @@ -67,8 +64,8 @@ PreprocessNLPStage::operator_fn_t PreprocessNLPStage::build_operator() stride = stride + stride / 2; } - return input.subscribe(neo::make_observer( - [this, stride, &output](reader_type_t &&x) { + return input.subscribe(rxcpp::make_observer( + [this, &output, stride](sink_type_t x) { // Convert to string view auto string_col = cudf::strings_column_view{x->get_meta("data").get_column(0)}; @@ -132,19 +129,18 @@ PreprocessNLPStage::operator_fn_t PreprocessNLPStage::build_operator() } // ************ PreprocessNLPStageInterfaceProxy *********** // -std::shared_ptr PreprocessNLPStageInterfaceProxy::init(neo::Segment &parent, - const std::string &name, - std::string vocab_hash_file, - uint32_t sequence_length, - bool truncation, - bool do_lower_case, - bool add_special_token, - int stride) +std::shared_ptr> PreprocessNLPStageInterfaceProxy::init( + srf::segment::Builder &builder, + const std::string &name, + std::string vocab_hash_file, + uint32_t sequence_length, + bool truncation, + bool do_lower_case, + bool add_special_token, + int stride) { - auto stage = std::make_shared( - parent, name, vocab_hash_file, sequence_length, truncation, do_lower_case, add_special_token, stride); - - parent.register_node(stage); + auto stage = builder.construct_object( + name, vocab_hash_file, sequence_length, truncation, do_lower_case, add_special_token, stride); return stage; } diff --git a/morpheus/_lib/src/stages/serialize.cpp b/morpheus/_lib/src/stages/serialize.cpp index 98f8f4d03d..6b86f7fd43 100644 --- a/morpheus/_lib/src/stages/serialize.cpp +++ b/morpheus/_lib/src/stages/serialize.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,97 +23,108 @@ namespace morpheus { - using namespace std::literals; +using namespace std::literals; - constexpr std::regex_constants::syntax_option_type RegexOptions = - std::regex_constants::ECMAScript | std::regex_constants::icase; +constexpr std::regex_constants::syntax_option_type RegexOptions = + std::regex_constants::ECMAScript | std::regex_constants::icase; // Component public implementations // ************ WriteToFileStage **************************** // - SerializeStage::SerializeStage(const neo::Segment &parent, - const std::string &name, - const std::vector &include, - const std::vector &exclude, - bool fixed_columns) : - neo::SegmentObject(parent, name), - PythonNode(parent, name, build_operator()), - m_fixed_columns{fixed_columns} { - make_regex_objs(include, m_include); - make_regex_objs(exclude, m_exclude); +SerializeStage::SerializeStage(const std::vector &include, + const std::vector &exclude, + bool fixed_columns) : + PythonNode(base_t::op_factory_from_sub_fn(build_operator())), + m_fixed_columns{fixed_columns} +{ + make_regex_objs(include, m_include); + make_regex_objs(exclude, m_exclude); +} + +void SerializeStage::make_regex_objs(const std::vector ®ex_strs, std::vector ®ex_objs) +{ + for (const auto &s : regex_strs) + { + regex_objs.emplace_back(std::regex{s, RegexOptions}); } - - void - SerializeStage::make_regex_objs(const std::vector ®ex_strs, std::vector ®ex_objs) { - for (const auto &s: regex_strs) { - regex_objs.emplace_back(std::regex{s, RegexOptions}); - } - } - - bool SerializeStage::match_column(const std::vector &patterns, const std::string &column) const { - for (const auto &re: patterns) { - if (std::regex_match(column, re)) { - return true; - } - } - return false; - } - - bool SerializeStage::include_column(const std::string &column) const { - if (m_include.empty()) { +} + +bool SerializeStage::match_column(const std::vector &patterns, const std::string &column) const +{ + for (const auto &re : patterns) + { + if (std::regex_match(column, re)) + { return true; - } else { - return match_column(m_include, column); } } - - bool SerializeStage::exclude_column(const std::string &column) const { - return match_column(m_exclude, column); + return false; +} + +bool SerializeStage::include_column(const std::string &column) const +{ + if (m_include.empty()) + { + return true; } - - TableInfo SerializeStage::get_meta(reader_type_t &msg) { - // If none of the columns match the include regex patterns or are all are excluded this has the effect - // of including all of the rows since calling msg->get_meta({}) will return a view with all columns. - // The Python impl appears to have the same behavior. - if (!m_fixed_columns || m_column_names.empty()) { - m_column_names.clear(); - for (const auto &c: msg->get_meta().get_column_names()) { - if (include_column(c) && !exclude_column(c)) { - m_column_names.push_back(c); - } + else + { + return match_column(m_include, column); + } +} + +bool SerializeStage::exclude_column(const std::string &column) const +{ + return match_column(m_exclude, column); +} + +TableInfo SerializeStage::get_meta(sink_type_t &msg) +{ + // If none of the columns match the include regex patterns or are all are excluded this has the effect + // of including all of the rows since calling msg->get_meta({}) will return a view with all columns. + // The Python impl appears to have the same behavior. + if (!m_fixed_columns || m_column_names.empty()) + { + m_column_names.clear(); + for (const auto &c : msg->get_meta().get_column_names()) + { + if (include_column(c) && !exclude_column(c)) + { + m_column_names.push_back(c); } } - - return msg->get_meta(m_column_names); - } - - neo::pyneo::PythonNode, std::shared_ptr>::operator_fn_t - SerializeStage::build_operator() { - return [this](neo::Observable &input, neo::Subscriber &output) { - return input.subscribe(neo::make_observer( - [this, &output](reader_type_t &&msg) { - auto table_info = this->get_meta(msg); - std::shared_ptr meta; - { - pybind11::gil_scoped_acquire gil; - meta = MessageMeta::create_from_python(std::move(table_info.as_py_object())); - } - output.on_next(std::move(meta)); - }, - [&](std::exception_ptr error_ptr) { output.on_error(error_ptr); }, - [&]() { output.on_completed(); })); - }; } - // ************ WriteToFileStageInterfaceProxy ************* // - std::shared_ptr SerializeStageInterfaceProxy::init(neo::Segment &parent, - const std::string &name, - const std::vector &include, - const std::vector &exclude, - bool fixed_columns) { - auto stage = std::make_shared(parent, name, include, exclude, fixed_columns); - - parent.register_node(stage); - - return stage; - } + return msg->get_meta(m_column_names); +} + +SerializeStage::subscribe_fn_t SerializeStage::build_operator() +{ + return [this](rxcpp::observable input, rxcpp::subscriber output) { + return input.subscribe(rxcpp::make_observer( + [this, &output](sink_type_t msg) { + auto table_info = this->get_meta(msg); + std::shared_ptr meta; + { + pybind11::gil_scoped_acquire gil; + meta = MessageMeta::create_from_python(std::move(table_info.as_py_object())); + } + output.on_next(std::move(meta)); + }, + [&](std::exception_ptr error_ptr) { output.on_error(error_ptr); }, + [&]() { output.on_completed(); })); + }; +} + +// ************ WriteToFileStageInterfaceProxy ************* // +std::shared_ptr> SerializeStageInterfaceProxy::init( + srf::segment::Builder &builder, + const std::string &name, + const std::vector &include, + const std::vector &exclude, + bool fixed_columns) +{ + auto stage = builder.construct_object(name, include, exclude, fixed_columns); + + return stage; +} } // namespace morpheus diff --git a/morpheus/_lib/src/stages/triton_inference.cpp b/morpheus/_lib/src/stages/triton_inference.cpp index afc4828519..92bc160615 100644 --- a/morpheus/_lib/src/stages/triton_inference.cpp +++ b/morpheus/_lib/src/stages/triton_inference.cpp @@ -23,8 +23,7 @@ #include #include -#include -#include +#include #include #include @@ -49,9 +48,9 @@ void InferenceClientStage__check_triton_errors(triton::client::Error status, { if (!status.IsOk()) { - std::string err_msg = - CONCAT_STR("Triton Error while executing '" << methodName << "'. Error: " + status.Message() << "\n" - << filename << "(" << lineNumber << ")"); + std::string err_msg = MORPHEUS_CONCAT_STR("Triton Error while executing '" + << methodName << "'. Error: " + status.Message() << "\n" + << filename << "(" << lineNumber << ")"); LOG(ERROR) << err_msg; throw std::runtime_error(err_msg); } @@ -61,16 +60,13 @@ void InferenceClientStage__check_triton_errors(triton::client::Error status, namespace morpheus { // Component public implementations // ************ InferenceClientStage ************************* // -InferenceClientStage::InferenceClientStage(const neo::Segment &parent, - const std::string &name, - std::string model_name, +InferenceClientStage::InferenceClientStage(std::string model_name, std::string server_url, bool force_convert_inputs, bool use_shared_memory, bool needs_logits, std::map inout_mapping) : - neo::SegmentObject(parent, name), - PythonNode(parent, name, build_operator()), + PythonNode(base_t::op_factory_from_sub_fn(build_operator())), m_model_name(std::move(model_name)), m_server_url(std::move(server_url)), m_force_convert_inputs(force_convert_inputs), @@ -83,15 +79,15 @@ InferenceClientStage::InferenceClientStage(const neo::Segment &parent, this->connect_with_server(); // TODO(Devin) } -InferenceClientStage::operator_fn_t InferenceClientStage::build_operator() +InferenceClientStage::subscribe_fn_t InferenceClientStage::build_operator() { - return [this](neo::Observable &input, neo::Subscriber &output) { + return [this](rxcpp::observable input, rxcpp::subscriber output) { std::unique_ptr client; CHECK_TRITON(triton::client::InferenceServerHttpClient::Create(&client, m_server_url, false)); - return input.subscribe(neo::make_observer( - [this, &output, &client](reader_type_t &&x) { + return input.subscribe(rxcpp::make_observer( + [this, &output, &client](sink_type_t x) { auto reponse_memory = std::make_shared(x->count); // Create the output memory blocks @@ -127,9 +123,9 @@ InferenceClientStage::operator_fn_t InferenceClientStage::build_operator() size_t start = i; size_t stop = std::min(i + m_max_batch_size, x->count); - reader_type_t mini_batch_input = + sink_type_t mini_batch_input = std::static_pointer_cast(x->get_slice(start, stop)); - writer_type_t mini_batch_output = + source_type_t mini_batch_output = std::static_pointer_cast(response->get_slice(start, stop)); // Iterate on the model inputs in case the model takes less than what tensors are available @@ -203,7 +199,7 @@ InferenceClientStage::operator_fn_t InferenceClientStage::build_operator() auto output_buffer = std::make_shared(output_ptr_size, rmm::cuda_stream_per_thread); - NEO_CHECK_CUDA( + SRF_CHECK_CUDA( cudaMemcpy(output_buffer->data(), output_ptr, output_ptr_size, cudaMemcpyHostToDevice)); // If we need to do logits, do that here @@ -264,18 +260,18 @@ void InferenceClientStage::connect_with_server() } else if (status.Message().find("Unsupported protocol") != std::string::npos) { - throw std::runtime_error( - CONCAT_STR("Failed to connect to Triton at '" - << m_server_url - << "'. Received 'Unsupported Protocol' error. Are you using the right port? The C++ " - "InferenceClientStage uses Triton's HTTP protocol instead of gRPC. Ensure you have " - "specified the HTTP port (Default 8000).")); + throw std::runtime_error(MORPHEUS_CONCAT_STR( + "Failed to connect to Triton at '" + << m_server_url + << "'. Received 'Unsupported Protocol' error. Are you using the right port? The C++ " + "InferenceClientStage uses Triton's HTTP protocol instead of gRPC. Ensure you have " + "specified the HTTP port (Default 8000).")); } if (!status.IsOk()) - throw std::runtime_error(CONCAT_STR("Unable to connect to Triton at '" - << m_server_url - << "'. Check the URL and port and ensure the server is running.")); + throw std::runtime_error( + MORPHEUS_CONCAT_STR("Unable to connect to Triton at '" + << m_server_url << "'. Check the URL and port and ensure the server is running.")); } // Save this for new clients @@ -397,8 +393,8 @@ bool InferenceClientStage::is_default_grpc_port(std::string &server_url) } // ************ InferenceClientStageInterfaceProxy********* // -std::shared_ptr InferenceClientStageInterfaceProxy::init( - neo::Segment &parent, +std::shared_ptr> InferenceClientStageInterfaceProxy::init( + srf::segment::Builder &builder, const std::string &name, std::string model_name, std::string server_url, @@ -407,10 +403,8 @@ std::shared_ptr InferenceClientStageInterfaceProxy::init( bool needs_logits, std::map inout_mapping) { - auto stage = std::make_shared( - parent, name, model_name, server_url, force_convert_inputs, use_shared_memory, needs_logits, inout_mapping); - - parent.register_node(stage); + auto stage = builder.construct_object( + name, model_name, server_url, force_convert_inputs, use_shared_memory, needs_logits, inout_mapping); return stage; } diff --git a/morpheus/_lib/src/stages/write_to_file.cpp b/morpheus/_lib/src/stages/write_to_file.cpp index ea356ab069..45f3fb40c8 100644 --- a/morpheus/_lib/src/stages/write_to_file.cpp +++ b/morpheus/_lib/src/stages/write_to_file.cpp @@ -1,5 +1,5 @@ /** - * SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -27,13 +27,8 @@ namespace morpheus { // Component public implementations // ************ WriteToFileStage **************************** // -WriteToFileStage::WriteToFileStage(const neo::Segment &parent, - const std::string &name, - const std::string &filename, - std::ios::openmode mode, - FileTypes file_type) : - neo::SegmentObject(parent, name), - PythonNode(parent, name, build_operator()), +WriteToFileStage::WriteToFileStage(const std::string &filename, std::ios::openmode mode, FileTypes file_type) : + PythonNode(base_t::op_factory_from_sub_fn(build_operator())), m_is_first(true) { if (file_type == FileTypes::Auto) @@ -61,6 +56,18 @@ WriteToFileStage::WriteToFileStage(const neo::Segment &parent, m_fstream.open(filename, mode); } +void WriteToFileStage::write_json(WriteToFileStage::sink_type_t &msg) +{ + // Call df_to_json passing our fstream + df_to_json(msg->get_info(), m_fstream); +} + +void WriteToFileStage::write_csv(WriteToFileStage::sink_type_t &msg) +{ + // Call df_to_csv passing our fstream + df_to_csv(msg->get_info(), m_fstream, m_is_first); +} + void WriteToFileStage::close() { if (m_fstream.is_open()) @@ -69,11 +76,11 @@ void WriteToFileStage::close() } } -WriteToFileStage::operator_fn_t WriteToFileStage::build_operator() +WriteToFileStage::subscribe_fn_t WriteToFileStage::build_operator() { - return [this](neo::Observable &input, neo::Subscriber &output) { - return input.subscribe(neo::make_observer( - [this, &output](reader_type_t &&msg) { + return [this](rxcpp::observable input, rxcpp::subscriber output) { + return input.subscribe(rxcpp::make_observer( + [this, &output](sink_type_t msg) { this->m_write_func(msg); m_is_first = false; output.on_next(std::move(msg)); @@ -90,11 +97,12 @@ WriteToFileStage::operator_fn_t WriteToFileStage::build_operator() } // ************ WriteToFileStageInterfaceProxy ************* // -std::shared_ptr WriteToFileStageInterfaceProxy::init(neo::Segment &parent, - const std::string &name, - const std::string &filename, - const std::string &mode, - FileTypes file_type) +std::shared_ptr> WriteToFileStageInterfaceProxy::init( + srf::segment::Builder &builder, + const std::string &name, + const std::string &filename, + const std::string &mode, + FileTypes file_type) { std::ios::openmode fsmode = std::ios::out; @@ -130,9 +138,7 @@ std::shared_ptr WriteToFileStageInterfaceProxy::init(neo::Segm throw std::runtime_error(std::string("Unsupported file mode. Must choose either 'w' or 'a'. Mode: ") + mode); } - auto stage = std::make_shared(parent, name, filename, fsmode, file_type); - - parent.register_node(stage); + auto stage = builder.construct_object(name, filename, fsmode, file_type); return stage; } diff --git a/morpheus/_lib/src/utilities/matx_util.cu b/morpheus/_lib/src/utilities/matx_util.cu index bee8b1016c..09657ef49d 100644 --- a/morpheus/_lib/src/utilities/matx_util.cu +++ b/morpheus/_lib/src/utilities/matx_util.cu @@ -21,7 +21,7 @@ #include #include -#include +#include #include @@ -260,7 +260,7 @@ namespace morpheus { input.data(), output->data()); - neo::enqueue_stream_sync_event(output->stream()).get(); + srf::enqueue_stream_sync_event(output->stream()).get(); return output; } @@ -333,7 +333,7 @@ namespace morpheus { thresh_val, stride); - neo::enqueue_stream_sync_event(output->stream()).get(); + srf::enqueue_stream_sync_event(output->stream()).get(); return output; } diff --git a/morpheus/_lib/src/utilities/tensor_util.cpp b/morpheus/_lib/src/utilities/tensor_util.cpp index f8f896d3b1..9e62a39dc5 100644 --- a/morpheus/_lib/src/utilities/tensor_util.cpp +++ b/morpheus/_lib/src/utilities/tensor_util.cpp @@ -17,7 +17,7 @@ #include -#include // for sort_indexes +#include // for sort_indexes #include // for DCHECK_EQ @@ -74,7 +74,7 @@ bool TensorUtils::validate_shape_and_stride(const std::vector& shap return false; } - auto stride_sorted_idx = neo::sort_indexes(stride); + auto stride_sorted_idx = srf::sort_indexes(stride); for (int i = 0; i < stride_sorted_idx.size() - 1; ++i) { diff --git a/morpheus/_lib/src/utilities/type_util_detail.cpp b/morpheus/_lib/src/utilities/type_util_detail.cpp index c2602e244a..f89cd0f907 100644 --- a/morpheus/_lib/src/utilities/type_util_detail.cpp +++ b/morpheus/_lib/src/utilities/type_util_detail.cpp @@ -17,7 +17,7 @@ #include -#include +#include #include @@ -94,7 +94,7 @@ std::string DataType::name() const std::string DataType::type_str() const { - return CONCAT_STR("<" << this->type_char() << this->item_size()); + return MORPHEUS_CONCAT_STR("<" << this->type_char() << this->item_size()); } bool DataType::operator==(const DataType& other) const diff --git a/morpheus/_lib/tests/CMakeLists.txt b/morpheus/_lib/tests/CMakeLists.txt index 18849311bf..b4c9a919fb 100644 --- a/morpheus/_lib/tests/CMakeLists.txt +++ b/morpheus/_lib/tests/CMakeLists.txt @@ -17,7 +17,7 @@ list(APPEND CMAKE_MESSAGE_CONTEXT "tests") # Keep all source files sorted add_executable(test_libmorpheus - test_cuda.cu + # test_cuda.cu test_main.cpp test_tensor.cpp test_type_util_detail.cpp @@ -26,7 +26,7 @@ add_executable(test_libmorpheus target_link_libraries(test_libmorpheus PRIVATE cuda_utils - neo::pyneo + srf::pysrf GTest::gtest matx::matx pybind11::embed diff --git a/morpheus/_lib/tests/test_cuda.cu b/morpheus/_lib/tests/test_cuda.cu index 6b5fbbd07d..34e5114df9 100644 --- a/morpheus/_lib/tests/test_cuda.cu +++ b/morpheus/_lib/tests/test_cuda.cu @@ -19,17 +19,16 @@ #include -#include // for NEO_CHECK_CUDA -//#include -#include // for enqueue_stream_sync_event -#include -#include -#include -#include -#include -#include -#include -#include +#include // for SRF_CHECK_CUDA +#include // for enqueue_stream_sync_event +#include +#include +#include +#include +#include +#include +#include +#include #include #include @@ -44,7 +43,7 @@ #include #include -using namespace neo::memory::literals; +using namespace srf::memory::literals; using namespace morpheus; using RankType = int; @@ -55,19 +54,19 @@ class TestCuda : public ::testing::Test protected: void SetUp() override { - NEO_CHECK_CUDA(cudaStreamCreate(&stream)); + SRF_CHECK_CUDA(cudaStreamCreate(&stream)); - auto pinned = std::make_shared(); - auto device = std::make_shared(0); + auto pinned = std::make_shared(); + auto device = std::make_shared(0); - m_host_allocator = neo::memory::OldHostAllocator(pinned, nullptr).shared(); - m_device_allocator = neo::memory::OldDeviceAllocator(device, nullptr).shared(); + m_host_allocator = srf::memory::OldHostAllocator(pinned, nullptr).shared(); + m_device_allocator = srf::memory::OldDeviceAllocator(device, nullptr).shared(); } void TearDown() override { - NEO_CHECK_CUDA(cudaStreamSynchronize(stream)); - NEO_CHECK_CUDA(cudaStreamDestroy(stream)); + SRF_CHECK_CUDA(cudaStreamSynchronize(stream)); + SRF_CHECK_CUDA(cudaStreamDestroy(stream)); } template @@ -97,15 +96,15 @@ class TestCuda : public ::testing::Test cudaStream_t stream; // NOLINT - std::shared_ptr m_host_allocator; - std::shared_ptr m_device_allocator; + std::shared_ptr m_host_allocator; + std::shared_ptr m_device_allocator; }; template auto await_matx(matx::BaseOp& op, cudaStream_t stream) { op.run(stream); - return neo::enqueue_stream_sync_event(stream); + return srf::enqueue_stream_sync_event(stream); } void test_1d(const TensorObject& one_d) diff --git a/morpheus/messages/message_meta.py b/morpheus/messages/message_meta.py index 7bca761183..e3119c5c28 100644 --- a/morpheus/messages/message_meta.py +++ b/morpheus/messages/message_meta.py @@ -16,12 +16,12 @@ import pandas as pd -import morpheus._lib.messages as neom +import morpheus._lib.messages as _messages from morpheus.messages.message_base import MessageBase @dataclasses.dataclass -class MessageMeta(MessageBase, cpp_class=neom.MessageMeta): +class MessageMeta(MessageBase, cpp_class=_messages.MessageMeta): """ This is a container class to hold batch deserialized messages metadata. diff --git a/morpheus/messages/multi_inference_message.py b/morpheus/messages/multi_inference_message.py index b1559952d3..7f975fbf21 100644 --- a/morpheus/messages/multi_inference_message.py +++ b/morpheus/messages/multi_inference_message.py @@ -18,14 +18,14 @@ import cupy as cp -import morpheus._lib.messages as neom +import morpheus._lib.messages as _messages from morpheus.messages.data_class_prop import DataClassProp from morpheus.messages.message_base import MessageData from morpheus.messages.multi_message import MultiMessage @dataclasses.dataclass -class InferenceMemory(MessageData, cpp_class=neom.InferenceMemory): +class InferenceMemory(MessageData, cpp_class=_messages.InferenceMemory): """ This is a base container class for data that will be used for inference stages. This class is designed to hold generic tensor data in cupy arrays. @@ -90,7 +90,7 @@ def set_input(instance, name: str, value): @dataclasses.dataclass -class InferenceMemoryNLP(InferenceMemory, cpp_class=neom.InferenceMemoryNLP): +class InferenceMemoryNLP(InferenceMemory, cpp_class=_messages.InferenceMemoryNLP): """ This is a container class for data that needs to be submitted to the inference server for NLP category usecases. @@ -117,7 +117,7 @@ def __post_init__(self, input_ids, input_mask, seq_ids): @dataclasses.dataclass -class InferenceMemoryFIL(InferenceMemory, cpp_class=neom.InferenceMemoryFIL): +class InferenceMemoryFIL(InferenceMemory, cpp_class=_messages.InferenceMemoryFIL): """ This is a container class for data that needs to be submitted to the inference server for FIL category usecases. @@ -163,7 +163,7 @@ def __post_init__(self, input, seq_ids): @dataclasses.dataclass -class MultiInferenceMessage(MultiMessage, cpp_class=neom.MultiInferenceMessage): +class MultiInferenceMessage(MultiMessage, cpp_class=_messages.MultiInferenceMessage): """ This is a container class that holds the InferenceMemory container and the metadata of the data contained within it. Builds on top of the `MultiMessage` class to add additional data for inferencing. @@ -265,7 +265,7 @@ def get_slice(self, start, stop): @dataclasses.dataclass -class MultiInferenceNLPMessage(MultiInferenceMessage, cpp_class=neom.MultiInferenceNLPMessage): +class MultiInferenceNLPMessage(MultiInferenceMessage, cpp_class=_messages.MultiInferenceNLPMessage): """ A stronger typed version of `MultiInferenceMessage` that is used for NLP workloads. Helps ensure the proper inputs are set and eases debugging. @@ -316,7 +316,7 @@ def seq_ids(self): @dataclasses.dataclass -class MultiInferenceFILMessage(MultiInferenceMessage, cpp_class=neom.MultiInferenceFILMessage): +class MultiInferenceFILMessage(MultiInferenceMessage, cpp_class=_messages.MultiInferenceFILMessage): """ A stronger typed version of `MultiInferenceMessage` that is used for FIL workloads. Helps ensure the proper inputs are set and eases debugging. diff --git a/morpheus/messages/multi_message.py b/morpheus/messages/multi_message.py index c69aeebd5a..6e51b7241a 100644 --- a/morpheus/messages/multi_message.py +++ b/morpheus/messages/multi_message.py @@ -18,13 +18,13 @@ import cudf -import morpheus._lib.messages as neom +import morpheus._lib.messages as _messages from morpheus.messages.message_base import MessageData from morpheus.messages.message_meta import MessageMeta @dataclasses.dataclass -class MultiMessage(MessageData, cpp_class=neom.MultiMessage): +class MultiMessage(MessageData, cpp_class=_messages.MultiMessage): """ This class holds data for multiple messages at a time. To avoid copying data for slicing operations, it holds a reference to a batched metadata object and stores the offset and count into that batch. diff --git a/morpheus/messages/multi_response_message.py b/morpheus/messages/multi_response_message.py index 363da9e9c7..497c62f34a 100644 --- a/morpheus/messages/multi_response_message.py +++ b/morpheus/messages/multi_response_message.py @@ -18,7 +18,7 @@ import cupy as cp -import morpheus._lib.messages as neom +import morpheus._lib.messages as _messages from morpheus.messages.data_class_prop import DataClassProp from morpheus.messages.message_base import MessageData from morpheus.messages.multi_message import MultiMessage @@ -74,7 +74,7 @@ def set_output(instance: "ResponseMemory", name: str, value): @dataclasses.dataclass -class ResponseMemory(MessageData, cpp_class=neom.ResponseMemory): +class ResponseMemory(MessageData, cpp_class=_messages.ResponseMemory): """ Output memory block holding the results of inference. """ @@ -90,7 +90,7 @@ def get_output(self, name: str): @dataclasses.dataclass -class ResponseMemoryProbs(ResponseMemory, cpp_class=neom.ResponseMemoryProbs): +class ResponseMemoryProbs(ResponseMemory, cpp_class=_messages.ResponseMemoryProbs): probs: dataclasses.InitVar[cp.ndarray] = DataClassProp(get_output, set_output) def __post_init__(self, probs): @@ -103,7 +103,7 @@ class ResponseMemoryAE(ResponseMemoryProbs, cpp_class=None): @dataclasses.dataclass -class MultiResponseMessage(MultiMessage, cpp_class=neom.MultiResponseMessage): +class MultiResponseMessage(MultiMessage, cpp_class=_messages.MultiResponseMessage): """ This class contains several inference responses as well as the cooresponding message metadata. @@ -191,7 +191,7 @@ def get_output(self, name: str): @dataclasses.dataclass -class MultiResponseProbsMessage(MultiResponseMessage, cpp_class=neom.MultiResponseProbsMessage): +class MultiResponseProbsMessage(MultiResponseMessage, cpp_class=_messages.MultiResponseProbsMessage): """ A stronger typed version of `MultiResponseMessage` that is used for inference workloads that return a probability array. Helps ensure the proper outputs are set and eases debugging. diff --git a/morpheus/pipeline/multi_message_stage.py b/morpheus/pipeline/multi_message_stage.py index ff29a7136d..35f8170b17 100644 --- a/morpheus/pipeline/multi_message_stage.py +++ b/morpheus/pipeline/multi_message_stage.py @@ -15,7 +15,7 @@ import logging import time -import neo +import srf import morpheus.pipeline as _pipeline from morpheus.config import Config @@ -46,7 +46,7 @@ def __init__(self, c: Config): super().__init__(c) - def _post_build_single(self, seg: neo.Segment, out_pair: StreamPair) -> StreamPair: + def _post_build_single(self, builder: srf.Builder, out_pair: StreamPair) -> StreamPair: # Check if we are debug and should log timestamps. Disable for C++ nodes if (self._config.debug and self._should_log_timestamps and not self._build_cpp_node()): @@ -65,10 +65,10 @@ def post_timestamps(x: MultiMessage): return x # Only have one port - post_ts = seg.make_node(self.unique_name + "-ts", post_timestamps) - seg.make_edge(out_pair[0], post_ts) + post_ts = builder.make_node(self.unique_name + "-ts", post_timestamps) + builder.make_edge(out_pair[0], post_ts) # Keep the type unchanged out_pair = (post_ts, out_pair[1]) - return super()._post_build_single(seg, out_pair) + return super()._post_build_single(builder, out_pair) diff --git a/morpheus/pipeline/pipeline.py b/morpheus/pipeline/pipeline.py index 625dd50fa2..1af6dc69c0 100644 --- a/morpheus/pipeline/pipeline.py +++ b/morpheus/pipeline/pipeline.py @@ -19,8 +19,8 @@ import time import typing -import neo import networkx +import srf from tqdm import tqdm import cudf @@ -58,11 +58,12 @@ def __init__(self, c: Config): self._sources: typing.Set[SourceStage] = set() self._stages: typing.Set[Stage] = set() - self._exec_options = neo.Options() + self._exec_options = srf.Options() self._exec_options.topology.user_cpuset = "0-{}".format(c.num_threads - 1) + self._exec_options.engine_factories.default_engine_type = srf.core.options.EngineType.Thread # Set the default channel size - neo.Config.default_channel_size = c.edge_buffer_size + srf.Config.default_channel_size = c.edge_buffer_size self.batch_size = c.pipeline_batch_size @@ -71,8 +72,8 @@ def __init__(self, c: Config): self._is_built = False self._is_started = False - self._neo_executor: neo.Executor = None - self._neo_pipeline: neo.Pipeline = None + self._srf_executor: srf.Executor = None + self._srf_pipeline: srf.Pipeline = None @property def is_built(self) -> bool: @@ -140,11 +141,11 @@ def build(self): logger.info("====Registering Pipeline====") - self._neo_executor = neo.Executor(self._exec_options) + self._srf_executor = srf.Executor(self._exec_options) - self._neo_pipeline = neo.Pipeline() + self._srf_pipeline = srf.Pipeline() - def inner_build(seg: neo.Segment): + def inner_build(builder: srf.Builder): logger.info("====Building Pipeline====") # Get the list of stages and source @@ -154,7 +155,7 @@ def inner_build(seg: neo.Segment): for s in source_and_stages: if (s.can_build()): - s.build(seg) + s.build(builder) if (not all([x.is_built for x in source_and_stages])): # raise NotImplementedError("Circular pipelines are not yet supported!") @@ -179,9 +180,9 @@ def inner_build(seg: neo.Segment): # Finally call _on_start self._on_start() - self._neo_pipeline.make_segment("main", inner_build) + self._srf_pipeline.make_segment("main", inner_build) - self._neo_executor.register_pipeline(self._neo_pipeline) + self._srf_executor.register_pipeline(self._srf_pipeline) self._is_built = True @@ -192,7 +193,7 @@ def start(self): logger.info("====Starting Pipeline====") - self._neo_executor.start() + self._srf_executor.start() logger.info("====Pipeline Started====") @@ -202,13 +203,13 @@ def stop(self): for s in list(self._sources) + list(self._stages): s.stop() - self._neo_executor.stop() + self._srf_executor.stop() logger.info("====Pipeline Stopped====") async def join(self): - await self._neo_executor.join_async() + await self._srf_executor.join_async() # First wait for all sources to stop. This only occurs after all messages have been processed fully for s in list(self._sources): diff --git a/morpheus/pipeline/single_output_source.py b/morpheus/pipeline/single_output_source.py index 45e414b6ea..2ab33cc494 100644 --- a/morpheus/pipeline/single_output_source.py +++ b/morpheus/pipeline/single_output_source.py @@ -15,7 +15,7 @@ import logging import typing -import neo +import srf import morpheus.pipeline as _pipeline from morpheus.config import Config @@ -40,13 +40,13 @@ def __init__(self, c: Config): self._create_ports(0, 1) - def _post_build_single(self, seg: neo.Segment, out_pair: StreamPair) -> StreamPair: + def _post_build_single(self, builder: srf.Builder, out_pair: StreamPair) -> StreamPair: return out_pair @typing.final - def _post_build(self, seg: neo.Segment, out_ports_pair: typing.List[StreamPair]) -> typing.List[StreamPair]: + def _post_build(self, builder: srf.Builder, out_ports_pair: typing.List[StreamPair]) -> typing.List[StreamPair]: - ret_val = self._post_build_single(seg, out_ports_pair[0]) + ret_val = self._post_build_single(builder, out_ports_pair[0]) logger.info("Added source: {}\n └─> {}".format(str(self), pretty_print_type_name(ret_val[1]))) diff --git a/morpheus/pipeline/single_port_stage.py b/morpheus/pipeline/single_port_stage.py index ca712fb0a1..26c6af3841 100644 --- a/morpheus/pipeline/single_port_stage.py +++ b/morpheus/pipeline/single_port_stage.py @@ -16,7 +16,7 @@ import typing from abc import abstractmethod -import neo +import srf import typing_utils import morpheus.pipeline as _pipeline @@ -69,10 +69,10 @@ def _pre_build(self) -> typing.List[StreamPair]: return in_ports_pairs @abstractmethod - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: pass - def _build(self, seg: neo.Segment, in_ports_streams: typing.List[StreamPair]) -> typing.List[StreamPair]: + def _build(self, builder: srf.Builder, in_ports_streams: typing.List[StreamPair]) -> typing.List[StreamPair]: # Derived source stages should override `_build_source` instead of this method. This allows for tracking the # True source object separate from the output stream. If any other operators need to be added after the source, # use `_post_build` @@ -81,15 +81,15 @@ def _build(self, seg: neo.Segment, in_ports_streams: typing.List[StreamPair]) -> assert len(in_ports_streams) == 1, "Should only have 1 port on input" - return [self._build_single(seg, in_ports_streams[0])] + return [self._build_single(builder, in_ports_streams[0])] - def _post_build_single(self, seg: neo.Segment, out_pair: StreamPair) -> StreamPair: + def _post_build_single(self, builder: srf.Builder, out_pair: StreamPair) -> StreamPair: return out_pair @typing.final - def _post_build(self, seg: neo.Segment, out_ports_pair: typing.List[StreamPair]) -> typing.List[StreamPair]: + def _post_build(self, builder: srf.Builder, out_ports_pair: typing.List[StreamPair]) -> typing.List[StreamPair]: - ret_val = self._post_build_single(seg, out_ports_pair[0]) + ret_val = self._post_build_single(builder, out_ports_pair[0]) logger.info("Added stage: {}\n └─ {} -> {}".format(str(self), pretty_print_type_name(self.input_ports[0].in_type), diff --git a/morpheus/pipeline/source_stage.py b/morpheus/pipeline/source_stage.py index 7787e5f584..26fe4d0903 100644 --- a/morpheus/pipeline/source_stage.py +++ b/morpheus/pipeline/source_stage.py @@ -16,7 +16,7 @@ import typing from abc import abstractmethod -import neo +import srf import morpheus.pipeline as _pipeline from morpheus.config import Config @@ -43,7 +43,7 @@ def __init__(self, c: Config): self._start_callbacks: typing.List[typing.Callable] = [] self._stop_callbacks: typing.List[typing.Callable] = [] - self._source_stream: neo.Node = None + self._source_stream: srf.SegmentObject = None @property def input_count(self) -> int: @@ -59,7 +59,7 @@ def input_count(self) -> int: return None @abstractmethod - def _build_source(self, seg: neo.Segment) -> StreamPair: + def _build_source(self, builder: srf.Builder) -> StreamPair: """ Abstract method all derived Source classes should implement. Returns the same value as `build`. @@ -69,19 +69,19 @@ def _build_source(self, seg: neo.Segment) -> StreamPair: ------- `morpheus.pipeline.pipeline.StreamPair`: - A tuple containing the output `neo.Node` object from this stage and the message data type. + A tuple containing the output `srf.SegmentObject` object from this stage and the message data type. """ pass @typing.final - def _build(self, seg: neo.Segment, in_ports_streams: typing.List[StreamPair]) -> typing.List[StreamPair]: + def _build(self, builder: srf.Builder, in_ports_streams: typing.List[StreamPair]) -> typing.List[StreamPair]: # Derived source stages should override `_build_source` instead of this method. This allows for tracking the # True source object separate from the output stream. If any other operators need to be added after the source, # use `_post_build` assert len(self.input_ports) == 0, "Sources shouldnt have input ports" - source_pair = self._build_source(seg) + source_pair = self._build_source(builder) curr_source = source_pair[0] @@ -92,7 +92,7 @@ def _build(self, seg: neo.Segment, in_ports_streams: typing.List[StreamPair]) -> return [source_pair] - def _post_build(self, seg: neo.Segment, out_ports_pair: typing.List[StreamPair]) -> typing.List[StreamPair]: + def _post_build(self, builder: srf.Builder, out_ports_pair: typing.List[StreamPair]) -> typing.List[StreamPair]: return out_ports_pair @@ -103,4 +103,4 @@ def stop(self): self._source_stream.stop() async def join(self): - self._source_stream.join() + pass diff --git a/morpheus/pipeline/stage.py b/morpheus/pipeline/stage.py index d46cc29d69..d32309d2ca 100644 --- a/morpheus/pipeline/stage.py +++ b/morpheus/pipeline/stage.py @@ -15,7 +15,7 @@ import logging import typing -import neo +import srf import morpheus.pipeline as _pipeline from morpheus.config import Config @@ -38,7 +38,7 @@ class Stage(_pipeline.StreamWrapper): def __init__(self, c: Config): super().__init__(c) - def _post_build(self, seg: neo.Segment, out_ports_pair: typing.List[StreamPair]) -> typing.List[StreamPair]: + def _post_build(self, builder: srf.Builder, out_ports_pair: typing.List[StreamPair]) -> typing.List[StreamPair]: return out_ports_pair diff --git a/morpheus/pipeline/stream_pair.py b/morpheus/pipeline/stream_pair.py index 5d6ff86508..5704ce6f9f 100644 --- a/morpheus/pipeline/stream_pair.py +++ b/morpheus/pipeline/stream_pair.py @@ -15,6 +15,6 @@ import typing -import neo +import srf -StreamPair = typing.Tuple[neo.Node, typing.Type] +StreamPair = typing.Tuple[srf.SegmentObject, typing.Type] diff --git a/morpheus/pipeline/stream_wrapper.py b/morpheus/pipeline/stream_wrapper.py index cc6290c15b..6bbe08a34f 100644 --- a/morpheus/pipeline/stream_wrapper.py +++ b/morpheus/pipeline/stream_wrapper.py @@ -20,7 +20,7 @@ from abc import ABC from abc import abstractmethod -import neo +import srf import morpheus.pipeline as _pipeline from morpheus.config import Config @@ -66,7 +66,7 @@ def inner(self: "StreamWrapper", c: Config, *args, **kwargs): class StreamWrapper(ABC, collections.abc.Hashable): """ - This abstract class serves as the morpheus.pipeline's base class. This class wraps a `neo.Node` + This abstract class serves as the morpheus.pipeline's base class. This class wraps a `srf.SegmentObject` object and aids in hooking stages up together. Parameters @@ -302,13 +302,13 @@ def can_build(self, check_ports=False) -> bool: return True - def build(self, seg: neo.Segment, do_propagate=True): + def build(self, builder: srf.Builder, do_propagate=True): """Build this stage. Parameters ---------- - seg : `neo.Segment` - Neo segment for this stage. + builder : `srf.Builder` + SRF segment for this stage. do_propagate : bool, optional Whether to propagate to build output stages, by default True. @@ -319,10 +319,10 @@ def build(self, seg: neo.Segment, do_propagate=True): # Pre-Build returns the input pairs for each port in_ports_pairs = self._pre_build() - out_ports_pair = self._build(seg, in_ports_pairs) + out_ports_pair = self._build(builder, in_ports_pairs) # Allow stages to do any post build steps (i.e., for sinks, or timing functions) - out_ports_pair = self._post_build(seg, out_ports_pair) + out_ports_pair = self._post_build(builder, out_ports_pair) assert len(out_ports_pair) == len(self.output_ports), \ "Build must return same number of output pairs as output ports" @@ -341,7 +341,7 @@ def build(self, seg: neo.Segment, do_propagate=True): if (not dep.can_build()): continue - dep.build(seg, do_propagate=do_propagate) + dep.build(builder, do_propagate=do_propagate) def _pre_build(self) -> typing.List[StreamPair]: in_pairs: typing.List[StreamPair] = [x.get_input_pair() for x in self.input_ports] @@ -349,32 +349,33 @@ def _pre_build(self) -> typing.List[StreamPair]: return in_pairs @abstractmethod - def _build(self, seg: neo.Segment, in_ports_streams: typing.List[StreamPair]) -> typing.List[StreamPair]: + def _build(self, builder: srf.Builder, in_ports_streams: typing.List[StreamPair]) -> typing.List[StreamPair]: """ - This function is responsible for constructing this stage's internal `neo.Node` object. The input + This function is responsible for constructing this stage's internal `srf.SegmentObject` object. The input of this function contains the returned value from the upstream stage. - The input values are the `neo.Segment` for this stage and a `StreamPair` tuple which contain the input - `neo.Node` object and the message data type. + The input values are the `srf.Builder` for this stage and a `StreamPair` tuple which contain the input + `srf.SegmentObject` object and the message data type. :meta public: Parameters ---------- - seg : `neo.Segment` - `neo.Segment` object for the pipeline. This should be used to construct/attach the internal `neo.Node`. + builder : `srf.Builder` + `srf.Builder` object for the pipeline. This should be used to construct/attach the internal + `srf.SegmentObject`. in_ports_streams : `morpheus.pipeline.pipeline.StreamPair` - List of tuples containing the input `neo.Node` object and the message data type. + List of tuples containing the input `srf.SegmentObject` object and the message data type. Returns ------- `typing.List[morpheus.pipeline.pipeline.StreamPair]` - List of tuples containing the output `neo.Node` object from this stage and the message data type. + List of tuples containing the output `srf.SegmentObject` object from this stage and the message data type. """ pass - def _post_build(self, seg: neo.Segment, out_ports_pair: typing.List[StreamPair]) -> typing.List[StreamPair]: + def _post_build(self, builder: srf.Builder, out_ports_pair: typing.List[StreamPair]) -> typing.List[StreamPair]: return out_ports_pair def start(self): diff --git a/morpheus/stages/general/buffer_stage.py b/morpheus/stages/general/buffer_stage.py index 818cfafd70..8d1a7d87e9 100644 --- a/morpheus/stages/general/buffer_stage.py +++ b/morpheus/stages/general/buffer_stage.py @@ -15,7 +15,7 @@ import logging import typing -import neo +import srf from morpheus.config import Config from morpheus.pipeline.single_port_stage import SinglePortStage @@ -61,7 +61,7 @@ def accepted_types(self) -> typing.Tuple: def supports_cpp_node(self): return False - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: # This stage is no longer needed and is just a pass thru stage deprecated_stage_warning(logger, type(self), self.unique_name) diff --git a/morpheus/stages/general/delay_stage.py b/morpheus/stages/general/delay_stage.py index 137c949aee..6b274714d9 100644 --- a/morpheus/stages/general/delay_stage.py +++ b/morpheus/stages/general/delay_stage.py @@ -15,7 +15,7 @@ import logging import typing -import neo +import srf from morpheus.config import Config from morpheus.pipeline.single_port_stage import SinglePortStage @@ -61,7 +61,7 @@ def accepted_types(self) -> typing.Tuple: def supports_cpp_node(self): return False - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: # This stage is no longer needed and is just a pass thru stage deprecated_stage_warning(logger, type(self), self.unique_name) diff --git a/morpheus/stages/general/monitor_stage.py b/morpheus/stages/general/monitor_stage.py index cb69b015e1..052427a6a8 100644 --- a/morpheus/stages/general/monitor_stage.py +++ b/morpheus/stages/general/monitor_stage.py @@ -16,7 +16,8 @@ import typing from functools import reduce -import neo +import srf +from srf.core import operators as ops from tqdm import TMonitor from tqdm import TqdmSynchronisationWarning from tqdm import tqdm @@ -213,10 +214,7 @@ def _ensure_progress_bar(self): self._progress.reset() - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - - def sink_on_error(x): - logger.error("Node: '%s' received error: %s", self.unique_name, x) + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: def sink_on_completed(): # Set the name to complete. This refreshes the display @@ -231,11 +229,15 @@ def sink_on_completed(): MorpheusTqdm.monitor.exit() MorpheusTqdm.monitor = None - stream = seg.make_sink(self.unique_name, self._progress_sink, sink_on_error, sink_on_completed) + def node_fn(obs: srf.Observable, sub: srf.Subscriber): + + obs.pipe(ops.map(self._progress_sink), ops.on_completed(sink_on_completed)).subscribe(sub) - seg.make_edge(input_stream[0], stream) + stream = builder.make_node_full(self.unique_name, node_fn) - return input_stream + builder.make_edge(input_stream[0], stream) + + return stream, input_stream[1] def _refresh_progress(self, _): self._progress.refresh() @@ -250,13 +252,15 @@ def _progress_sink(self, x): # Skip incase we have empty objects if (self._determine_count_fn is None): - return + return x # Do our best to determine the count n = self._determine_count_fn(x) self._progress.update(n=n) + return x + def _auto_count_fn(self, x): if (x is None): diff --git a/morpheus/stages/general/trigger_stage.py b/morpheus/stages/general/trigger_stage.py index 3435f744c2..6f9214c11a 100644 --- a/morpheus/stages/general/trigger_stage.py +++ b/morpheus/stages/general/trigger_stage.py @@ -15,8 +15,8 @@ import logging import typing -import neo -from neo.core import operators as ops +import srf +from srf.core import operators as ops from morpheus.config import Config from morpheus.pipeline.single_port_stage import SinglePortStage @@ -59,14 +59,14 @@ def accepted_types(self) -> typing.Tuple: def supports_cpp_node(self): return False - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: # Store all messages until on_complete is called and then push them - def node_fn(input: neo.Observable, output: neo.Subscriber): + def node_fn(obs: srf.Observable, sub: srf.Subscriber): - input.pipe(ops.to_list(), ops.flatten()).subscribe(output) + obs.pipe(ops.to_list(), ops.flatten()).subscribe(sub) - node = seg.make_node_full(self.unique_name, node_fn) - seg.make_edge(input_stream[0], node) + node = builder.make_node_full(self.unique_name, node_fn) + builder.make_edge(input_stream[0], node) return node, input_stream[1] diff --git a/morpheus/stages/inference/inference_stage.py b/morpheus/stages/inference/inference_stage.py index ed32e3aa2a..ca65ae1586 100644 --- a/morpheus/stages/inference/inference_stage.py +++ b/morpheus/stages/inference/inference_stage.py @@ -18,8 +18,8 @@ from functools import reduce import cupy as cp -import neo -from neo.core import operators as ops +import srf +from srf.core import operators as ops from morpheus.config import Config from morpheus.messages import MultiInferenceMessage @@ -200,15 +200,15 @@ def _get_inference_worker(self, inf_queue: ProducerConsumerQueue) -> InferenceWo """ pass - def _get_cpp_inference_node(self, seg: neo.Segment) -> neo.SegmentObject: + def _get_cpp_inference_node(self, builder: srf.Builder) -> srf.SegmentObject: raise NotImplementedError("No C++ node is available for this inference type") - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: stream = input_stream[0] out_type = MultiResponseProbsMessage - def py_inference_fn(input: neo.Observable, output: neo.Subscriber): + def py_inference_fn(obs: srf.Observable, sub: srf.Subscriber): worker = self._get_inference_worker(self._inf_queue) @@ -230,37 +230,37 @@ def on_next(x: MultiInferenceMessage): for batch in batches: outstanding_requests += 1 - fut = neo.Future() + completion_future = srf.Future() - def set_output_fut(resp: ResponseMemoryProbs, b, f: neo.Future): + def set_output_fut(resp: ResponseMemoryProbs, b, batch_future: srf.Future): nonlocal outstanding_requests m = self._convert_one_response(memory, b, resp) outstanding_requests -= 1 - f.set_result(m) + batch_future.set_result(m) - fut_list.append(fut) + fut_list.append(completion_future) - worker.process(batch, partial(set_output_fut, b=batch, f=fut)) + worker.process(batch, partial(set_output_fut, b=batch, batch_future=completion_future)) for f in fut_list: f.result() return output_message - input.pipe(ops.map(on_next)).subscribe(output) + obs.pipe(ops.map(on_next)).subscribe(sub) assert outstanding_requests == 0, "Not all inference requests were completed" if (self._build_cpp_node()): - node = self._get_cpp_inference_node(seg) + node = self._get_cpp_inference_node(builder) else: - node = seg.make_node_full(self.unique_name, py_inference_fn) + node = builder.make_node_full(self.unique_name, py_inference_fn) # Set the concurrency level to be up with the thread count - node.concurrency = self._thread_count - seg.make_edge(stream, node) + node.launch_options.pe_count = self._thread_count + builder.make_edge(stream, node) stream = node diff --git a/morpheus/stages/inference/triton_inference_stage.py b/morpheus/stages/inference/triton_inference_stage.py index 997eb46e42..dc44d7a326 100644 --- a/morpheus/stages/inference/triton_inference_stage.py +++ b/morpheus/stages/inference/triton_inference_stage.py @@ -24,13 +24,13 @@ from functools import partial import cupy as cp -import neo import numpy as np +import srf import tritonclient.grpc as tritonclient from tritonclient.utils import InferenceServerException from tritonclient.utils import triton_to_np_dtype -import morpheus._lib.stages as neos +import morpheus._lib.stages as _stages from morpheus.config import Config from morpheus.config import PipelineModes from morpheus.messages import MultiInferenceMessage @@ -889,10 +889,10 @@ def _get_inference_worker(self, inf_queue: ProducerConsumerQueue) -> InferenceWo return worker_cls(inf_queue=inf_queue, c=self._config, **self._kwargs) - def _get_cpp_inference_node(self, seg: neo.Segment): + def _get_cpp_inference_node(self, builder: srf.Builder): - return neos.InferenceClientStage(seg, - name=self.unique_name, - needs_logits=self._get_worker_class().needs_logits(), - inout_mapping=self._get_worker_class().default_inout_mapping(), - **self._kwargs) + return _stages.InferenceClientStage(builder, + name=self.unique_name, + needs_logits=self._get_worker_class().needs_logits(), + inout_mapping=self._get_worker_class().default_inout_mapping(), + **self._kwargs) diff --git a/morpheus/stages/input/appshield_source_stage.py b/morpheus/stages/input/appshield_source_stage.py index b97f3413b5..47da39205a 100644 --- a/morpheus/stages/input/appshield_source_stage.py +++ b/morpheus/stages/input/appshield_source_stage.py @@ -20,9 +20,9 @@ from functools import partial from json.decoder import JSONDecodeError -import neo import pandas as pd -from neo.core import operators as ops +import srf +from srf.core import operators as ops from morpheus.config import Config from morpheus.messages.message_meta import AppShieldMessageMeta @@ -346,22 +346,22 @@ def _build_metadata(x: typing.Dict[str, pd.DataFrame]): return metas - def _build_source(self, seg: neo.Segment) -> StreamPair: + def _build_source(self, builder: srf.Builder) -> StreamPair: # The first source just produces filenames - filename_source = self._watcher.build_node(self.unique_name, seg) + filename_source = self._watcher.build_node(self.unique_name, builder) out_type = typing.List[str] # Supposed to just return a source here return filename_source, out_type - def _post_build_single(self, seg: neo.Segment, out_pair: StreamPair) -> StreamPair: + def _post_build_single(self, builder: srf.Builder, out_pair: StreamPair) -> StreamPair: out_stream = out_pair[0] - def node_fn(input: neo.Observable, output: neo.Subscriber): - input.pipe( + def node_fn(obs: srf.Observable, sub: srf.Subscriber): + obs.pipe( # At this point, we have batches of filenames to process. Make a node for processing batches of # filenames into batches of dataframes ops.map( @@ -372,12 +372,12 @@ def node_fn(input: neo.Observable, output: neo.Subscriber): encoding=self._encoding)), ops.map(self._build_metadata), # Finally flatten to single meta - ops.flatten()).subscribe(output) + ops.flatten()).subscribe(sub) - post_node = seg.make_node_full(self.unique_name + "-post", node_fn) - seg.make_edge(out_stream, post_node) + post_node = builder.make_node_full(self.unique_name + "-post", node_fn) + builder.make_edge(out_stream, post_node) out_stream = post_node out_type = AppShieldMessageMeta - return super()._post_build_single(seg, (out_stream, out_type)) + return super()._post_build_single(builder, (out_stream, out_type)) diff --git a/morpheus/stages/input/cloud_trail_source_stage.py b/morpheus/stages/input/cloud_trail_source_stage.py index 8a356d9c2d..d51fd9319b 100644 --- a/morpheus/stages/input/cloud_trail_source_stage.py +++ b/morpheus/stages/input/cloud_trail_source_stage.py @@ -17,10 +17,10 @@ import typing from functools import partial -import neo import numpy as np import pandas as pd -from neo.core import operators as ops +import srf +from srf.core import operators as ops from morpheus._lib.file_types import FileTypes from morpheus._lib.file_types import determine_file_type @@ -316,24 +316,24 @@ def _build_user_metadata(self, x: typing.Dict[str, pd.DataFrame]): return user_metas - def _build_source(self, seg: neo.Segment) -> StreamPair: + def _build_source(self, builder: srf.Builder) -> StreamPair: # The first source just produces filenames - filename_source = self._watcher.build_node(self.unique_name, seg) + filename_source = self._watcher.build_node(self.unique_name, builder) out_type = typing.List[str] # Supposed to just return a source here return filename_source, out_type - def _post_build_single(self, seg: neo.Segment, out_pair: StreamPair) -> StreamPair: + def _post_build_single(self, builder: srf.Builder, out_pair: StreamPair) -> StreamPair: out_stream = out_pair[0] out_type = out_pair[1] - def node_fn(input: neo.Observable, output: neo.Subscriber): + def node_fn(obs: srf.Observable, sub: srf.Subscriber): - input.pipe( + obs.pipe( # At this point, we have batches of filenames to process. Make a node for processing batches of # filenames into batches of dataframes ops.map( @@ -348,12 +348,12 @@ def node_fn(input: neo.Observable, output: neo.Subscriber): # per user ops.map(self._build_user_metadata), # Finally flatten to single meta - ops.flatten()).subscribe(output) + ops.flatten()).subscribe(sub) - post_node = seg.make_node_full(self.unique_name + "-post", node_fn) - seg.make_edge(out_stream, post_node) + post_node = builder.make_node_full(self.unique_name + "-post", node_fn) + builder.make_edge(out_stream, post_node) out_stream = post_node out_type = UserMessageMeta - return super()._post_build_single(seg, (out_stream, out_type)) + return super()._post_build_single(builder, (out_stream, out_type)) diff --git a/morpheus/stages/input/file_source_stage.py b/morpheus/stages/input/file_source_stage.py index 8c4bb485be..9d0e88eaa1 100644 --- a/morpheus/stages/input/file_source_stage.py +++ b/morpheus/stages/input/file_source_stage.py @@ -15,11 +15,11 @@ import logging import typing -import neo +import srf import typing_utils -from neo.core import operators as ops +from srf.core import operators as ops -import morpheus._lib.stages as neos +import morpheus._lib.stages as _stages from morpheus._lib.file_types import FileTypes from morpheus.config import Config from morpheus.io.deserializers import read_file_to_df @@ -96,18 +96,18 @@ def input_count(self) -> int: def supports_cpp_node(self): return True - def _build_source(self, seg: neo.Segment) -> StreamPair: + def _build_source(self, builder: srf.Builder) -> StreamPair: if self._build_cpp_node(): - out_stream = neos.FileSourceStage(seg, self.unique_name, self._filename, self._repeat_count) + out_stream = _stages.FileSourceStage(builder, self.unique_name, self._filename, self._repeat_count) else: - out_stream = seg.make_source(self.unique_name, self._generate_frames()) + out_stream = builder.make_source(self.unique_name, self._generate_frames()) out_type = MessageMeta return out_stream, out_type - def _post_build_single(self, seg: neo.Segment, out_pair: StreamPair) -> StreamPair: + def _post_build_single(self, builder: srf.Builder, out_pair: StreamPair) -> StreamPair: out_stream = out_pair[0] out_type = out_pair[1] @@ -115,16 +115,16 @@ def _post_build_single(self, seg: neo.Segment, out_pair: StreamPair) -> StreamPa # Convert our list of dataframes into the desired type. Flatten if necessary if (typing_utils.issubtype(out_type, typing.List)): - def node_fn(input: neo.Observable, output: neo.Subscriber): + def node_fn(obs: srf.Observable, sub: srf.Subscriber): - input.pipe(ops.flatten()).subscribe(output) + obs.pipe(ops.flatten()).subscribe(sub) - flattened = seg.make_node_full(self.unique_name + "-post", node_fn) - seg.make_edge(out_stream, flattened) + flattened = builder.make_node_full(self.unique_name + "-post", node_fn) + builder.make_edge(out_stream, flattened) out_stream = flattened out_type = typing.get_args(out_type)[0] - return super()._post_build_single(seg, (out_stream, out_type)) + return super()._post_build_single(builder, (out_stream, out_type)) def _generate_frames(self): diff --git a/morpheus/stages/input/kafka_source_stage.py b/morpheus/stages/input/kafka_source_stage.py index 885bcd2a47..76f3814f96 100644 --- a/morpheus/stages/input/kafka_source_stage.py +++ b/morpheus/stages/input/kafka_source_stage.py @@ -16,13 +16,13 @@ import time import weakref -import neo import pandas as pd +import srf from cudf_kafka._lib.kafka import KafkaDatasource import cudf -import morpheus._lib.stages as neos +import morpheus._lib.stages as _stages from morpheus.config import Config from morpheus.messages import MessageMeta from morpheus.pipeline.single_output_source import SingleOutputSource @@ -107,7 +107,7 @@ def name(self) -> str: def supports_cpp_node(self): return True - def _source_generator(self, s: neo.Subscriber): + def _source_generator(self, sub: srf.Subscriber): # Each invocation of this function makes a new thread so recreate the producers # Set some initial values @@ -181,7 +181,7 @@ def _source_generator(self, s: neo.Subscriber): for partition in range(npartitions): tps.append(ck.TopicPartition(self._topic, partition)) - while s.is_subscribed(): + while sub.is_subscribed(): try: committed = consumer.committed(tps, timeout=1) except ck.KafkaException: @@ -191,7 +191,7 @@ def _source_generator(self, s: neo.Subscriber): positions[tp.partition] = tp.offset break - while s.is_subscribed(): + while sub.is_subscribed(): out = [] if self._refresh_partitions: @@ -251,7 +251,7 @@ def commit(topic, part_no, keys, lowest, offset): weakref.finalize(meta, commit, *part[1:]) # Push the message meta - s.on_next(meta) + sub.on_next(meta) else: time.sleep(self._poll_interval) except Exception: @@ -263,7 +263,7 @@ def commit(topic, part_no, keys, lowest, offset): # Close the consumer and call on_completed if (consumer): consumer.close() - s.on_completed() + sub.on_completed() def _kafka_params_to_messagemeta(self, x: tuple): @@ -328,21 +328,21 @@ def _read_gdf(kafka_configs, kafka_datasource.unsubscribe() kafka_datasource.close(batch_timeout) - def _build_source(self, seg: neo.Segment) -> StreamPair: + def _build_source(self, builder: srf.Builder) -> StreamPair: if (self._build_cpp_node()): - source = neos.KafkaSourceStage(seg, - self.unique_name, - self._max_batch_size, - self._topic, - int(self._poll_interval * 1000), - self._consumer_params, - self._disable_commit, - self._disable_pre_filtering) - source.concurrency = self._max_concurrent + source = _stages.KafkaSourceStage(builder, + self.unique_name, + self._max_batch_size, + self._topic, + int(self._poll_interval * 1000), + self._consumer_params, + self._disable_commit, + self._disable_pre_filtering) + source.launch_options.pe_count = self._max_concurrent else: - source = seg.make_source(self.unique_name, self._source_generator) + source = builder.make_source(self.unique_name, self._source_generator) - source.concurrency = self._max_concurrent + source.launch_options.pe_count = self._max_concurrent return source, MessageMeta diff --git a/morpheus/stages/output/write_to_file_stage.py b/morpheus/stages/output/write_to_file_stage.py index d67ca16681..e3ea37ad30 100644 --- a/morpheus/stages/output/write_to_file_stage.py +++ b/morpheus/stages/output/write_to_file_stage.py @@ -15,13 +15,13 @@ import os import typing -import neo -import neo.core.operators as ops import pandas as pd +import srf +import srf.core.operators as ops import cudf -import morpheus._lib.stages as neos +import morpheus._lib.stages as _stages from morpheus._lib.file_types import FileTypes from morpheus._lib.file_types import determine_file_type from morpheus.config import Config @@ -104,16 +104,16 @@ def _convert_to_strings(self, df: typing.Union[pd.DataFrame, cudf.DataFrame]): return output_strs - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: stream = input_stream[0] # Sink to file if (self._build_cpp_node()): - to_file = neos.WriteToFileStage(seg, self.unique_name, self._output_file, "w", self._file_type) + to_file = _stages.WriteToFileStage(builder, self.unique_name, self._output_file, "w", self._file_type) else: - def node_fn(input: neo.Observable, output: neo.Subscriber): + def node_fn(obs: srf.Observable, sub: srf.Subscriber): # Ensure our directory exists os.makedirs(os.path.realpath(os.path.dirname(self._output_file)), exist_ok=True) @@ -129,14 +129,14 @@ def write_to_file(x: MessageMeta): return x - input.pipe(ops.map(write_to_file)).subscribe(output) + obs.pipe(ops.map(write_to_file)).subscribe(sub) # File should be closed by here - to_file = seg.make_node_full(self.unique_name, node_fn) + to_file = builder.make_node_full(self.unique_name, node_fn) - seg.make_edge(stream, to_file) + builder.make_edge(stream, to_file) stream = to_file # Return input unchanged to allow passthrough - return input_stream + return stream, input_stream[1] diff --git a/morpheus/stages/output/write_to_kafka_stage.py b/morpheus/stages/output/write_to_kafka_stage.py index bf20cc186a..6a04a69020 100644 --- a/morpheus/stages/output/write_to_kafka_stage.py +++ b/morpheus/stages/output/write_to_kafka_stage.py @@ -17,8 +17,8 @@ import typing import confluent_kafka as ck -import neo -from neo.core import operators as ops +import srf +from srf.core import operators as ops from morpheus.config import Config from morpheus.io import serializers @@ -72,12 +72,12 @@ def accepted_types(self) -> typing.Tuple: def supports_cpp_node(self): return False - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: # Convert the messages to rows of strings stream = input_stream[0] - def node_fn(input: neo.Observable, output: neo.Subscriber): + def node_fn(obs: srf.Observable, sub: srf.Subscriber): producer = ck.Producer(self._kafka_conf) @@ -88,7 +88,6 @@ def on_next(x: typing.List[str]): def cb(_, msg): if msg is not None and msg.value() is not None: - # fut.set_result(None) pass else: # fut.set_exception(err or msg.error()) @@ -97,7 +96,7 @@ def cb(_, msg): self._kafka_conf["bootstrap.servers"], msg.value(), msg.error()) - output.on_error(msg.error()) + sub.on_error(msg.error()) records = serializers.df_to_json(x.df, strip_newlines=True) for m in records: @@ -129,14 +128,14 @@ def on_completed(): producer.flush(-1) - input.pipe(ops.map(on_next), ops.on_completed(on_completed)).subscribe(output) + obs.pipe(ops.map(on_next), ops.on_completed(on_completed)).subscribe(sub) assert outstanding_requests == 0, "Not all inference requests were completed" # Write to kafka - node = seg.make_node_full(self.unique_name, node_fn) - seg.make_edge(stream, node) - # node.concurrency = self._max_concurrent + node = builder.make_node_full(self.unique_name, node_fn) + builder.make_edge(stream, node) + # node.launch_options.pe_count = self._max_concurrent # Return input unchanged return input_stream diff --git a/morpheus/stages/postprocess/add_classifications_stage.py b/morpheus/stages/postprocess/add_classifications_stage.py index b8cd44ce8e..9bb29d8e9e 100644 --- a/morpheus/stages/postprocess/add_classifications_stage.py +++ b/morpheus/stages/postprocess/add_classifications_stage.py @@ -15,9 +15,9 @@ import logging import typing -import neo +import srf -import morpheus._lib.stages as neos +import morpheus._lib.stages as _stages from morpheus.config import Config from morpheus.messages import MultiResponseProbsMessage from morpheus.pipeline.single_port_stage import SinglePortStage @@ -102,19 +102,19 @@ def _add_labels(self, x: MultiResponseProbsMessage): # Return passthrough return x - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: # Convert the messages to rows of strings if self._build_cpp_node(): - stream = neos.AddClassificationsStage(seg, - self.unique_name, - self._threshold, - len(self._class_labels), - self._idx2label) + stream = _stages.AddClassificationsStage(builder, + self.unique_name, + self._threshold, + len(self._class_labels), + self._idx2label) else: - stream = seg.make_node(self.unique_name, self._add_labels) + stream = builder.make_node(self.unique_name, self._add_labels) - seg.make_edge(input_stream[0], stream) + builder.make_edge(input_stream[0], stream) # Return input unchanged return stream, MultiResponseProbsMessage diff --git a/morpheus/stages/postprocess/add_scores_stage.py b/morpheus/stages/postprocess/add_scores_stage.py index 6c73e6909e..973dd38b2d 100644 --- a/morpheus/stages/postprocess/add_scores_stage.py +++ b/morpheus/stages/postprocess/add_scores_stage.py @@ -15,9 +15,9 @@ import logging import typing -import neo +import srf -import morpheus._lib.stages as neos +import morpheus._lib.stages as _stages from morpheus.config import Config from morpheus.messages import MultiResponseProbsMessage from morpheus.pipeline.single_port_stage import SinglePortStage @@ -99,15 +99,15 @@ def _add_labels(self, x: MultiResponseProbsMessage): # Return passthrough return x - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: # Convert the messages to rows of strings if self._build_cpp_node(): - stream = neos.AddScoresStage(seg, self.unique_name, len(self._class_labels), self._idx2label) + stream = _stages.AddScoresStage(builder, self.unique_name, len(self._class_labels), self._idx2label) else: - stream = seg.make_node(self.unique_name, self._add_labels) + stream = builder.make_node(self.unique_name, self._add_labels) - seg.make_edge(input_stream[0], stream) + builder.make_edge(input_stream[0], stream) # Return input unchanged return stream, input_stream[1] diff --git a/morpheus/stages/postprocess/filter_detections_stage.py b/morpheus/stages/postprocess/filter_detections_stage.py index b568d415a9..0f8b2386bc 100644 --- a/morpheus/stages/postprocess/filter_detections_stage.py +++ b/morpheus/stages/postprocess/filter_detections_stage.py @@ -16,10 +16,10 @@ import typing import cupy as cp -import neo -from neo.core import operators as ops +import srf +from srf.core import operators as ops -import morpheus._lib.stages as neos +import morpheus._lib.stages as _stages from morpheus.config import Config from morpheus.messages import MultiResponseProbsMessage from morpheus.pipeline.single_port_stage import SinglePortStage @@ -112,18 +112,18 @@ def filter(self, x: MultiResponseProbsMessage) -> typing.List[MultiResponseProbs return output_list - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: # Convert list back to single MultiResponseProbsMessage - def flatten_fn(input: neo.Observable, output: neo.Subscriber): + def flatten_fn(obs: srf.Observable, sub: srf.Subscriber): - input.pipe(ops.map(self.filter), ops.flatten()).subscribe(output) + obs.pipe(ops.map(self.filter), ops.flatten()).subscribe(sub) if self._build_cpp_node(): - stream = neos.FilterDetectionsStage(seg, self.unique_name, self._threshold) + stream = _stages.FilterDetectionsStage(builder, self.unique_name, self._threshold) else: - stream = seg.make_node_full(self.unique_name, flatten_fn) + stream = builder.make_node_full(self.unique_name, flatten_fn) - seg.make_edge(input_stream[0], stream) + builder.make_edge(input_stream[0], stream) return stream, MultiResponseProbsMessage diff --git a/morpheus/stages/postprocess/generate_viz_frames_stage.py b/morpheus/stages/postprocess/generate_viz_frames_stage.py index d910a11fba..a8ee258d59 100644 --- a/morpheus/stages/postprocess/generate_viz_frames_stage.py +++ b/morpheus/stages/postprocess/generate_viz_frames_stage.py @@ -18,9 +18,9 @@ import typing import warnings -import neo import numpy as np import pandas as pd +import srf from morpheus.config import Config from morpheus.messages import MultiResponseProbsMessage @@ -158,7 +158,7 @@ def _write_viz_file(self, x: typing.List[typing.Tuple[int, pd.DataFrame]]): in_df.to_csv(fn, columns=["timestamp", "src_ip", "dest_ip", "src_port", "dest_port", "si", "data"]) - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: stream = input_stream[0] diff --git a/morpheus/stages/postprocess/ml_flow_drift_stage.py b/morpheus/stages/postprocess/ml_flow_drift_stage.py index cd42c2061f..a79585473e 100644 --- a/morpheus/stages/postprocess/ml_flow_drift_stage.py +++ b/morpheus/stages/postprocess/ml_flow_drift_stage.py @@ -18,7 +18,7 @@ import cupy as cp import mlflow -import neo +import srf from morpheus.config import Config from morpheus.messages import MultiResponseMessage @@ -146,13 +146,13 @@ def _calc_drift(self, x: MultiResponseProbsMessage): return x - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: stream = input_stream[0] # Convert the messages to rows of strings - node = seg.make_node(self.unique_name, self._calc_drift) - seg.make_edge(input_stream[0], node) + node = builder.make_node(self.unique_name, self._calc_drift) + builder.make_edge(input_stream[0], node) stream = node # Return input unchanged diff --git a/morpheus/stages/postprocess/serialize_stage.py b/morpheus/stages/postprocess/serialize_stage.py index cb52b7464e..aed03f9da8 100644 --- a/morpheus/stages/postprocess/serialize_stage.py +++ b/morpheus/stages/postprocess/serialize_stage.py @@ -17,9 +17,9 @@ import typing from functools import partial -import neo +import srf -import morpheus._lib.stages as neos +import morpheus._lib.stages as _stages from morpheus.config import Config from morpheus.messages import MessageMeta from morpheus.messages import MultiMessage @@ -120,13 +120,13 @@ def convert_to_df(self, return MessageMeta(df=df) - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: if (self._build_cpp_node()): - stream = neos.SerializeStage(seg, - self.unique_name, - self._include_columns or [], - self._exclude_columns, - self._fixed_columns) + stream = _stages.SerializeStage(builder, + self.unique_name, + self._include_columns or [], + self._exclude_columns, + self._fixed_columns) else: include_columns = None @@ -135,10 +135,10 @@ def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPai exclude_columns = [re.compile(x) for x in self._exclude_columns] - stream = seg.make_node( + stream = builder.make_node( self.unique_name, partial(self.convert_to_df, include_columns=include_columns, exclude_columns=exclude_columns)) - seg.make_edge(input_stream[0], stream) + builder.make_edge(input_stream[0], stream) return stream, MessageMeta diff --git a/morpheus/stages/postprocess/timeseries_stage.py b/morpheus/stages/postprocess/timeseries_stage.py index 24b9d3404c..689d8c4390 100644 --- a/morpheus/stages/postprocess/timeseries_stage.py +++ b/morpheus/stages/postprocess/timeseries_stage.py @@ -21,9 +21,9 @@ from math import ceil import cupy as cp -import neo import pandas as pd -from neo.core import operators as ops +import srf +from srf.core import operators as ops from morpheus.config import Config from morpheus.messages import MultiResponseAEMessage @@ -452,12 +452,12 @@ def _call_timeseries_user(self, x: MultiResponseAEMessage): return self._timeseries_per_user[x.user_id]._calc_timeseries(x, False) - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: stream = input_stream[0] out_type = input_stream[1] - def node_fn(input: neo.Observable, output: neo.Subscriber): + def node_fn(obs: srf.Observable, sub: srf.Subscriber): def on_next(x: MultiResponseAEMessage): @@ -476,13 +476,11 @@ def on_completed(): return to_send if len(to_send) > 0 else None - input.pipe(ops.map(on_next), - ops.filter(lambda x: len(x) > 0), - ops.on_completed(on_completed), - ops.flatten()).subscribe(output) + obs.pipe(ops.map(on_next), ops.filter(lambda x: len(x) > 0), ops.on_completed(on_completed), + ops.flatten()).subscribe(sub) - stream = seg.make_node_full(self.unique_name, node_fn) + stream = builder.make_node_full(self.unique_name, node_fn) - seg.make_edge(input_stream[0], stream) + builder.make_edge(input_stream[0], stream) return stream, out_type diff --git a/morpheus/stages/postprocess/validation_stage.py b/morpheus/stages/postprocess/validation_stage.py index 8e27efece6..c52df37701 100644 --- a/morpheus/stages/postprocess/validation_stage.py +++ b/morpheus/stages/postprocess/validation_stage.py @@ -19,9 +19,9 @@ import re import typing -import neo import pandas as pd -from neo.core import operators as ops +import srf +from srf.core import operators as ops import cudf @@ -168,7 +168,7 @@ def _do_comparison(self, messages: typing.List[MultiMessage]): if (self._index_col.startswith("_index_")): results_df.index.name = str(results_df.index.name).replace("_index_", "", 1) - val_df = self._filter_df(self._val_df) + val_df = self._filter_df(read_file_to_df(self._val_file_name, FileTypes.Auto, df_type="pandas")) # Now start the comparison missing_columns = val_df.columns.difference(results_df.columns) @@ -222,12 +222,10 @@ def _do_comparison(self, messages: typing.List[MultiMessage]): with open(self._results_file_name, "w") as f: json.dump(output, f, indent=2, sort_keys=True) - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: - - self._val_df: pd.DataFrame = read_file_to_df(self._val_file_name, FileTypes.Auto, df_type="pandas") + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: # Store all messages until on_complete is called and then build the dataframe and compare - def node_fn(input: neo.Observable, output: neo.Subscriber): + def node_fn(obs: srf.Observable, sub: srf.Subscriber): def do_compare(delayed_messages): @@ -235,9 +233,9 @@ def do_compare(delayed_messages): return delayed_messages - input.pipe(ops.to_list(), ops.map(do_compare), ops.flatten()).subscribe(output) + obs.pipe(ops.to_list(), ops.map(do_compare), ops.flatten()).subscribe(sub) - node = seg.make_node_full(self.unique_name, node_fn) - seg.make_edge(input_stream[0], node) + node = builder.make_node_full(self.unique_name, node_fn) + builder.make_edge(input_stream[0], node) return node, input_stream[1] diff --git a/morpheus/stages/preprocess/deserialize_stage.py b/morpheus/stages/preprocess/deserialize_stage.py index c9ad49b6cc..4cd15de604 100644 --- a/morpheus/stages/preprocess/deserialize_stage.py +++ b/morpheus/stages/preprocess/deserialize_stage.py @@ -17,10 +17,10 @@ import typing from functools import partial -import neo -from neo.core import operators as ops +import srf +from srf.core import operators as ops -import morpheus._lib.stages as neos +import morpheus._lib.stages as _stages from morpheus.config import Config from morpheus.messages import MessageMeta from morpheus.messages import MultiMessage @@ -91,21 +91,21 @@ def process_dataframe(x: MessageMeta, batch_size: int) -> typing.List[MultiMessa return output - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: stream = input_stream[0] out_type = MultiMessage - def node_fn(input: neo.Observable, output: neo.Subscriber): + def node_fn(obs: srf.Observable, sub: srf.Subscriber): - input.pipe(ops.map(partial(DeserializeStage.process_dataframe, batch_size=self._batch_size)), - ops.flatten()).subscribe(output) + obs.pipe(ops.map(partial(DeserializeStage.process_dataframe, batch_size=self._batch_size)), + ops.flatten()).subscribe(sub) if self._build_cpp_node(): - stream = neos.DeserializeStage(seg, self.unique_name, self._batch_size) + stream = _stages.DeserializeStage(builder, self.unique_name, self._batch_size) else: - stream = seg.make_node_full(self.unique_name, node_fn) + stream = builder.make_node_full(self.unique_name, node_fn) - seg.make_edge(input_stream[0], stream) + builder.make_edge(input_stream[0], stream) return stream, out_type diff --git a/morpheus/stages/preprocess/drop_null_stage.py b/morpheus/stages/preprocess/drop_null_stage.py index daa89c4da8..24a5ac7ad4 100644 --- a/morpheus/stages/preprocess/drop_null_stage.py +++ b/morpheus/stages/preprocess/drop_null_stage.py @@ -14,8 +14,8 @@ import typing -import neo -from neo.core import operators as ops +import srf +from srf.core import operators as ops from morpheus.config import Config from morpheus.messages import MessageMeta @@ -64,11 +64,11 @@ def supports_cpp_node(self): # Enable support by default return False - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: stream = input_stream[0] # Finally, flatten to a single stream - def node_fn(input: neo.Observable, output: neo.Subscriber): + def node_fn(obs: srf.Observable, sub: srf.Subscriber): def on_next(x: MessageMeta): @@ -76,10 +76,10 @@ def on_next(x: MessageMeta): return y - input.pipe(ops.map(on_next), ops.filter(lambda x: not x.df.empty)).subscribe(output) + obs.pipe(ops.map(on_next), ops.filter(lambda x: not x.df.empty)).subscribe(sub) - node = seg.make_node_full(self.unique_name, node_fn) - seg.make_edge(stream, node) + node = builder.make_node_full(self.unique_name, node_fn) + builder.make_edge(stream, node) stream = node return stream, input_stream[1] diff --git a/morpheus/stages/preprocess/preprocess_ae_stage.py b/morpheus/stages/preprocess/preprocess_ae_stage.py index 4e757a967c..b2b5c49cdd 100644 --- a/morpheus/stages/preprocess/preprocess_ae_stage.py +++ b/morpheus/stages/preprocess/preprocess_ae_stage.py @@ -17,7 +17,7 @@ from functools import partial import cupy as cp -import neo +import srf from morpheus.config import Config from morpheus.messages import InferenceMemoryAE @@ -108,5 +108,5 @@ def _get_preprocess_fn(self) -> typing.Callable[[MultiMessage], MultiInferenceMe fea_len=self._fea_length, feature_columns=self._feature_columns) - def _get_preprocess_node(self, seg: neo.Segment): + def _get_preprocess_node(self, builder: srf.Builder): raise NotImplementedError("No C++ node for AE") diff --git a/morpheus/stages/preprocess/preprocess_base_stage.py b/morpheus/stages/preprocess/preprocess_base_stage.py index 34284b508f..d5d280a31b 100644 --- a/morpheus/stages/preprocess/preprocess_base_stage.py +++ b/morpheus/stages/preprocess/preprocess_base_stage.py @@ -16,7 +16,7 @@ import typing from abc import abstractmethod -import neo +import srf import typing_utils from morpheus.config import Config @@ -54,10 +54,10 @@ def _get_preprocess_fn(self) -> typing.Callable[[MultiMessage], MultiInferenceMe pass @abstractmethod - def _get_preprocess_node(self, seg: neo.Segment): + def _get_preprocess_node(self, builder: srf.Builder): pass - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: stream = input_stream[0] out_type = MultiInferenceMessage @@ -71,10 +71,10 @@ def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPai out_type = preproc_sig.return_annotation if self._build_cpp_node(): - stream = self._get_preprocess_node(seg) + stream = self._get_preprocess_node(builder) else: - stream = seg.make_node(self.unique_name, preprocess_fn) + stream = builder.make_node(self.unique_name, preprocess_fn) - seg.make_edge(input_stream[0], stream) + builder.make_edge(input_stream[0], stream) return stream, out_type diff --git a/morpheus/stages/preprocess/preprocess_fil_stage.py b/morpheus/stages/preprocess/preprocess_fil_stage.py index 2070ff8f54..9f5037312d 100644 --- a/morpheus/stages/preprocess/preprocess_fil_stage.py +++ b/morpheus/stages/preprocess/preprocess_fil_stage.py @@ -17,13 +17,13 @@ from functools import partial import cupy as cp -import neo import numpy as np import pandas as pd +import srf import cudf -import morpheus._lib.stages as neos +import morpheus._lib.stages as _stages from morpheus.config import Config from morpheus.messages import InferenceMemoryFIL from morpheus.messages import MultiInferenceFILMessage @@ -125,5 +125,5 @@ def pre_process_batch(x: MultiMessage, fea_len: int, fea_cols: typing.List[str]) def _get_preprocess_fn(self) -> typing.Callable[[MultiMessage], MultiInferenceMessage]: return partial(PreprocessFILStage.pre_process_batch, fea_len=self._fea_length, fea_cols=self.features) - def _get_preprocess_node(self, seg: neo.Segment): - return neos.PreprocessFILStage(seg, self.unique_name, self.features) + def _get_preprocess_node(self, builder: srf.Builder): + return _stages.PreprocessFILStage(builder, self.unique_name, self.features) diff --git a/morpheus/stages/preprocess/preprocess_nlp_stage.py b/morpheus/stages/preprocess/preprocess_nlp_stage.py index fcf69d98f0..d6d4d04992 100644 --- a/morpheus/stages/preprocess/preprocess_nlp_stage.py +++ b/morpheus/stages/preprocess/preprocess_nlp_stage.py @@ -15,12 +15,12 @@ import typing from functools import partial -import neo +import srf import cudf from cudf.core.subword_tokenizer import SubwordTokenizer -import morpheus._lib.stages as neos +import morpheus._lib.stages as _stages from morpheus.config import Config from morpheus.messages import InferenceMemoryNLP from morpheus.messages import MultiInferenceMessage @@ -168,12 +168,12 @@ def _get_preprocess_fn(self) -> typing.Callable[[MultiMessage], MultiInferenceMe truncation=self._truncation, add_special_tokens=self._add_special_tokens) - def _get_preprocess_node(self, seg: neo.Segment): - return neos.PreprocessNLPStage(seg, - self.unique_name, - self._vocab_hash_file, - self._seq_length, - self._truncation, - self._do_lower_case, - self._add_special_tokens, - self._stride) + def _get_preprocess_node(self, builder: srf.Builder): + return _stages.PreprocessNLPStage(builder, + self.unique_name, + self._vocab_hash_file, + self._seq_length, + self._truncation, + self._do_lower_case, + self._add_special_tokens, + self._stride) diff --git a/morpheus/stages/preprocess/train_ae_stage.py b/morpheus/stages/preprocess/train_ae_stage.py index 0d8c0eff65..9a03f69680 100644 --- a/morpheus/stages/preprocess/train_ae_stage.py +++ b/morpheus/stages/preprocess/train_ae_stage.py @@ -17,12 +17,12 @@ import typing import dill -import neo import numpy as np import pandas as pd +import srf import torch from dfencoder import AutoEncoder -from neo.core import operators as ops +from srf.core import operators as ops from morpheus._lib.file_types import FileTypes from morpheus.config import Config @@ -196,7 +196,7 @@ def _train_model(self, x: UserMessageMeta) -> typing.List[MultiAEMessage]: return model - def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPair: + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: stream = input_stream[0] get_model_fn = None @@ -238,7 +238,7 @@ def _build_single(self, seg: neo.Segment, input_stream: StreamPair) -> StreamPai else: get_model_fn = self._train_model - def node_fn(input: neo.Observable, output: neo.Subscriber): + def node_fn(obs: srf.Observable, sub: srf.Subscriber): def on_next(x: UserMessageMeta): @@ -255,10 +255,10 @@ def on_next(x: UserMessageMeta): return to_send - input.pipe(ops.map(on_next), ops.flatten()).subscribe(output) + obs.pipe(ops.map(on_next), ops.flatten()).subscribe(sub) - node = seg.make_node_full(self.unique_name, node_fn) - seg.make_edge(stream, node) + node = builder.make_node_full(self.unique_name, node_fn) + builder.make_edge(stream, node) stream = node return stream, MultiAEMessage diff --git a/morpheus/utils/directory_watcher.py b/morpheus/utils/directory_watcher.py index 4fda39b8b9..296ecd31f0 100644 --- a/morpheus/utils/directory_watcher.py +++ b/morpheus/utils/directory_watcher.py @@ -17,7 +17,7 @@ import os import queue -import neo +import srf from watchdog.events import FileSystemEvent from watchdog.events import PatternMatchingEventHandler from watchdog.observers import Observer @@ -90,10 +90,10 @@ def __init__(self, # Will be a watchdog observer if enabled self._watcher = None - def build_node(self, name: str, seg: neo.Segment): + def build_node(self, name: str, builder: srf.Builder): # The first source just produces filenames - return seg.make_source(name, self._generate_via_polling()) + return builder.make_source(name, self._generate_via_polling()) def _get_filename_queue(self) -> FiberQueue: """ diff --git a/tests/benchmarks/static_message_source.py b/tests/benchmarks/static_message_source.py index b09e81e940..2f4c1f0596 100644 --- a/tests/benchmarks/static_message_source.py +++ b/tests/benchmarks/static_message_source.py @@ -15,8 +15,8 @@ import typing -import neo -import neo.core.operators as ops +import srf +import srf.core.operators as ops import typing_utils import cudf @@ -46,11 +46,11 @@ def supports_cpp_node(self): def input_count(self) -> int: return len(self._df) - def _build_source(self, seg: neo.Segment) -> StreamPair: - out_stream = seg.make_source(self.unique_name, self._generate_frames()) + def _build_source(self, builder: srf.Builder) -> StreamPair: + out_stream = builder.make_source(self.unique_name, self._generate_frames()) return out_stream, MessageMeta - def _post_build_single(self, seg: neo.Segment, out_pair: StreamPair) -> StreamPair: + def _post_build_single(self, builder: srf.Builder, out_pair: StreamPair) -> StreamPair: out_stream = out_pair[0] out_type = out_pair[1] @@ -58,16 +58,16 @@ def _post_build_single(self, seg: neo.Segment, out_pair: StreamPair) -> StreamPa # Convert our list of dataframes into the desired type. Flatten if necessary if (typing_utils.issubtype(out_type, typing.List)): - def node_fn(input: neo.Observable, output: neo.Subscriber): + def node_fn(obs: srf.Observable, sub: srf.Subscriber): - input.pipe(ops.flatten()).subscribe(output) + obs.pipe(ops.flatten()).subscribe(sub) - flattened = seg.make_node_full(self.unique_name + "-post", node_fn) - seg.make_edge(out_stream, flattened) + flattened = builder.make_node_full(self.unique_name + "-post", node_fn) + builder.make_edge(out_stream, flattened) out_stream = flattened out_type = typing.get_args(out_type)[0] - return super()._post_build_single(seg, (out_stream, out_type)) + return super()._post_build_single(builder, (out_stream, out_type)) def _generate_frames(self): yield MessageMeta(self._df) diff --git a/tests/test_inference_stage.py b/tests/test_inference_stage.py index 826a9d3e59..7c92d3588e 100755 --- a/tests/test_inference_stage.py +++ b/tests/test_inference_stage.py @@ -76,7 +76,7 @@ def test_build_single(config): mock_segment.make_node_full.assert_called_once() mock_segment.make_edge.assert_called_once() - assert mock_node.concurrency == 17 + assert mock_node.launch_options.pe_count == 17 @pytest.mark.use_python @@ -106,7 +106,7 @@ def test_py_inf_fn(config): @pytest.mark.use_python -@mock.patch('neo.Future') +@mock.patch('srf.Future') @mock.patch('morpheus.stages.inference.inference_stage.ops') def test_py_inf_fn_on_next(mock_ops, mock_future, config): mock_future.return_value = mock_future @@ -171,7 +171,7 @@ def test_build_single_cpp(config): mock_segment.make_node_full.assert_not_called() mock_segment.make_edge.assert_called_once() - assert mock_node.concurrency == 17 + assert mock_node.launch_options.pe_count == 17 @pytest.mark.use_cpp diff --git a/tests/test_messages.py b/tests/test_messages.py index dec9d4ae5d..29d7fbbe79 100644 --- a/tests/test_messages.py +++ b/tests/test_messages.py @@ -19,7 +19,7 @@ import cupy as cp import pytest -import morpheus._lib.messages as neom +import morpheus._lib.messages as _messages import morpheus.config from morpheus import messages @@ -41,15 +41,15 @@ def check_message(python_type: type, cpp_type: type, should_be_cpp: bool, no_cpp def check_all_messages(should_be_cpp: bool, no_cpp_class: bool): - check_message(messages.MessageMeta, neom.MessageMeta, should_be_cpp, no_cpp_class, (None, )) + check_message(messages.MessageMeta, _messages.MessageMeta, should_be_cpp, no_cpp_class, (None, )) # UserMessageMeta doesn't contain a C++ impl, so we should # always received the python impl check_message(messages.UserMessageMeta, None, should_be_cpp, no_cpp_class, (None, None)) - check_message(messages.MultiMessage, neom.MultiMessage, should_be_cpp, no_cpp_class, (None, 0, 1)) + check_message(messages.MultiMessage, _messages.MultiMessage, should_be_cpp, no_cpp_class, (None, 0, 1)) - assert messages.InferenceMemory._cpp_class is None if no_cpp_class else neom.InferenceMemory + assert messages.InferenceMemory._cpp_class is None if no_cpp_class else _messages.InferenceMemory # C++ impl for InferenceMemory doesn't have a constructor if (should_be_cpp): pytest.raises(TypeError, messages.InferenceMemory, 1) @@ -57,12 +57,12 @@ def check_all_messages(should_be_cpp: bool, no_cpp_class: bool): cp_array = cp.zeros((1, 2)) check_message(messages.InferenceMemoryNLP, - neom.InferenceMemoryNLP, + _messages.InferenceMemoryNLP, should_be_cpp, no_cpp_class, (1, cp_array, cp_array, cp_array)) check_message(messages.InferenceMemoryFIL, - neom.InferenceMemoryFIL, + _messages.InferenceMemoryFIL, should_be_cpp, no_cpp_class, (1, cp_array, cp_array)) @@ -70,37 +70,40 @@ def check_all_messages(should_be_cpp: bool, no_cpp_class: bool): check_message(messages.InferenceMemoryAE, None, should_be_cpp, no_cpp_class, (1, cp_array, cp_array)) check_message(messages.MultiInferenceMessage, - neom.MultiInferenceMessage, + _messages.MultiInferenceMessage, should_be_cpp, no_cpp_class, (None, 0, 1, None, 0, 1)) check_message(messages.MultiInferenceNLPMessage, - neom.MultiInferenceNLPMessage, + _messages.MultiInferenceNLPMessage, should_be_cpp, no_cpp_class, (None, 0, 1, None, 0, 1)) check_message(messages.MultiInferenceFILMessage, - neom.MultiInferenceFILMessage, + _messages.MultiInferenceFILMessage, should_be_cpp, no_cpp_class, (None, 0, 1, None, 0, 1)) - assert messages.ResponseMemory._cpp_class is None if no_cpp_class else neom.ResponseMemory + assert messages.ResponseMemory._cpp_class is None if no_cpp_class else _messages.ResponseMemory # C++ impl doesn't have a constructor if (should_be_cpp): pytest.raises(TypeError, messages.ResponseMemory, 1) - check_message(messages.ResponseMemoryProbs, neom.ResponseMemoryProbs, should_be_cpp, no_cpp_class, (1, cp_array)) + check_message(messages.ResponseMemoryProbs, + _messages.ResponseMemoryProbs, + should_be_cpp, + no_cpp_class, (1, cp_array)) # No C++ impl check_message(messages.ResponseMemoryAE, None, should_be_cpp, no_cpp_class, (1, cp_array)) check_message(messages.MultiResponseMessage, - neom.MultiResponseMessage, + _messages.MultiResponseMessage, should_be_cpp, no_cpp_class, (None, 0, 1, None, 0, 1)) check_message(messages.MultiResponseProbsMessage, - neom.MultiResponseProbsMessage, + _messages.MultiResponseProbsMessage, should_be_cpp, no_cpp_class, (None, 0, 1, None, 0, 1)) diff --git a/tests/test_monitor_stage.py b/tests/test_monitor_stage.py index 683bcf9fce..be7dff1944 100755 --- a/tests/test_monitor_stage.py +++ b/tests/test_monitor_stage.py @@ -87,27 +87,35 @@ def test_refresh(mock_morph_tqdm, config): mock_morph_tqdm.refresh.assert_called_once() +@mock.patch('morpheus.stages.general.monitor_stage.ops') @mock.patch('morpheus.stages.general.monitor_stage.MorpheusTqdm') -def test_build_single(mock_morph_tqdm, config): +def test_build_single(mock_morph_tqdm, mock_operators, config): + MonitorStage.stage_count = 0 mock_morph_tqdm.return_value = mock_morph_tqdm + mock_morph_tqdm.monitor = mock.MagicMock() mock_stream = mock.MagicMock() mock_segment = mock.MagicMock() - mock_segment.make_sink.return_value = mock_stream + mock_segment.make_node_full.return_value = mock_stream mock_input = mock.MagicMock() m = MonitorStage(config) m._build_single(mock_segment, mock_input) m.on_start() - mock_segment.make_sink.assert_called_once() + assert MonitorStage.stage_count == 1 + + mock_segment.make_node_full.assert_called_once() mock_segment.make_edge.assert_called_once() - sink_on_error = mock_segment.make_sink.call_args.args[2] - sink_on_completed = mock_segment.make_sink.call_args.args[3] + node_fn = mock_segment.make_node_full.call_args.args[1] + + mock_observable = mock.MagicMock() + mock_subscriber = mock.MagicMock() - # This is currenlty just a log stmt, just verify that its callable - sink_on_error(RuntimeError("unittest")) + node_fn(mock_observable, mock_subscriber) + mock_operators.on_completed.assert_called_once() + sink_on_completed = mock_operators.on_completed.call_args.args[0] # Verify we close tqdm propperly on complete sink_on_completed() diff --git a/tests/utils.py b/tests/utils.py index a4f095c5e3..74e7aa09c3 100755 --- a/tests/utils.py +++ b/tests/utils.py @@ -17,6 +17,8 @@ import json import os +import srf + import morpheus from morpheus._lib.file_types import FileTypes from morpheus.config import Config @@ -78,9 +80,9 @@ def _conv_message(self, m): memory = ResponseMemoryProbs(count=len(probs), probs=probs) return MultiResponseProbsMessage(m.meta, 0, len(probs), memory, 0, len(probs)) - def _build_single(self, seg, input_stream): - stream = seg.make_node(self.unique_name, self._conv_message) - seg.make_edge(input_stream[0], stream) + def _build_single(self, builder: srf.Builder, input_stream): + stream = builder.make_node(self.unique_name, self._conv_message) + builder.make_edge(input_stream[0], stream) return stream, MultiResponseProbsMessage From e1c75ddb10dfa70ce60ab4ac1998449658d4b34f Mon Sep 17 00:00:00 2001 From: David Gardner <96306125+dagardner-nv@users.noreply.github.com> Date: Thu, 23 Jun 2022 12:17:38 -0700 Subject: [PATCH 50/73] Add missing git-lfs package to docker container (#179) fixes #176 Authors: - David Gardner (https://github.com/dagardner-nv) Approvers: - Christopher Harris (https://github.com/cwharris) URL: https://github.com/nv-morpheus/Morpheus/pull/179 --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 9b30448f1f..ed1a892b21 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -47,7 +47,7 @@ RUN apt-get update &&\ apt-get upgrade -y &&\ curl -sL https://deb.nodesource.com/setup_12.x | bash - &&\ apt-get install --no-install-recommends -y \ - build-essential pkg-config curl unzip tar zip openssh-client bc jq nodejs \ + build-essential pkg-config curl unzip tar zip openssh-client bc jq nodejs git-lfs \ && rm -rf /var/lib/apt/lists/* # Enables "source activate conda" From c2a1eb8145a4f4cea06a8974f91fa20619a6b939 Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Thu, 23 Jun 2022 18:15:00 -0500 Subject: [PATCH 51/73] Update to rapids 22.06 (#180) Closes #178 Authors: - Christopher Harris (https://github.com/cwharris) Approvers: - Devin Robison (https://github.com/drobison00) - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/180 --- CMakeLists.txt | 16 +++++++++++++++- CONTRIBUTING.md | 6 +++--- ci/Jenkinsfile | 10 +++++----- .../recipes/morpheus/conda_build_config.yaml | 2 +- ci/conda/recipes/morpheus/meta.yaml | 2 +- cmake/deps/patches/TritonClient.patch | 8 ++++---- cmake/import-rapids-cmake.cmake | 2 +- docker/Dockerfile | 2 +- docker/build_container.sh | 2 +- docker/conda/environments/cuda11.5_dev.yml | 4 ++-- 10 files changed, 34 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b19fddfad8..541996bb29 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,7 +62,21 @@ rapids_cmake_build_type(Release) include(cmake/configure_toolchain.cmake) # Project definition -project(morpheus LANGUAGES C CXX CUDA) +project(morpheus LANGUAGES C CXX) + +# Delay enabling CUDA until after we have determined our CXX compiler +if(NOT DEFINED CMAKE_CUDA_HOST_COMPILER) + message(STATUS "Setting CUDA host compiler to match CXX compiler: ${CMAKE_CXX_COMPILER}") + + # Only set the host compiler if we arent using clang. Using clang > 8ish is + # incompatible with CUDA 11.4/11.5/11.6. See Issue #102 + if(NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + set(CMAKE_CUDA_HOST_COMPILER ${CMAKE_CXX_COMPILER}) + endif() +endif() + +# Now enable CUDA +enable_language(CUDA) # Ccache configuration include(setup_cache) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 99f95cd3fd..361996cdfb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -49,7 +49,7 @@ The following instructions are for developers who are getting started with the M All of the following instructions assume several variables have been set: - `MORPHEUS_ROOT`: The Morpheus repository has been checked out at a location specified by this variable. Any non-absolute paths are relative to `MORPHEUS_ROOT`. - `PYTHON_VER`: The desired Python version. Minimum required is `3.8` - - `RAPIDS_VER`: The desired RAPIDS version for all RAPIDS libraries including cuDF and RMM. This is also used for Triton. If in doubt use `22.04` + - `RAPIDS_VER`: The desired RAPIDS version for all RAPIDS libraries including cuDF and RMM. This is also used for Triton. If in doubt use `22.06` - `CUDA_VER`: The desired CUDA version to use. If in doubt use `11.5` @@ -57,7 +57,7 @@ All of the following instructions assume several variables have been set: ```bash export PYTHON_VER=3.8 -export RAPIDS_VER=22.04 +export RAPIDS_VER=22.06 export CUDA_VER=11.5 export MORPHEUS_ROOT=$(pwd)/morpheus git clone https://github.com/NVIDIA/Morpheus.git $MORPHEUS_ROOT @@ -191,7 +191,7 @@ Note: These instructions assume the user is using `mamba` instead of `conda` sin 1. Setup env variables and clone the repo: ```bash export PYTHON_VER=3.8 - export RAPIDS_VER=22.04 + export RAPIDS_VER=22.06 export CUDA_VER=11.5 export MORPHEUS_ROOT=$(pwd)/morpheus git clone https://github.com/NVIDIA/Morpheus.git $MORPHEUS_ROOT diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile index 86c527ce70..c682c1cf87 100644 --- a/ci/Jenkinsfile +++ b/ci/Jenkinsfile @@ -7,7 +7,7 @@ pipeline { } environment { PYTHON_VER = '3.8' - RAPIDS_VER = '22.04' + RAPIDS_VER = '22.06' CUDA_VER = '11.5' HOME = "${WORKSPACE}" BUILD_TYPE = sh(returnStdout: true, script: 'rapids-build-type') @@ -26,7 +26,7 @@ pipeline { when { environment name: 'BUILD_TYPE', value: 'pull-request' } agent { docker { - image 'gpuci/rapidsai-driver:22.04-cuda11.5-devel-centos7-py3.8' + image 'gpuci/rapidsai-driver:22.06-cuda11.5-devel-centos7-py3.8' label 'cpu' } } @@ -50,7 +50,7 @@ pipeline { } agent { docker { - image 'gpuci/rapidsai:22.04-cuda11.5-devel-centos7-py3.8' + image 'gpuci/rapidsai:22.06-cuda11.5-devel-centos7-py3.8' label 'driver-495' args '--runtime "nvidia" -e "NVIDIA_VISIBLE_DEVICES=$EXECUTOR_NUMBER"' } @@ -83,7 +83,7 @@ pipeline { } agent { docker { - image 'gpuci/rapidsai:22.04-cuda11.5-devel-centos7-py3.8' + image 'gpuci/rapidsai:22.06-cuda11.5-devel-centos7-py3.8' label 'driver-495' args '--runtime "nvidia" -e "NVIDIA_VISIBLE_DEVICES=$EXECUTOR_NUMBER"' } @@ -114,7 +114,7 @@ pipeline { } agent { docker { - image 'gpuci/rapidsai:22.04-cuda11.5-devel-centos7-py3.8' + image 'gpuci/rapidsai:22.06-cuda11.5-devel-centos7-py3.8' label 'driver-495' args '--runtime "nvidia" -e "NVIDIA_VISIBLE_DEVICES=$EXECUTOR_NUMBER"' } diff --git a/ci/conda/recipes/morpheus/conda_build_config.yaml b/ci/conda/recipes/morpheus/conda_build_config.yaml index b87e8b77f5..bcbbabf7e8 100644 --- a/ci/conda/recipes/morpheus/conda_build_config.yaml +++ b/ci/conda/recipes/morpheus/conda_build_config.yaml @@ -33,4 +33,4 @@ boost: - 1.74 rapids_version: - - 22.04 + - 22.06 diff --git a/ci/conda/recipes/morpheus/meta.yaml b/ci/conda/recipes/morpheus/meta.yaml index c3a3091003..df763bdbb9 100644 --- a/ci/conda/recipes/morpheus/meta.yaml +++ b/ci/conda/recipes/morpheus/meta.yaml @@ -18,7 +18,7 @@ {% set py_version=environ.get('CONDA_PY', '3.8') %} {% set cuda_version='.'.join(environ.get('CUDA', '11.5').split('.')[:2]) %} {% set cuda_major=cuda_version.split('.')[0] %} -{% set rapids_version = "22.04" %} +{% set rapids_version = "22.06" %} package: name: morpheus-split diff --git a/cmake/deps/patches/TritonClient.patch b/cmake/deps/patches/TritonClient.patch index fc3ffb747d..34edc6c3c4 100644 --- a/cmake/deps/patches/TritonClient.patch +++ b/cmake/deps/patches/TritonClient.patch @@ -14,19 +14,19 @@ # limitations under the License. diff --git a/src/c++/library/CMakeLists.txt b/src/c++/library/CMakeLists.txt -index 4df5a71..967c0ea 100644 +index e0eed14..1551fab 100644 --- a/src/c++/library/CMakeLists.txt +++ b/src/c++/library/CMakeLists.txt -@@ -147,7 +147,7 @@ if(TRITON_ENABLE_CC_GRPC OR TRITON_ENABLE_PERF_ANALYZER) +@@ -142,7 +142,7 @@ if(TRITON_ENABLE_CC_GRPC OR TRITON_ENABLE_PERF_ANALYZER) grpcclient PROPERTIES LINK_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/libgrpcclient.ldscript - LINK_FLAGS "-Wl,--version-script=libgrpcclient.ldscript" + LINK_FLAGS "-Wl,--version-script=${CMAKE_CURRENT_BINARY_DIR}/libgrpcclient.ldscript" ) - endif() # NOT WIN32 + endif() # NOT WIN32 AND NOT TRITON_KEEP_TYPEINFO -@@ -312,7 +312,7 @@ if(TRITON_ENABLE_CC_HTTP OR TRITON_ENABLE_PERF_ANALYZER) +@@ -310,7 +310,7 @@ if(TRITON_ENABLE_CC_HTTP OR TRITON_ENABLE_PERF_ANALYZER) httpclient PROPERTIES LINK_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/libhttpclient.ldscript diff --git a/cmake/import-rapids-cmake.cmake b/cmake/import-rapids-cmake.cmake index 78f7eb81a8..9eb314a491 100644 --- a/cmake/import-rapids-cmake.cmake +++ b/cmake/import-rapids-cmake.cmake @@ -14,7 +14,7 @@ # limitations under the License. -set(RAPIDS_VERSION "22.04" CACHE STRING "Global default version for all Rapids project dependencies") +set(RAPIDS_VERSION "22.06" CACHE STRING "Global default version for all Rapids project dependencies") set(RAPIDS_CMAKE_VERSION "${RAPIDS_VERSION}" CACHE STRING "Version of rapids-cmake to use") # Download and load the repo according to the rapids-cmake instructions if it does not exist diff --git a/docker/Dockerfile b/docker/Dockerfile index ed1a892b21..9d951165f1 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -29,7 +29,7 @@ FROM ${FROM_IMAGE}:${CUDA_VER}-devel-${LINUX_DISTRO}${LINUX_VER} AS base # Required arguments ARG IMAGE_TYPE=base ARG RAPIDS_CHANNEL=rapidsai-nightly -ARG RAPIDS_VER=22.04 +ARG RAPIDS_VER=22.06 ARG PYTHON_VER=3.8 ARG CONDA_CHANNEL=rapidsai diff --git a/docker/build_container.sh b/docker/build_container.sh index d80483718e..f10e88a26a 100755 --- a/docker/build_container.sh +++ b/docker/build_container.sh @@ -26,7 +26,7 @@ FROM_IMAGE=${FROM_IMAGE:-"gpuci/miniforge-cuda"} CUDA_VER=${CUDA_VER:-11.5} LINUX_DISTRO=${LINUX_DISTRO:-ubuntu} LINUX_VER=${LINUX_VER:-20.04} -RAPIDS_VER=${RAPIDS_VER:-22.04} +RAPIDS_VER=${RAPIDS_VER:-22.06} PYTHON_VER=${PYTHON_VER:-3.8} TENSORRT_VERSION=${TENSORRT_VERSION:-8.2.1.3} diff --git a/docker/conda/environments/cuda11.5_dev.yml b/docker/conda/environments/cuda11.5_dev.yml index 468e242aab..f915c4f747 100644 --- a/docker/conda/environments/cuda11.5_dev.yml +++ b/docker/conda/environments/cuda11.5_dev.yml @@ -30,8 +30,8 @@ dependencies: - cmake=3.22 - cuda-nvml-dev=11.5 - cudatoolkit=11.5 - - cudf 22.04 - - cudf_kafka 22.04.* + - cudf 22.06 + - cudf_kafka 22.06.* - cupy=9.5.0 - cython=0.29.24 - docker-compose=1.29.2 From 75fcb9f4ca7992af3bf42c70befe69a39bd1ce33 Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Fri, 24 Jun 2022 13:26:20 -0500 Subject: [PATCH 52/73] Rollback CI images and fix dev container (#191) Rolls back the ci images to 22.04 and removes the ci build fix necessary for those images, because the fixes are causing issues for compilations done from within the dev container. Closes #190 Authors: - Christopher Harris (https://github.com/cwharris) Approvers: - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/191 --- CMakeLists.txt | 16 +--------------- ci/Jenkinsfile | 8 ++++---- 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 541996bb29..b19fddfad8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,21 +62,7 @@ rapids_cmake_build_type(Release) include(cmake/configure_toolchain.cmake) # Project definition -project(morpheus LANGUAGES C CXX) - -# Delay enabling CUDA until after we have determined our CXX compiler -if(NOT DEFINED CMAKE_CUDA_HOST_COMPILER) - message(STATUS "Setting CUDA host compiler to match CXX compiler: ${CMAKE_CXX_COMPILER}") - - # Only set the host compiler if we arent using clang. Using clang > 8ish is - # incompatible with CUDA 11.4/11.5/11.6. See Issue #102 - if(NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - set(CMAKE_CUDA_HOST_COMPILER ${CMAKE_CXX_COMPILER}) - endif() -endif() - -# Now enable CUDA -enable_language(CUDA) +project(morpheus LANGUAGES C CXX CUDA) # Ccache configuration include(setup_cache) diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile index c682c1cf87..74406a797a 100644 --- a/ci/Jenkinsfile +++ b/ci/Jenkinsfile @@ -26,7 +26,7 @@ pipeline { when { environment name: 'BUILD_TYPE', value: 'pull-request' } agent { docker { - image 'gpuci/rapidsai-driver:22.06-cuda11.5-devel-centos7-py3.8' + image 'gpuci/rapidsai-driver:22.04-cuda11.5-devel-centos7-py3.8' label 'cpu' } } @@ -50,7 +50,7 @@ pipeline { } agent { docker { - image 'gpuci/rapidsai:22.06-cuda11.5-devel-centos7-py3.8' + image 'gpuci/rapidsai:22.04-cuda11.5-devel-centos7-py3.8' label 'driver-495' args '--runtime "nvidia" -e "NVIDIA_VISIBLE_DEVICES=$EXECUTOR_NUMBER"' } @@ -83,7 +83,7 @@ pipeline { } agent { docker { - image 'gpuci/rapidsai:22.06-cuda11.5-devel-centos7-py3.8' + image 'gpuci/rapidsai:22.04-cuda11.5-devel-centos7-py3.8' label 'driver-495' args '--runtime "nvidia" -e "NVIDIA_VISIBLE_DEVICES=$EXECUTOR_NUMBER"' } @@ -114,7 +114,7 @@ pipeline { } agent { docker { - image 'gpuci/rapidsai:22.06-cuda11.5-devel-centos7-py3.8' + image 'gpuci/rapidsai:22.04-cuda11.5-devel-centos7-py3.8' label 'driver-495' args '--runtime "nvidia" -e "NVIDIA_VISIBLE_DEVICES=$EXECUTOR_NUMBER"' } From cee6ca08bb5a8b384a72b84fe4e7d5de0b2d0656 Mon Sep 17 00:00:00 2001 From: Michael Demoret <42954918+mdemoret-nv@users.noreply.github.com> Date: Mon, 27 Jun 2022 11:19:08 -0600 Subject: [PATCH 53/73] Adding new SRF cmake variables (#198) SRF added 2 new variables that should be set by Morpheus. Authors: - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - Devin Robison (https://github.com/drobison00) - David Gardner (https://github.com/dagardner-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/198 --- cmake/deps/Configure_srf.cmake | 30 ++---------------------------- 1 file changed, 2 insertions(+), 28 deletions(-) diff --git a/cmake/deps/Configure_srf.cmake b/cmake/deps/Configure_srf.cmake index cfcd8806eb..545b833a2e 100644 --- a/cmake/deps/Configure_srf.cmake +++ b/cmake/deps/Configure_srf.cmake @@ -39,37 +39,11 @@ function(find_and_configure_srf version) "SRF_USE_CCACHE ${MORPHEUS_USE_CCACHE}" "SRF_USE_CLANG_TIDY ${MORPHEUS_USE_CLANG_TIDY}" "SRF_PYTHON_INPLACE_BUILD ${MORPHEUS_PYTHON_INPLACE_BUILD}" + "SRF_PYTHON_PERFORM_INSTALL ON" + "SRF_PYTHON_BUILD_STUBS ${MORPHEUS_BUILD_PYTHON_STUBS}" "RMM_VERSION ${RAPIDS_VERSION}" ) - if(srf_ADDED) - - # Now ensure its installed - find_package(Python3 COMPONENTS Interpreter REQUIRED) - - # detect virtualenv and set Pip args accordingly - if(DEFINED ENV{VIRTUAL_ENV} OR DEFINED ENV{CONDA_PREFIX}) - set(_pip_args) - else() - set(_pip_args "--user") - endif() - - if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") - list(APPEND _pip_args "-e") - endif() - - add_custom_command( - OUTPUT ${srf_BINARY_DIR}/python/srf.egg-info/PKG-INFO - COMMAND ${Python3_EXECUTABLE} -m pip install ${_pip_args} ${srf_BINARY_DIR}/python - DEPENDS srf_python_rebuild - COMMENT "Installing srf python package" - ) - - add_custom_target( - install_srf_python ALL - DEPENDS ${srf_BINARY_DIR}/python/srf.egg-info/PKG-INFO - ) - endif() endfunction() find_and_configure_srf(${SRF_VERSION}) From 9fba09c02425e838f6ae9e8c9f2b3530c2abe04a Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Mon, 27 Jun 2022 12:35:19 -0500 Subject: [PATCH 54/73] Fix GNN example and update installation instructions (#189) Closes #134 Authors: - Christopher Harris (https://github.com/cwharris) Approvers: - Tad ZeMicheal (https://github.com/tzemicheal) - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/189 --- examples/gnn_fraud_detection_pipeline/README.md | 2 +- examples/gnn_fraud_detection_pipeline/requirements.yml | 4 ++++ .../stages/classification_stage.py | 3 +++ .../stages/graph_construction_stage.py | 3 +++ .../gnn_fraud_detection_pipeline/stages/graph_sage_stage.py | 3 +++ 5 files changed, 14 insertions(+), 1 deletion(-) diff --git a/examples/gnn_fraud_detection_pipeline/README.md b/examples/gnn_fraud_detection_pipeline/README.md index 6bb3d3e4ba..aa7f182585 100644 --- a/examples/gnn_fraud_detection_pipeline/README.md +++ b/examples/gnn_fraud_detection_pipeline/README.md @@ -21,7 +21,7 @@ limitations under the License. Prior to running the gnn fruad detection pipeline, additional requirements must be installed in to your conda environment. A supplemental requirements file has been provided in this example directory. ```bash -conda install --freeze-installed -c stellargraph stellargraph tensorflow +conda install -c rapidsai -c nvidia -c stellargraph -c conda-forge cuml stellargraph tensorflow ``` ## Running diff --git a/examples/gnn_fraud_detection_pipeline/requirements.yml b/examples/gnn_fraud_detection_pipeline/requirements.yml index fed836eebe..44c44e950d 100644 --- a/examples/gnn_fraud_detection_pipeline/requirements.yml +++ b/examples/gnn_fraud_detection_pipeline/requirements.yml @@ -14,7 +14,11 @@ # limitations under the License. channels: + - rapidsai + - nvidia - stellargraph + - conda-forge dependencies: + - cuml - stellargraph - tensorflow diff --git a/examples/gnn_fraud_detection_pipeline/stages/classification_stage.py b/examples/gnn_fraud_detection_pipeline/stages/classification_stage.py index 7192b63f8c..5be8bb183e 100644 --- a/examples/gnn_fraud_detection_pipeline/stages/classification_stage.py +++ b/examples/gnn_fraud_detection_pipeline/stages/classification_stage.py @@ -41,6 +41,9 @@ def name(self) -> str: def accepted_types(self) -> typing.Tuple: return (GraphSAGEMultiMessage, ) + def supports_cpp_node(): + return False + def _process_message(self, message: GraphSAGEMultiMessage): ind_emb_columns = message.get_meta(message.inductive_embedding_column_names) diff --git a/examples/gnn_fraud_detection_pipeline/stages/graph_construction_stage.py b/examples/gnn_fraud_detection_pipeline/stages/graph_construction_stage.py index ff8d1dd185..841c9a5763 100644 --- a/examples/gnn_fraud_detection_pipeline/stages/graph_construction_stage.py +++ b/examples/gnn_fraud_detection_pipeline/stages/graph_construction_stage.py @@ -48,6 +48,9 @@ def name(self) -> str: def accepted_types(self) -> typing.Tuple: return (MultiMessage, ) + def supports_cpp_node(): + return False + @staticmethod def _graph_construction(nodes, edges, node_features) -> StellarGraph: g_nx = nx.Graph() diff --git a/examples/gnn_fraud_detection_pipeline/stages/graph_sage_stage.py b/examples/gnn_fraud_detection_pipeline/stages/graph_sage_stage.py index 004cf3065b..03c13e45e3 100644 --- a/examples/gnn_fraud_detection_pipeline/stages/graph_sage_stage.py +++ b/examples/gnn_fraud_detection_pipeline/stages/graph_sage_stage.py @@ -59,6 +59,9 @@ def name(self) -> str: def accepted_types(self) -> typing.Tuple: return (FraudGraphMultiMessage, ) + def supports_cpp_node(): + return False + def _inductive_step_hinsage( self, graph, From d35593ce5593ff634d986f41fdde234116fb47ee Mon Sep 17 00:00:00 2001 From: David Gardner <96306125+dagardner-nv@users.noreply.github.com> Date: Mon, 27 Jun 2022 11:57:53 -0700 Subject: [PATCH 55/73] nlp_si_detection example improvements (#193) * Add a second monitor stage to report progress for the back-half of the pipeline * Increase threads to match number of stages * Change triton port to 8000 avoiding a warning about the grpc port * Add EdgeConnectors for derived classes of MultiMessage to MultiMessage * Remove filter stage from example #83 & #197 fixes #186 Authors: - David Gardner (https://github.com/dagardner-nv) Approvers: - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/193 --- examples/nlp_si_detection/README.md | 80 ++++++++++++++----- morpheus/_lib/src/python_modules/messages.cpp | 27 +++++++ 2 files changed, 86 insertions(+), 21 deletions(-) diff --git a/examples/nlp_si_detection/README.md b/examples/nlp_si_detection/README.md index dd0041863d..294932319d 100644 --- a/examples/nlp_si_detection/README.md +++ b/examples/nlp_si_detection/README.md @@ -101,31 +101,30 @@ With the Morpheus CLI, an entire pipeline can be configured and run without writ The following command line is the entire command to build and launch the pipeline. Each new line represents a new stage. The comment above each stage gives information about why the stage was added and configured this way. +From the Morpheus repo root directory run: ```bash -export MORPHEUS_ROOT=../.. +export MORPHEUS_ROOT=$(pwd) # Launch Morpheus printing debug messages -morpheus --debug --log_level=DEBUG \ +morpheus --log_level=DEBUG \ `# Run a pipeline with 8 threads and a model batch size of 32 (Must match Triton config)` \ run --num_threads=8 --pipeline_batch_size=1024 --model_max_batch_size=32 \ `# Specify a NLP pipeline with 256 sequence length (Must match Triton config)` \ pipeline-nlp --model_seq_length=256 \ `# 1st Stage: Read from file` \ - from-file --filename=$MORPHEUS_ROOT/examples/data/pcap_dump.jsonlines \ + from-file --filename=examples/data/pcap_dump.jsonlines \ `# 2nd Stage: Deserialize from JSON strings to objects` \ deserialize \ `# 3rd Stage: Preprocessing converts the input data into BERT tokens` \ - preprocess --vocab_hash_file=$MORPHEUS_ROOT/morpheus/data/bert-base-uncased-hash.txt --do_lower_case=True --truncation=True \ + preprocess --vocab_hash_file=morpheus/data/bert-base-uncased-hash.txt --do_lower_case=True --truncation=True \ `# 4th Stage: Send messages to Triton for inference. Specify the model loaded in Setup` \ - inf-triton --model_name=sid-minibert-onnx --server_url=localhost:8001 --force_convert_inputs=True \ + inf-triton --model_name=sid-minibert-onnx --server_url=localhost:8000 --force_convert_inputs=True \ `# 5th Stage: Monitor stage prints throughput information to the console` \ monitor --description "Inference Rate" --smoothing=0.001 --unit inf \ `# 6th Stage: Add results from inference to the messages` \ add-class \ - `# 7th Stage: Filtering removes any messages that did not detect SI` \ - filter \ - `# 8th Stage: Convert from objects back into strings` \ + `# 7th Stage: Convert from objects back into strings` \ serialize --exclude '^_ts_' \ - `# 9th Stage: Write out the JSON lines to the detections.jsonlines file` \ + `# 8th Stage: Write out the JSON lines to the detections.jsonlines file` \ to-file --filename=detections.jsonlines --overwrite ``` @@ -150,7 +149,7 @@ Config: "secret_keys", "user" ], - "debug": true, + "debug": false, "edge_buffer_size": 128, "feature_length": 256, "fil": null, @@ -165,29 +164,68 @@ CPP Enabled: True ====Registering Pipeline==== ====Registering Pipeline Complete!==== ====Starting Pipeline==== +====Pipeline Started==== ====Building Pipeline==== -Added source: +Added source: └─> morpheus.MessageMeta Added stage: └─ morpheus.MessageMeta -> morpheus.MultiMessage -Added stage: +Added stage: └─ morpheus.MultiMessage -> morpheus.MultiInferenceNLPMessage -Added stage: +Added stage: └─ morpheus.MultiInferenceNLPMessage -> morpheus.MultiResponseProbsMessage Added stage: └─ morpheus.MultiResponseProbsMessage -> morpheus.MultiResponseProbsMessage Added stage: └─ morpheus.MultiResponseProbsMessage -> morpheus.MultiResponseProbsMessage -Added stage: - └─ morpheus.MultiResponseProbsMessage -> morpheus.MultiResponseProbsMessage -Added stage: +Added stage: └─ morpheus.MultiResponseProbsMessage -> morpheus.MessageMeta -Added stage: +Added stage: └─ morpheus.MessageMeta -> morpheus.MessageMeta ====Building Pipeline Complete!==== -Starting! Time: 1651079123.1867409 -====Pipeline Started==== -Inference Rate[Complete]: 93085inf [00:06, 153.30inf/s] +Starting! Time: 1656352480.541071 +Inference Rate[Complete]: 93085inf [00:07, 12673.63inf/s] +====Pipeline Complete==== + ``` -The output file `detections.jsonlines` will contain PCAP messages that contain some SI (any class with a predection greater that 0.5). +The output file `detections.jsonlines` will contain the original PCAP messages with the following additional fields added: +* address +* bank_acct +* credit_card +* email +* govt_id +* name +* password +* phone_num +* secret_keys +* user + +The value for these fields will either be a `1` indicating a decection and a `0` indicating no detection. An example row with a detection looks like: +```json +{ + "timestamp": 1616381019580, + "host_ip": "10.188.40.56", + "data_len": "129", + "data": "\"{\\\"X-Postmark-Server-Token\\\": \\\"76904958 O7FWqd9p TzIBfSYk\\\"}\"", + "src_mac": "04:3f:72:bf:af:74", + "dest_mac": "b4:a9:fc:3c:46:f8", + "protocol": "6", + "src_ip": "10.20.16.248", + "dest_ip": "10.244.0.60", + "src_port": "51374", + "dest_port": "80", + "flags": "24", + "is_pii": false, + "address": 0, + "bank_acct": 0, + "credit_card": 0, + "email": 0, + "govt_id": 0, + "name": 0, + "password": 0, + "phone_num": 0, + "secret_keys": 1, + "user": 0 +} +``` diff --git a/morpheus/_lib/src/python_modules/messages.cpp b/morpheus/_lib/src/python_modules/messages.cpp index 85cdf74f9d..4252f22118 100644 --- a/morpheus/_lib/src/python_modules/messages.cpp +++ b/morpheus/_lib/src/python_modules/messages.cpp @@ -30,6 +30,8 @@ #include #include +#include + #include #include // IWYU pragma: keep #include @@ -68,6 +70,31 @@ PYBIND11_MODULE(messages, m) // Allows python objects to keep DataTable objects alive py::class_>(m, "DataTable"); + // EdgeConnectors for derived classes of MultiMessage to MultiMessage + srf::node::EdgeConnector, + std::shared_ptr>::register_converter(); + + srf::node::EdgeConnector, + std::shared_ptr>::register_converter(); + + srf::node::EdgeConnector, + std::shared_ptr>::register_converter(); + + srf::node::EdgeConnector, + std::shared_ptr>::register_converter(); + + srf::node::EdgeConnector, + std::shared_ptr>::register_converter(); + + srf::node::EdgeConnector, + std::shared_ptr>::register_converter(); + + srf::node::EdgeConnector, + std::shared_ptr>::register_converter(); + + srf::node::EdgeConnector, + std::shared_ptr>::register_converter(); + py::class_>(m, "MessageMeta") .def(py::init<>(&MessageMetaInterfaceProxy::init_python), py::arg("df")) .def_property_readonly("count", &MessageMetaInterfaceProxy::count) From f6e98739e5dee3a5293e3196ad3167cac59bace3 Mon Sep 17 00:00:00 2001 From: Tad ZeMicheal <73552385+tzemicheal@users.noreply.github.com> Date: Mon, 27 Jun 2022 18:47:40 -0500 Subject: [PATCH 56/73] Update GNN FSI pipeline example & notebook. (#182) This updates the existing gnn pipeline. - Update xgboost model to fix the input mismatch during inference. - Removes and fixes eval script in tuning script. - Update gnn notebook. - Add graphsage model metadata. - Removes xgboost inference & replace with FIL. Authors: - Tad ZeMicheal (https://github.com/tzemicheal) Approvers: - Michael Demoret (https://github.com/mdemoret-nv) - https://github.com/raykallen URL: https://github.com/nv-morpheus/Morpheus/pull/182 --- .../model/hinsage-model.pt/keras_metadata.pb | 30 ++ .../model/hinsage-model.pt/saved_model.pb | Bin 583638 -> 498348 bytes .../variables/variables.data-00000-of-00001 | Bin 78112 -> 84465 bytes .../variables/variables.index | Bin 980 -> 980 bytes .../model/xgb-model.pt | Bin 90942 -> 88953 bytes .../fraud-detection-models/HinSAGE.py | 305 ++++++++---------- .../fraud-detection-models/evaluation.py | 69 ++-- .../graph-sage-fraud-detection.ipynb | 5 +- .../fraud-detection-models/training.py | 87 ++--- 9 files changed, 246 insertions(+), 250 deletions(-) create mode 100644 examples/gnn_fraud_detection_pipeline/model/hinsage-model.pt/keras_metadata.pb diff --git a/examples/gnn_fraud_detection_pipeline/model/hinsage-model.pt/keras_metadata.pb b/examples/gnn_fraud_detection_pipeline/model/hinsage-model.pt/keras_metadata.pb new file mode 100644 index 0000000000..9f55d93262 --- /dev/null +++ b/examples/gnn_fraud_detection_pipeline/model/hinsage-model.pt/keras_metadata.pb @@ -0,0 +1,30 @@ + +root"_tf_keras_network*{"name": "model_1", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "class_name": "Functional", "config": {"name": "model_1", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 64, 111]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_4"}, "name": "input_4", "inbound_nodes": []}, {"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 64, 111]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_5"}, "name": "input_5", "inbound_nodes": []}, {"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 2, 1]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_2"}, "name": "input_2", "inbound_nodes": []}, {"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 2, 1]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_3"}, "name": "input_3", "inbound_nodes": []}, {"class_name": "Reshape", "config": {"name": "reshape_2", "trainable": true, "dtype": "float32", "target_shape": {"class_name": "__tuple__", "items": [2, 32, 111]}}, "name": "reshape_2", "inbound_nodes": [[["input_4", 0, 0, {}]]]}, {"class_name": "Reshape", "config": {"name": "reshape_3", "trainable": true, "dtype": "float32", "target_shape": {"class_name": "__tuple__", "items": [2, 32, 111]}}, "name": "reshape_3", "inbound_nodes": [[["input_5", 0, 0, {}]]]}, {"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 1, 111]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_1"}, "name": "input_1", "inbound_nodes": []}, {"class_name": "Reshape", "config": {"name": "reshape", "trainable": true, "dtype": "float32", "target_shape": {"class_name": "__tuple__", "items": [1, 2, 1]}}, "name": "reshape", "inbound_nodes": [[["input_2", 0, 0, {}]]]}, {"class_name": "Reshape", "config": {"name": "reshape_1", "trainable": true, "dtype": "float32", "target_shape": {"class_name": "__tuple__", "items": [1, 2, 1]}}, "name": "reshape_1", "inbound_nodes": [[["input_3", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout_4", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "name": "dropout_4", "inbound_nodes": [[["input_2", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout_3", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "name": "dropout_3", "inbound_nodes": [[["reshape_2", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout_6", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "name": "dropout_6", "inbound_nodes": [[["input_3", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout_5", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "name": "dropout_5", "inbound_nodes": [[["reshape_3", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout_2", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "name": "dropout_2", "inbound_nodes": [[["input_1", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "name": "dropout", "inbound_nodes": [[["reshape", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout_1", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "name": "dropout_1", "inbound_nodes": [[["reshape_1", 0, 0, {}]]]}, {"class_name": "MeanHinAggregator", "config": {"name": "mean_hin_aggregator_1", "trainable": true, "dtype": "float32", "output_dim": 64, "bias": true, "act": "relu", "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "kernel_regularizer": null, "kernel_constraint": null, "bias_initializer": {"class_name": "Zeros", "config": {}}, "bias_regularizer": null, "bias_constraint": null}, "name": "mean_hin_aggregator_1", "inbound_nodes": [[["dropout_4", 0, 0, {}], ["dropout_3", 0, 0, {}]]]}, {"class_name": "MeanHinAggregator", "config": {"name": "mean_hin_aggregator_2", "trainable": true, "dtype": "float32", "output_dim": 64, "bias": true, "act": "relu", "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "kernel_regularizer": null, "kernel_constraint": null, "bias_initializer": {"class_name": "Zeros", "config": {}}, "bias_regularizer": null, "bias_constraint": null}, "name": "mean_hin_aggregator_2", "inbound_nodes": [[["dropout_6", 0, 0, {}], ["dropout_5", 0, 0, {}]]]}, {"class_name": "MeanHinAggregator", "config": {"name": "mean_hin_aggregator", "trainable": true, "dtype": "float32", "output_dim": 64, "bias": true, "act": "relu", "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "kernel_regularizer": null, "kernel_constraint": null, "bias_initializer": {"class_name": "Zeros", "config": {}}, "bias_regularizer": null, "bias_constraint": null}, "name": "mean_hin_aggregator", "inbound_nodes": [[["dropout_2", 0, 0, {}], ["dropout", 0, 0, {}], ["dropout_1", 0, 0, {}]]]}, {"class_name": "Reshape", "config": {"name": "reshape_4", "trainable": true, "dtype": "float32", "target_shape": {"class_name": "__tuple__", "items": [1, 2, 64]}}, "name": "reshape_4", "inbound_nodes": [[["mean_hin_aggregator_1", 0, 0, {}]]]}, {"class_name": "Reshape", "config": {"name": "reshape_5", "trainable": true, "dtype": "float32", "target_shape": {"class_name": "__tuple__", "items": [1, 2, 64]}}, "name": "reshape_5", "inbound_nodes": [[["mean_hin_aggregator_2", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout_9", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "name": "dropout_9", "inbound_nodes": [[["mean_hin_aggregator", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout_7", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "name": "dropout_7", "inbound_nodes": [[["reshape_4", 0, 0, {}]]]}, {"class_name": "Dropout", "config": {"name": "dropout_8", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "name": "dropout_8", "inbound_nodes": [[["reshape_5", 0, 0, {}]]]}, {"class_name": "MeanHinAggregator", "config": {"name": "mean_hin_aggregator_3", "trainable": true, "dtype": "float32", "output_dim": 64, "bias": true, "act": "linear", "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "kernel_regularizer": null, "kernel_constraint": null, "bias_initializer": {"class_name": "Zeros", "config": {}}, "bias_regularizer": null, "bias_constraint": null}, "name": "mean_hin_aggregator_3", "inbound_nodes": [[["dropout_9", 0, 0, {}], ["dropout_7", 0, 0, {}], ["dropout_8", 0, 0, {}]]]}, {"class_name": "Reshape", "config": {"name": "reshape_6", "trainable": true, "dtype": "float32", "target_shape": {"class_name": "__tuple__", "items": [64]}}, "name": "reshape_6", "inbound_nodes": [[["mean_hin_aggregator_3", 0, 0, {}]]]}, {"class_name": "Lambda", "config": {"name": "lambda", "trainable": true, "dtype": "float32", "function": {"class_name": "__tuple__", "items": ["4wEAAAAAAAAAAAAAAAEAAAAEAAAAUwAAAHMOAAAAdABqAXwAZAFkAo0CUwApA07p/////6kB2gRh\neGlzKQLaAUvaDGwyX25vcm1hbGl6ZakB2gF4qQByCAAAAPpQL29wdC9jb25kYS9lbnZzL3JhcGlk\ncy9saWIvcHl0aG9uMy44L3NpdGUtcGFja2FnZXMvc3RlbGxhcmdyYXBoL2xheWVyL2hpbnNhZ2Uu\ncHnaCDxsYW1iZGE+ZgEAAPMAAAAA\n", null, null]}, "function_type": "lambda", "module": "stellargraph.layer.hinsage", "output_shape": null, "output_shape_type": "raw", "output_shape_module": null, "arguments": {}}, "name": "lambda", "inbound_nodes": [[["reshape_6", 0, 0, {}]]]}], "input_layers": [["input_1", 0, 0], ["input_2", 0, 0], ["input_3", 0, 0], ["input_4", 0, 0], ["input_5", 0, 0]], "output_layers": [["lambda", 0, 0]]}, "shared_object_id": 35, "input_spec": [{"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, 1, 111]}, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {}}}, {"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, 2, 1]}, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {}}}, {"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, 2, 1]}, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {}}}, {"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, 64, 111]}, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {}}}, {"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, 64, 111]}, "ndim": 3, "max_ndim": null, "min_ndim": null, "axes": {}}}], "build_input_shape": [{"class_name": "TensorShape", "items": [null, 1, 111]}, {"class_name": "TensorShape", "items": [null, 2, 1]}, {"class_name": "TensorShape", "items": [null, 2, 1]}, {"class_name": "TensorShape", "items": [null, 64, 111]}, {"class_name": "TensorShape", "items": [null, 64, 111]}], "is_graph_network": true, "full_save_spec": {"class_name": "__tuple__", "items": [[[{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 1, 111]}, "float32", "input_1"]}, {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 2, 1]}, "float32", "input_2"]}, {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 2, 1]}, "float32", "input_3"]}, {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 64, 111]}, "float32", "input_4"]}, {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 64, 111]}, "float32", "input_5"]}]], {}]}, "save_spec": [{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 1, 111]}, "float32", "input_1"]}, {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 2, 1]}, "float32", "input_2"]}, {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 2, 1]}, "float32", "input_3"]}, {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 64, 111]}, "float32", "input_4"]}, {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 64, 111]}, "float32", "input_5"]}], "keras_version": "2.9.0", "backend": "tensorflow", "model_config": {"class_name": "Functional", "config": {"name": "model_1", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 64, 111]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_4"}, "name": "input_4", "inbound_nodes": [], "shared_object_id": 0}, {"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 64, 111]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_5"}, "name": "input_5", "inbound_nodes": [], "shared_object_id": 1}, {"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 2, 1]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_2"}, "name": "input_2", "inbound_nodes": [], "shared_object_id": 2}, {"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 2, 1]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_3"}, "name": "input_3", "inbound_nodes": [], "shared_object_id": 3}, {"class_name": "Reshape", "config": {"name": "reshape_2", "trainable": true, "dtype": "float32", "target_shape": {"class_name": "__tuple__", "items": [2, 32, 111]}}, "name": "reshape_2", "inbound_nodes": [[["input_4", 0, 0, {}]]], "shared_object_id": 4}, {"class_name": "Reshape", "config": {"name": "reshape_3", "trainable": true, "dtype": "float32", "target_shape": {"class_name": "__tuple__", "items": [2, 32, 111]}}, "name": "reshape_3", "inbound_nodes": [[["input_5", 0, 0, {}]]], "shared_object_id": 5}, {"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 1, 111]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_1"}, "name": "input_1", "inbound_nodes": [], "shared_object_id": 6}, {"class_name": "Reshape", "config": {"name": "reshape", "trainable": true, "dtype": "float32", "target_shape": {"class_name": "__tuple__", "items": [1, 2, 1]}}, "name": "reshape", "inbound_nodes": [[["input_2", 0, 0, {}]]], "shared_object_id": 7}, {"class_name": "Reshape", "config": {"name": "reshape_1", "trainable": true, "dtype": "float32", "target_shape": {"class_name": "__tuple__", "items": [1, 2, 1]}}, "name": "reshape_1", "inbound_nodes": [[["input_3", 0, 0, {}]]], "shared_object_id": 8}, {"class_name": "Dropout", "config": {"name": "dropout_4", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "name": "dropout_4", "inbound_nodes": [[["input_2", 0, 0, {}]]], "shared_object_id": 9}, {"class_name": "Dropout", "config": {"name": "dropout_3", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "name": "dropout_3", "inbound_nodes": [[["reshape_2", 0, 0, {}]]], "shared_object_id": 10}, {"class_name": "Dropout", "config": {"name": "dropout_6", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "name": "dropout_6", "inbound_nodes": [[["input_3", 0, 0, {}]]], "shared_object_id": 11}, {"class_name": "Dropout", "config": {"name": "dropout_5", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "name": "dropout_5", "inbound_nodes": [[["reshape_3", 0, 0, {}]]], "shared_object_id": 12}, {"class_name": "Dropout", "config": {"name": "dropout_2", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "name": "dropout_2", "inbound_nodes": [[["input_1", 0, 0, {}]]], "shared_object_id": 13}, {"class_name": "Dropout", "config": {"name": "dropout", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "name": "dropout", "inbound_nodes": [[["reshape", 0, 0, {}]]], "shared_object_id": 14}, {"class_name": "Dropout", "config": {"name": "dropout_1", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "name": "dropout_1", "inbound_nodes": [[["reshape_1", 0, 0, {}]]], "shared_object_id": 15}, {"class_name": "MeanHinAggregator", "config": {"name": "mean_hin_aggregator_1", "trainable": true, "dtype": "float32", "output_dim": 64, "bias": true, "act": "relu", "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 16}, "kernel_regularizer": null, "kernel_constraint": null, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 17}, "bias_regularizer": null, "bias_constraint": null}, "name": "mean_hin_aggregator_1", "inbound_nodes": [[["dropout_4", 0, 0, {}], ["dropout_3", 0, 0, {}]]], "shared_object_id": 18}, {"class_name": "MeanHinAggregator", "config": {"name": "mean_hin_aggregator_2", "trainable": true, "dtype": "float32", "output_dim": 64, "bias": true, "act": "relu", "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 19}, "kernel_regularizer": null, "kernel_constraint": null, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 20}, "bias_regularizer": null, "bias_constraint": null}, "name": "mean_hin_aggregator_2", "inbound_nodes": [[["dropout_6", 0, 0, {}], ["dropout_5", 0, 0, {}]]], "shared_object_id": 21}, {"class_name": "MeanHinAggregator", "config": {"name": "mean_hin_aggregator", "trainable": true, "dtype": "float32", "output_dim": 64, "bias": true, "act": "relu", "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 22}, "kernel_regularizer": null, "kernel_constraint": null, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 23}, "bias_regularizer": null, "bias_constraint": null}, "name": "mean_hin_aggregator", "inbound_nodes": [[["dropout_2", 0, 0, {}], ["dropout", 0, 0, {}], ["dropout_1", 0, 0, {}]]], "shared_object_id": 24}, {"class_name": "Reshape", "config": {"name": "reshape_4", "trainable": true, "dtype": "float32", "target_shape": {"class_name": "__tuple__", "items": [1, 2, 64]}}, "name": "reshape_4", "inbound_nodes": [[["mean_hin_aggregator_1", 0, 0, {}]]], "shared_object_id": 25}, {"class_name": "Reshape", "config": {"name": "reshape_5", "trainable": true, "dtype": "float32", "target_shape": {"class_name": "__tuple__", "items": [1, 2, 64]}}, "name": "reshape_5", "inbound_nodes": [[["mean_hin_aggregator_2", 0, 0, {}]]], "shared_object_id": 26}, {"class_name": "Dropout", "config": {"name": "dropout_9", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "name": "dropout_9", "inbound_nodes": [[["mean_hin_aggregator", 0, 0, {}]]], "shared_object_id": 27}, {"class_name": "Dropout", "config": {"name": "dropout_7", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "name": "dropout_7", "inbound_nodes": [[["reshape_4", 0, 0, {}]]], "shared_object_id": 28}, {"class_name": "Dropout", "config": {"name": "dropout_8", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "name": "dropout_8", "inbound_nodes": [[["reshape_5", 0, 0, {}]]], "shared_object_id": 29}, {"class_name": "MeanHinAggregator", "config": {"name": "mean_hin_aggregator_3", "trainable": true, "dtype": "float32", "output_dim": 64, "bias": true, "act": "linear", "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 30}, "kernel_regularizer": null, "kernel_constraint": null, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 31}, "bias_regularizer": null, "bias_constraint": null}, "name": "mean_hin_aggregator_3", "inbound_nodes": [[["dropout_9", 0, 0, {}], ["dropout_7", 0, 0, {}], ["dropout_8", 0, 0, {}]]], "shared_object_id": 32}, {"class_name": "Reshape", "config": {"name": "reshape_6", "trainable": true, "dtype": "float32", "target_shape": {"class_name": "__tuple__", "items": [64]}}, "name": "reshape_6", "inbound_nodes": [[["mean_hin_aggregator_3", 0, 0, {}]]], "shared_object_id": 33}, {"class_name": "Lambda", "config": {"name": "lambda", "trainable": true, "dtype": "float32", "function": {"class_name": "__tuple__", "items": ["4wEAAAAAAAAAAAAAAAEAAAAEAAAAUwAAAHMOAAAAdABqAXwAZAFkAo0CUwApA07p/////6kB2gRh\neGlzKQLaAUvaDGwyX25vcm1hbGl6ZakB2gF4qQByCAAAAPpQL29wdC9jb25kYS9lbnZzL3JhcGlk\ncy9saWIvcHl0aG9uMy44L3NpdGUtcGFja2FnZXMvc3RlbGxhcmdyYXBoL2xheWVyL2hpbnNhZ2Uu\ncHnaCDxsYW1iZGE+ZgEAAPMAAAAA\n", null, null]}, "function_type": "lambda", "module": "stellargraph.layer.hinsage", "output_shape": null, "output_shape_type": "raw", "output_shape_module": null, "arguments": {}}, "name": "lambda", "inbound_nodes": [[["reshape_6", 0, 0, {}]]], "shared_object_id": 34}], "input_layers": [["input_1", 0, 0], ["input_2", 0, 0], ["input_3", 0, 0], ["input_4", 0, 0], ["input_5", 0, 0]], "output_layers": [["lambda", 0, 0]]}}}2 + root.layer-0"_tf_keras_input_layer*{"class_name": "InputLayer", "name": "input_4", "dtype": "float32", "sparse": false, "ragged": false, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 64, 111]}, "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 64, 111]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_4"}}2 + root.layer-1"_tf_keras_input_layer*{"class_name": "InputLayer", "name": "input_5", "dtype": "float32", "sparse": false, "ragged": false, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 64, 111]}, "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 64, 111]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_5"}}2 + root.layer-2"_tf_keras_input_layer*{"class_name": "InputLayer", "name": "input_2", "dtype": "float32", "sparse": false, "ragged": false, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 2, 1]}, "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 2, 1]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_2"}}2 + root.layer-3"_tf_keras_input_layer*{"class_name": "InputLayer", "name": "input_3", "dtype": "float32", "sparse": false, "ragged": false, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 2, 1]}, "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 2, 1]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_3"}}2 + root.layer-4"_tf_keras_layer*{"name": "reshape_2", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Reshape", "config": {"name": "reshape_2", "trainable": true, "dtype": "float32", "target_shape": {"class_name": "__tuple__", "items": [2, 32, 111]}}, "inbound_nodes": [[["input_4", 0, 0, {}]]], "shared_object_id": 4}2 + root.layer-5"_tf_keras_layer*{"name": "reshape_3", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Reshape", "config": {"name": "reshape_3", "trainable": true, "dtype": "float32", "target_shape": {"class_name": "__tuple__", "items": [2, 32, 111]}}, "inbound_nodes": [[["input_5", 0, 0, {}]]], "shared_object_id": 5}2 + root.layer-6"_tf_keras_input_layer*{"class_name": "InputLayer", "name": "input_1", "dtype": "float32", "sparse": false, "ragged": false, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 1, 111]}, "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 1, 111]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_1"}}2 + root.layer-7"_tf_keras_layer*{"name": "reshape", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Reshape", "config": {"name": "reshape", "trainable": true, "dtype": "float32", "target_shape": {"class_name": "__tuple__", "items": [1, 2, 1]}}, "inbound_nodes": [[["input_2", 0, 0, {}]]], "shared_object_id": 7}2 +  root.layer-8"_tf_keras_layer*{"name": "reshape_1", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Reshape", "config": {"name": "reshape_1", "trainable": true, "dtype": "float32", "target_shape": {"class_name": "__tuple__", "items": [1, 2, 1]}}, "inbound_nodes": [[["input_3", 0, 0, {}]]], "shared_object_id": 8}2 + + root.layer-9"_tf_keras_layer*{"name": "dropout_4", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout_4", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "inbound_nodes": [[["input_2", 0, 0, {}]]], "shared_object_id": 9, "build_input_shape": {"class_name": "TensorShape", "items": [null, 2, 1]}}2 +  root.layer-10"_tf_keras_layer*{"name": "dropout_3", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout_3", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "inbound_nodes": [[["reshape_2", 0, 0, {}]]], "shared_object_id": 10, "build_input_shape": {"class_name": "TensorShape", "items": [null, 2, 32, 111]}}2 +  root.layer-11"_tf_keras_layer*{"name": "dropout_6", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout_6", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "inbound_nodes": [[["input_3", 0, 0, {}]]], "shared_object_id": 11, "build_input_shape": {"class_name": "TensorShape", "items": [null, 2, 1]}}2 +  root.layer-12"_tf_keras_layer*{"name": "dropout_5", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout_5", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "inbound_nodes": [[["reshape_3", 0, 0, {}]]], "shared_object_id": 12, "build_input_shape": {"class_name": "TensorShape", "items": [null, 2, 32, 111]}}2 + root.layer-13"_tf_keras_layer*{"name": "dropout_2", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout_2", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "inbound_nodes": [[["input_1", 0, 0, {}]]], "shared_object_id": 13, "build_input_shape": {"class_name": "TensorShape", "items": [null, 1, 111]}}2 + root.layer-14"_tf_keras_layer*{"name": "dropout", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "inbound_nodes": [[["reshape", 0, 0, {}]]], "shared_object_id": 14, "build_input_shape": {"class_name": "TensorShape", "items": [null, 1, 2, 1]}}2 + root.layer-15"_tf_keras_layer*{"name": "dropout_1", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout_1", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "inbound_nodes": [[["reshape_1", 0, 0, {}]]], "shared_object_id": 15, "build_input_shape": {"class_name": "TensorShape", "items": [null, 1, 2, 1]}}2 +root.layer_with_weights-0"_tf_keras_layer*{"name": "mean_hin_aggregator_1", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "MeanHinAggregator", "config": {"name": "mean_hin_aggregator_1", "trainable": true, "dtype": "float32", "output_dim": 64, "bias": true, "act": "relu", "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 16}, "kernel_regularizer": null, "kernel_constraint": null, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 17}, "bias_regularizer": null, "bias_constraint": null}, "inbound_nodes": [[["dropout_4", 0, 0, {}], ["dropout_3", 0, 0, {}]]], "shared_object_id": 18, "build_input_shape": [{"class_name": "TensorShape", "items": [null, 2, 1]}, {"class_name": "TensorShape", "items": [null, 2, 32, 111]}]}2 +root.layer_with_weights-1"_tf_keras_layer*{"name": "mean_hin_aggregator_2", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "MeanHinAggregator", "config": {"name": "mean_hin_aggregator_2", "trainable": true, "dtype": "float32", "output_dim": 64, "bias": true, "act": "relu", "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 19}, "kernel_regularizer": null, "kernel_constraint": null, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 20}, "bias_regularizer": null, "bias_constraint": null}, "inbound_nodes": [[["dropout_6", 0, 0, {}], ["dropout_5", 0, 0, {}]]], "shared_object_id": 21, "build_input_shape": [{"class_name": "TensorShape", "items": [null, 2, 1]}, {"class_name": "TensorShape", "items": [null, 2, 32, 111]}]}2 +root.layer_with_weights-2"_tf_keras_layer*{"name": "mean_hin_aggregator", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "MeanHinAggregator", "config": {"name": "mean_hin_aggregator", "trainable": true, "dtype": "float32", "output_dim": 64, "bias": true, "act": "relu", "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 22}, "kernel_regularizer": null, "kernel_constraint": null, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 23}, "bias_regularizer": null, "bias_constraint": null}, "inbound_nodes": [[["dropout_2", 0, 0, {}], ["dropout", 0, 0, {}], ["dropout_1", 0, 0, {}]]], "shared_object_id": 24, "build_input_shape": [{"class_name": "TensorShape", "items": [null, 1, 111]}, {"class_name": "TensorShape", "items": [null, 1, 2, 1]}, {"class_name": "TensorShape", "items": [null, 1, 2, 1]}]}2 + root.layer-19"_tf_keras_layer*{"name": "reshape_4", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Reshape", "config": {"name": "reshape_4", "trainable": true, "dtype": "float32", "target_shape": {"class_name": "__tuple__", "items": [1, 2, 64]}}, "inbound_nodes": [[["mean_hin_aggregator_1", 0, 0, {}]]], "shared_object_id": 25}2 + root.layer-20"_tf_keras_layer*{"name": "reshape_5", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Reshape", "config": {"name": "reshape_5", "trainable": true, "dtype": "float32", "target_shape": {"class_name": "__tuple__", "items": [1, 2, 64]}}, "inbound_nodes": [[["mean_hin_aggregator_2", 0, 0, {}]]], "shared_object_id": 26}2 + root.layer-21"_tf_keras_layer*{"name": "dropout_9", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout_9", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "inbound_nodes": [[["mean_hin_aggregator", 0, 0, {}]]], "shared_object_id": 27, "build_input_shape": {"class_name": "TensorShape", "items": [null, 1, 64]}}2 + root.layer-22"_tf_keras_layer*{"name": "dropout_7", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout_7", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "inbound_nodes": [[["reshape_4", 0, 0, {}]]], "shared_object_id": 28, "build_input_shape": {"class_name": "TensorShape", "items": [null, 1, 2, 64]}}2 + root.layer-23"_tf_keras_layer*{"name": "dropout_8", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dropout", "config": {"name": "dropout_8", "trainable": true, "dtype": "float32", "rate": 0, "noise_shape": null, "seed": null}, "inbound_nodes": [[["reshape_5", 0, 0, {}]]], "shared_object_id": 29, "build_input_shape": {"class_name": "TensorShape", "items": [null, 1, 2, 64]}}2 +root.layer_with_weights-3"_tf_keras_layer*{"name": "mean_hin_aggregator_3", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "MeanHinAggregator", "config": {"name": "mean_hin_aggregator_3", "trainable": true, "dtype": "float32", "output_dim": 64, "bias": true, "act": "linear", "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 30}, "kernel_regularizer": null, "kernel_constraint": null, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 31}, "bias_regularizer": null, "bias_constraint": null}, "inbound_nodes": [[["dropout_9", 0, 0, {}], ["dropout_7", 0, 0, {}], ["dropout_8", 0, 0, {}]]], "shared_object_id": 32, "build_input_shape": [{"class_name": "TensorShape", "items": [null, 1, 64]}, {"class_name": "TensorShape", "items": [null, 1, 2, 64]}, {"class_name": "TensorShape", "items": [null, 1, 2, 64]}]}2 + root.layer-25"_tf_keras_layer*{"name": "reshape_6", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Reshape", "config": {"name": "reshape_6", "trainable": true, "dtype": "float32", "target_shape": {"class_name": "__tuple__", "items": [64]}}, "inbound_nodes": [[["mean_hin_aggregator_3", 0, 0, {}]]], "shared_object_id": 33}2 + root.layer-26"_tf_keras_layer*{"name": "lambda", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Lambda", "config": {"name": "lambda", "trainable": true, "dtype": "float32", "function": {"class_name": "__tuple__", "items": ["4wEAAAAAAAAAAAAAAAEAAAAEAAAAUwAAAHMOAAAAdABqAXwAZAFkAo0CUwApA07p/////6kB2gRh\neGlzKQLaAUvaDGwyX25vcm1hbGl6ZakB2gF4qQByCAAAAPpQL29wdC9jb25kYS9lbnZzL3JhcGlk\ncy9saWIvcHl0aG9uMy44L3NpdGUtcGFja2FnZXMvc3RlbGxhcmdyYXBoL2xheWVyL2hpbnNhZ2Uu\ncHnaCDxsYW1iZGE+ZgEAAPMAAAAA\n", null, null]}, "function_type": "lambda", "module": "stellargraph.layer.hinsage", "output_shape": null, "output_shape_type": "raw", "output_shape_module": null, "arguments": {}}, "inbound_nodes": [[["reshape_6", 0, 0, {}]]], "shared_object_id": 34}2 \ No newline at end of file diff --git a/examples/gnn_fraud_detection_pipeline/model/hinsage-model.pt/saved_model.pb b/examples/gnn_fraud_detection_pipeline/model/hinsage-model.pt/saved_model.pb index 7a6baa630c009bfe31c164bd6c57085c95c9a19c..379570b809219b71e6e51cbdbef164f397a25400 100644 GIT binary patch literal 498348 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 k2kecC^oBx@fEg6V345a|y%D2PU~kl07H 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

oD=x;zjy$6Jm1G^w{gDfR5u zPx&o^+nSD$9&9UGc2Y`&U-*DXko`c|k@tnNcgt8aBB^F<}G{4^Us-{i1SxPQ-)v121fGkaivZtm_oZ=JsT&e7(`iR%5MyYFZZ@4oTG zf&9&fM|O`LgMSwf+;!8j`tIiJh;d^JYTI9&Ym83bbldLZhllUH`RLuxE=~;HJ~UJz ztsENqxqDl{=+45B{7pSv7C&nw#2A>GaS#EQ?`)I))}CoJ!J|DkU7tFthXq9J`&jGc{y?wJV>l&$-_qaWtLJm`hgp&g?{^HA5EHCpkxqLz<|^T7wR^fPnsY zACTDb&^Uf!%V%TR7od#wlQqj=ezIho`NgTKla9Qf6E8^OZ`sqjgIB}y3re&R>wJTEFkNTnZiFiS3)N>nh$sWl#(Xo{y zk$9-zxHG<3>or)QAdz_C%#Jb+ftZG3)cD_Nk+mp|+ahZ23JF`x7ST`nt<$^JCK)?f z%r>ExvF^&9j8i6Ni%F2&>Gq?3!t0}c#0MB|Op9=|*e_HiTW&VaXwSOY zEUP-Mtz+l{2_4>-ftWIY4P%xBaMM9X0@(45`MDqU6T`JEGr^3pdcz#d=%iERVCLjP z*yeB(oPN}gm3kX<`qq#75lUfrdg@NPLDeVV|%y$#86Og?nN5?Kj{nzHU98Vx|YUUeaN=kpkRCfaA>v(CMK(fXq!L>1G zWB)Q9`_tjE|4S764|%X>92J(jw+xP0s2PI28E`LRu}J@SdzuwQwTLbmufr*g;#}l$ zE@3#AahxkW&JXc8zkJbg#%3l<8)uB_F5z6|aUR5Q{uvzSpXG6Wn8*1Qi;goEl(@8U z#;EQR&OgWF{4@;br{g&9;&FZ@kMpY*9cRpwzO-@1sO}QZLp;vcVK`rp<9q{;^Q(EB zU$f{qOWHw}$oPy=9Utd^A@i_j@HpRy;k+Bi`I$VKlIL3Q;j9>j^yLa$?_fDqo-evdQyZOF*0PDN=;C=UAzVE)C@4IJ~NZ-X~Kuc5Ci~26s zf_~qH4QMh^HmO}IefP&?+`W(Oy9e36yH>3^w>cPwpUZURy4{tB`K~;Ib>&gKD>wMA z{06=&zcGAQerzQ+48LlnTg}N1!^kwZXF4)Mf4>`_#cu3)CEe2LKM332D9B23ot_o) zMHsq&M3&Hp_})8)_1?pH?;YoR@0A) z!eaO`tdJ4R10$jSmvBDD<2;Aqd>qI51dsFEd7OW3(Q(GM-Co-L8KXKr z&JU`vV7s4Pu$^>PXjz!eJ>cAu1=}fR!S;N6!S?g4plnuOpok?UrM^(XL}i`&3kokQ z@8D(S*Tc)oA`|)$(sX*xZ^+&S0}M>2$xJ%h`YYa>uyp%j z63%aa5p+T4t~t1#f~x`7=fgFhxlFql z7DFRP>%(w3d~+NQub+d15~do{on+pnLr6N1)W1k*y84i!ucZlNwTZ^e^!P|yTcf^Q z(N|e_tJQ}UePw66Z7r?7LeVej6t@oxtk1v(;I-ytyWMDOTh&)8`lc5AU@sYK&bYZ& z-O3K5o779i)8Q@ZW!P+Zt@;y%Nt4^Ez96A*s*N@d)n}V<26+7#9Kkz2)~e6UPB*k` z)SoJ0ljyXkkiwafdb3%p!T4d7O7w%wSn zO%5MvjLetFihPj@qPmJt2|JzR$uLa z>q==%tFH;f`n5h-uTdXi#AuTmB|$QBMkIg<>67un>;~_H>!9eoPJqrYvFLCahiUcE zKy-fD7oFF0=tRk1jGV9t=sI|b-G#-hU|W~J441)}qAUv%EXp%W#|D{@{J zpaV%@J%!G12+;XW79B2~Dy_aZ5S_<;(fKV7ohZp!k+ZP?9Z22kDRkZ^K45({LY-7Pn`Qw1BAo=_*@|MX_X zxLo9n%>d1sZZUJJ}`B6P5KOZ=_9X%l|Eyq zEq#P)5JE7}6RSNK=#5a)7vZ&#()VeB^nHevJ}#jqt$sF8`ab6?eV^x~FG_k&GXN_^=J=4>}gP%Hlz1nB%Viw>6~kXHXD5S_pEMd$B0bfRP&L{2dPbRZw0 zr_lL(0XqM{qQeF8r`3N9MCYG;(fJ~WPLz~@$TE`AXQeSiZ9sBePScy>NG`Gq-(y*tu==w}a5*zPHS{zm}Nk63{CVCS^@zkvY#*cYJx z;{bYTgwW}=YUEI900`o$yAIIk_=r2|Gq?x+I|)!#I>Sk#W9mwF)ayVeKy^hYKy_s& zKy_6oKvnGosGi>mP}MpCs;kWa)iq{->RK~EbsY&%g+SHya4o=f16+%6y#THyxax2% z!}UVAR^WOOTuH#|Mm=GWfY*!RN&;Rt!IcEOZiXwVZwp*WeJQw-`YwTMDbU0d%o6Dm zkr*%i6+uw1bRB(4yDuMop7wdlh1yH^%5L=R;5zzp+LzP5ocg55NcY=*kLvfRevj(+ zs6|bg>T4-Ju~C{I!84`c5=&U~e=T7^68=@S+IZ_wW4h5AY1AerM;pyruGUGAq?v?= zTD6K%$%ZLcF2JfgOnrG+#fKml@ zwe_c-NnWL`JTlPP@A=3|dLUU_(~hV#eG~E*$4KFTLp=n^sR(;p1xXJ0k=oz zbaJyvQ_T#_w!ZpIQq>Yu=V|1@1)6qrZnD)pLElTBNuH-~)Yf%=vfoHP20!cC>Uyg+ z31_)|Ev8sPDp*;lR`x2Mjzwfa-*4~f$x|4(k_iy7Wx2~yNm z3{JCh*Cr}f@D?L(A@@g%c(ErG<8z93H4B8bNuuFaWchqapI5Zk10t_;A#$mS$i_2C z-K$W1l}9)6F;&LDDaOAl+Vz2r@>d#_JoL4mXs-{5c@K!iVsA9c2Slz>K_C{hz0uy! zE5>IOeqgtHqH98tFBf{FN#9b8Zz%kTCumX-fTe10wAQB=dgg@rYQ8rb<MeE_0cl@`Fg#*LhKNh7QOwxYcYM$UJ*M$V_2Bj*)ol9zc$PIfBp zJBnV&%yL$pNe+-Hcvq(1f1EHrlHkWuVKV~+ppY$gp^{wBve8GbxY3L(7z+hMELVb( z6;GGlS%+niI>FR3(*Cud>lct~~aJB7`3a=U0M~m0o3t zk6dxh43MiLgmiHR4{MSpS4qBC*?2l(yu@XWw>aQhJr|2bewB@u>)FZXhZDvhB=~i= zppiimRVc=;ZGU8<5&&$97-3FEy9 zt-zY51=+@4Ct?})ppEdBQP4l4XdeW-15D>R7vN^o?y%uZa;6#|EgY0&>>!uVQ3 z+bhMj06{Dja^0=4oXsu^UWb%WZeBsOV5L|HmQe3orP8wCT1W}y+8-dH)%Wm?@nk&kT&4websEKApcIGx-2;M)r9e-gm#Mr$NXipn#~uwSY4$GPP*kV zPWiZi3NEWjHCyR@7ZBH|AdxBehzrOEM9xS9gI+b4HG0FZ<>SZW8WjX$wcH!+^;y4F z-90e}>1{$glc3~sw2O1i3=n`Eq!tS8Omdaajuy`as|sV zpnm0T+MUs4-mwBp&GoJm#NTLCYBSQ={DzUr&3w%{Rm{PQ9(je?U4xNM-s-X z6WW!mfuVD3pL^^ofKNA6u}Z`=2Qy!Vvp>t_u0YO7w}R(Bl`uY@(02K=B|ruW*>c<( za?665-%_rFXyOdZOy@*3Gg+-xE|hY*oswbx!?1qITmL9n|0rf2QM8A_Kk_n{e}v01 zaS4#XCDP3-29oxqe>9;5rpLhkn(OYk^R8R>-gdC|-1^A}PCY;McaWg+1w~tSc`76! zEVJ{mPpJT!*|j;i5v;+1O0|%zUz<<>r$+w5v}i zuGGv-Iem-!t0d>g%G60rDH^5w+WF)*?MbH-X-&!cze2rfU7@;c=uxRYFA~)cxzdQN zhy#w-#8FfPCwMI$LkaS}jMT$ZQ!ye_V=^k3ns*^`DC4~;=JNVzsyv@8XjGn_d^&N3 zEr*_LF)R1XmcggaL#pTHrxRO=45G!U{B?)gN+fDcmP%0jB1G;u-cq?U^7@_88MyUy zVhhSRU4n{ABq~hC_)~#t4vBR|rI44=97NZp&6Go1*8KGy`--o=lcTyUq3>7{NUm}S zEzQ0{sm3%6M>UZ<2Y7c$QY5( zAcRnoL~FCmUxQf1ef6CbwUC+;UOQW#w`EU)T1?Y$)Ka<26(ux{Ly|dZ5o;Q=7^?5Q zR6y!ec&+PD;j8Z~DlmN~;nJ!UAecJ*Oo@DXq4b>;)nFNjN_BVj9Y-~lJ229OpWg`? z8mwV3?dze2q#Q)0#$;45HJHAWu=P|5u-`!x4Ptgz2@TQ}Y9X~H3biInC8)*p9miWL zcaXFcMbpI6cU~$WIXem!vGkpslT1c)SnF9>O*><&|NM@9#dm%uN41QWW=XKeSV^ie z4Z~3la#zh2Wi$*=nkjo?4Z{>g=XU~XWVA2yiJO1B z1%@AYd8$K=yX-5z>kN)+Du>|g4L{Pc-?1mn(dE!f4TQHvrN(#MWeC@?kxVWaMP?); zU*~k8|43#P_g!bmQ7bb`us(0=KnZHGahIc(${i#bgdg!7l6=QqvlzP05KtjA`a4wk zj=L5WkGpm;v22@6h_SyH2ZH0X5%dPPq765Gkyog+b%W+&WSXUPolP@1VYr>`1bikl zy&{AQ%j*`7nf{s%it3?hDMqFxl%6BByiJMg0?d~6=Q6fW(tO)^EOMQY?faa8_R9HW zM!V#6Vly!w3yV{ci%%waDx;8TGBPBY4}|kT=k@*3Ikx$9Vxy2#ddRO=B7NOt1pf8! zD#1}GoW~|WuR$7>{$@o_f)6s)oKKEx`{t8-wOh_4Z`Q6jow!U(9^WZ&H&|vKx`7@P z$$6bQtX)8mEv97rhcfay8K6 zB#zu@je&{D*=Wpp8UMzF5l7B@70?GEQH+WsgaY(-ACze{NoFH`aIqWR^*+con)E@K zD^jst?3O73VjHFpdK&{#ilh%Nc4LD2;2T4v6LY>Z|2|kH(U_l5^Z^=#^9Tgtyh_nd z%qNd&GiQ>|^BW4Sm59$!NQzkFnN`g2j+kt*2qUIN2puuI%^rw;UE=Hs>en25z8_+2 z<)nwKlOd#9|GgzHBI1F|Y`Y$<*$@-Hw406T3ai;?x|uplb6tt1AR&7xSxsT@>@1!% z6N=q)YadNPR>W~NMOT?a@`|aRSh~!S(i1S#lTK3yO-Z`T(&Yd)Pq4a6lt!DXap^WX zNJl_=ef%Q|^f!6~dcOp7iGNbGFTmxA<+SlU@i`D16OAYeX}F2cWO97MImKi!;z=_3 z>#-#nj=9j^;+5pDg9v|F(f%GTf30Yrh9eX{0p{M*i6?1l=iCvIrHCjMGU##Ta^5&h zYt-Y)`5d;ul@pw{U>&2tmGe1nA&NN1<}^8zu!z+p6%pHF5r>UepwZ}y2b8i$ChXP2zh^yH2^5K>F*q~r{ZJEM^l?ES@f#u+$+ zcm|Wr@I13-93gl{*lPtL`|^yVmhudaa0<^ejwCV97*agZI2Ll8B`k<%;MzaCJmaXP zJcARH7M*8Y9KAo!s#ys93ePiw81;;jjLL8^CAK3K>zf?4#MVhRHw(`*jwG?1S!#kf z1F^oz#eN6z3^uYlyFBBlB|Ia0i7gn<-s;LgwE89&zZ}4`JmehQ8(QI-<{+sB{z-mc z8zGT|Re4A;*c*)!e4_DASCE(W_3%Mnd5A!l6DneX4WaNY>8HiXDVi^I1xg8MrK*bt zqemLG{ktIvO8P+}R5Jc&z0=y$iTUJ%2`xFFJWuudmik5ZGQKT*|JB1%jRkhzR pboLFOHNX8vo_j;E`X>sB@Y;T(z`fyP2e98La&O=#FiI!2|35)Gb4UOH diff --git a/examples/gnn_fraud_detection_pipeline/model/hinsage-model.pt/variables/variables.data-00000-of-00001 b/examples/gnn_fraud_detection_pipeline/model/hinsage-model.pt/variables/variables.data-00000-of-00001 index ca625f4eea55860b42f2510d2393e42d347063fa..636af39730de963fdd99833e62849da5f6b0a2b1 100644 GIT binary patch delta 38206 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 Hr~m&4TenL9 delta 31868 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 delta 236 zcmcb@euaI4A^QSPQ}rBkwuu&Q?19C?YN9G4lMNXSI5ZmaO{Z-=a%tjTQ;r>NR#Su( zMGPnUYjHhd)M#KbjWoThJXw#?ie1K)i$z>sV&VZ^zK1{=M$^ZibTWWyjX-LzGJ(|g zX}c_#e2>wZrS(8y&SY68WA=YS?9O0KY7;lG@+dSs1M18-6*Ze6Ho1?b^r}fo2<>u%RXhDPY}cqIhZ15kfIa(Pj4~+0V9a0 MVSImmax-%v0Iz&RVE_OC diff --git a/examples/gnn_fraud_detection_pipeline/model/xgb-model.pt b/examples/gnn_fraud_detection_pipeline/model/xgb-model.pt index 4b86a49a34058a4b605ab5edc0b5d7e9dc16c119..cb2abddbea576fe75b6c30fb1af75514d632c4e2 100644 GIT binary patch literal 88953 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�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 Kx-x9d`+oq9?C^;I diff --git a/models/training-tuning-scripts/fraud-detection-models/HinSAGE.py b/models/training-tuning-scripts/fraud-detection-models/HinSAGE.py index 565a4184ac..4f294742b5 100644 --- a/models/training-tuning-scripts/fraud-detection-models/HinSAGE.py +++ b/models/training-tuning-scripts/fraud-detection-models/HinSAGE.py @@ -1,178 +1,127 @@ - -from stellargraph.layer import HinSAGE -from stellargraph.mapper import HinSAGENodeGenerator -from tensorflow.keras import layers -from tensorflow.keras import optimizers, Model -from tensorflow.keras.losses import binary_crossentropy -import pandas as pd - -import numpy as np -from sklearn.metrics import precision_recall_curve, precision_recall_fscore_support, f1_score -from sklearn.metrics import average_precision_score, roc_curve, roc_auc_score -from matplotlib import pyplot - -class HinSAGE_Representation_Learner: - - """ - This class initializes a graphsage framework - - Parameters - ---------- - embedding_size : int - The desired size of the resulting embeddings - num_samples : list - The length of the list defines the depth of random walks, the values of the list - define the number of nodes to sample per neighborhood. - embedding_for_node_type: str - String identifying the node type for which we want graphsage to generate embeddings. - - """ - - - def __init__(self, embedding_size, num_samples, embedding_for_node_type): - - self.embedding_size = embedding_size - self.num_samples = num_samples - self.embedding_for_node_type = embedding_for_node_type - - - def train_hinsage(self, S, node_identifiers, label, batch_size, epochs): - - """ - - This function trains a HinSAGE model, implemented in Tensorflow. - It returns the trained HinSAGE model and a pandas datarame containing the embeddings generated for the train nodes. - - Parameters - ---------- - S : StellarGraph Object - The graph on which HinSAGE trains its aggregator functions. - node_identifiers : list - Defines the nodes that HinSAGE uses to train its aggregation functions. - label: Pandas dataframe - Defines the label of the nodes used for training, with the index representing the nodes. - batch_size: int - batch size to train the neural network in which HinSAGE is implemented. - epochs: int - Number of epochs for the neural network. - - """ - # The mapper feeds data from sampled subgraph to GraphSAGE model - train_node_identifiers = node_identifiers[:round(0.8*len(node_identifiers))] - train_labels = label.loc[train_node_identifiers] - - validation_node_identifiers = node_identifiers[round(0.8*len(node_identifiers)):] - validation_labels = label.loc[validation_node_identifiers] - generator = HinSAGENodeGenerator(S, batch_size, self.num_samples, head_node_type= self.embedding_for_node_type) - train_gen = generator.flow(train_node_identifiers, train_labels, shuffle=True) - test_gen = generator.flow(validation_node_identifiers, validation_labels) - - # HinSAGE model - model = HinSAGE(layer_sizes=[self.embedding_size]*len(self.num_samples), generator=generator, dropout=0) - x_inp, x_out = model.build() - - # Final estimator layer - prediction = layers.Dense(units=1, activation="sigmoid", dtype='float32')(x_out) - - # Create Keras model for training - model = Model(inputs=x_inp, outputs=prediction) - model.compile( - optimizer=optimizers.Adam(lr=1e-3), - loss=binary_crossentropy, - ) - - # Train Model - model.fit( - train_gen, epochs=epochs, verbose=1, validation_data=test_gen, shuffle=False - ) - - trained_model = Model(inputs=x_inp, outputs=x_out) - train_gen_not_shuffled = generator.flow( node_identifiers, label, shuffle=False) - embeddings_train = trained_model.predict(train_gen_not_shuffled) - - train_emb = pd.DataFrame(embeddings_train, index=node_identifiers) - - return trained_model, train_emb - - def inductive_step_hinsage(self, S, trained_model, inductive_node_identifiers, batch_size): - - """ - - This function generates embeddings for unseen nodes using a trained hinsage model. - It returns the embeddings for these unseen nodes. - - Parameters - ---------- - S : StellarGraph Object - The graph on which HinSAGE is deployed. - trained_model : Neural Network - The trained hinsage model, containing the trained and optimized aggregation functions per depth. - inductive_node_identifiers : list - Defines the nodes that HinSAGE needs to generate embeddings for - batch_size: int - batch size for the neural network in which HinSAGE is implemented. - - """ - - # The mapper feeds data from sampled subgraph to HinSAGE model - generator = HinSAGENodeGenerator(S, batch_size, self.num_samples, head_node_type=self.embedding_for_node_type) - test_gen_not_shuffled = generator.flow(inductive_node_identifiers, shuffle=False ) - - inductive_emb = trained_model.predict(test_gen_not_shuffled, verbose=1) - inductive_emb = pd.DataFrame(inductive_emb, index=inductive_node_identifiers) - - return inductive_emb - -class Evaluation: - - def __init__(self, probabilities, labels, name): - - self.probabilities = probabilities - self.labels = labels - self.name = name - - def pr_curve(self): - - """ - This function plots the precision recall curve for the used classification model and a majority classifier. - - """ - probs = self.probabilities[:, 1] - precision, recall, _ = precision_recall_curve(self.labels, probs) - pyplot.plot(recall, precision, label=self.name) - # axis labels - pyplot.xlabel('Recall') - pyplot.ylabel('Precision') - # show the legend - pyplot.legend() - - print('Average precision-recall score for ', self.name, ' configuration XGBoost: {0:0.10f}'.format(average_precision_score(self.labels, probs))) - - def roc_curve(self, model_name='XGBoost'): - - """ - This function plots the precision recall curve for the used classification model and a majority classifier. - - """ - probs = self.probabilities[:, 1] - fpr, tpr, _ = roc_curve(self.labels, probs) - auc = round(roc_auc_score(self.labels, probs),3) - pyplot.plot(fpr, tpr, label=self.name + str(auc)) - # axis labels - pyplot.xlabel('FPR') - pyplot.ylabel('TPR') - # show the legend - pyplot.legend() - - print('ROC score for ', self.name, ' configuration : {0:0.10f}'.format(auc)) - return auc - - def f1_ap_rec(self): - - probs = self.probabilities[:, 1] >= 0.5 - prec,rec,f1,num = precision_recall_fscore_support(self.labels, probs, average=None) - - print("Precision:%.3f \nRecall:%.3f \nF1 Score:%.3f"%(prec[1],rec[1],f1[1])) - micro_f1 = f1_score(self.labels, probs, average='micro') - print("Micro-Average F1 Score:",micro_f1) - #return micro_f1 +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from stellargraph.layer import HinSAGE +from stellargraph.mapper import HinSAGENodeGenerator +from tensorflow.keras import Model +from tensorflow.keras import layers +from tensorflow.keras import optimizers +from tensorflow.keras.losses import binary_crossentropy +import pandas as pd + + +class HinSAGE_Representation_Learner: + """ + This class initializes a graphsage framework + + Parameters + ---------- + embedding_size : int + The desired size of the resulting embeddings + num_samples : list + The length of the list defines the depth of random walks, the values of the list + define the number of nodes to sample per neighborhood. + embedding_for_node_type: str + String identifying the node type for which we want graphsage to generate embeddings. + + """ + + def __init__(self, embedding_size, num_samples, embedding_for_node_type): + + self.embedding_size = embedding_size + self.num_samples = num_samples + self.embedding_for_node_type = embedding_for_node_type + + def train_hinsage(self, S, node_identifiers, label, batch_size, epochs): + """ + + This function trains a HinSAGE model, implemented in Tensorflow. + It returns the trained HinSAGE model and a pandas dataframe + containing the embeddings generated for the train nodes. + + Parameters + ---------- + S : StellarGraph Object + The graph on which HinSAGE trains its aggregator functions. + node_identifiers : list + Defines the nodes that HinSAGE uses to train its aggregation functions. + label: Pandas dataframe + Defines the label of the nodes used for training, with the index representing the nodes. + batch_size: int + batch size to train the neural network in which HinSAGE is implemented. + epochs: int + Number of epochs for the neural network. + + """ + # The mapper feeds data from sampled subgraph to GraphSAGE model + train_node_identifiers = node_identifiers[:round(0.8 * len(node_identifiers))] + train_labels = label.loc[train_node_identifiers] + + validation_node_identifiers = node_identifiers[round(0.8 * len(node_identifiers)):] + validation_labels = label.loc[validation_node_identifiers] + generator = HinSAGENodeGenerator(S, batch_size, self.num_samples, head_node_type=self.embedding_for_node_type) + train_gen = generator.flow(train_node_identifiers, train_labels, shuffle=True) + test_gen = generator.flow(validation_node_identifiers, validation_labels) + + # HinSAGE model + model = HinSAGE(layer_sizes=[self.embedding_size] * len(self.num_samples), generator=generator, dropout=0) + x_inp, x_out = model.build() + + # Final estimator layer + prediction = layers.Dense(units=1, activation="sigmoid", dtype='float32')(x_out) + + # Create Keras model for training + model = Model(inputs=x_inp, outputs=prediction) + model.compile( + optimizer=optimizers.Adam(lr=1e-3), + loss=binary_crossentropy, + ) + + # Train Model + model.fit(train_gen, epochs=epochs, verbose=1, validation_data=test_gen, shuffle=False) + + trained_model = Model(inputs=x_inp, outputs=x_out) + train_gen_not_shuffled = generator.flow(node_identifiers, label, shuffle=False) + embeddings_train = trained_model.predict(train_gen_not_shuffled) + + train_emb = pd.DataFrame(embeddings_train, index=node_identifiers) + + return trained_model, train_emb + + def inductive_step_hinsage(self, S, trained_model, inductive_node_identifiers, batch_size): + """ + This function generates embeddings for unseen nodes using a trained hinsage model. + It returns the embeddings for these unseen nodes. + + Parameters + ---------- + S : StellarGraph Object + The graph on which HinSAGE is deployed. + trained_model : Neural Network + The trained hinsage model, containing the trained and optimized aggregation functions per depth. + inductive_node_identifiers : list + Defines the nodes that HinSAGE needs to generate embeddings for + batch_size: int + batch size for the neural network in which HinSAGE is implemented. + + """ + # The mapper feeds data from sampled subgraph to HinSAGE model + generator = HinSAGENodeGenerator(S, batch_size, self.num_samples, head_node_type=self.embedding_for_node_type) + test_gen_not_shuffled = generator.flow(inductive_node_identifiers, shuffle=False) + + inductive_emb = trained_model.predict(test_gen_not_shuffled, verbose=1) + inductive_emb = pd.DataFrame(inductive_emb, index=inductive_node_identifiers) + + return inductive_emb diff --git a/models/training-tuning-scripts/fraud-detection-models/evaluation.py b/models/training-tuning-scripts/fraud-detection-models/evaluation.py index 94094bf5b1..81db41bc5d 100644 --- a/models/training-tuning-scripts/fraud-detection-models/evaluation.py +++ b/models/training-tuning-scripts/fraud-detection-models/evaluation.py @@ -1,37 +1,51 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. -import numpy as np -import pandas as pd -from sklearn.metrics import precision_recall_curve, precision_recall_fscore_support, f1_score -from sklearn.metrics import average_precision_score, roc_curve, roc_auc_score from matplotlib import pyplot +from sklearn.metrics import average_precision_score +from sklearn.metrics import f1_score +from sklearn.metrics import precision_recall_curve +from sklearn.metrics import precision_recall_fscore_support +from sklearn.metrics import roc_auc_score +from sklearn.metrics import roc_curve -class Evaluation: +class Evaluation: """ This class initializes the evaluation of a classification model. - + Parameters ---------- probabilities : iterable The predicted probabilities per class for the classification model. labels : iterable - The labels corresponding with the predicted probabilities. + The labels corresponding with the predicted probabilities. name : str The name of the used configuration - """ - + """ + def __init__(self, probabilities, labels, name): - + self.probabilities = probabilities self.labels = labels self.name = name - - - def pr_curve(self): + def pr_curve(self): """ This function plots the precision recall curve for the used classification model and a majority classifier. - + """ probs = self.probabilities[:, 1] precision, recall, _ = precision_recall_curve(self.labels, probs) @@ -41,34 +55,35 @@ def pr_curve(self): pyplot.ylabel('Precision') # show the legend pyplot.legend() - - print('Average precision-recall score for ', self.name, ' configuration XGBoost: {0:0.10f}'.format(average_precision_score(self.labels, probs))) - def roc_curve(self, model_name='XGBoost'): + print('Average precision-recall score for ', + self.name, + ' configuration XGBoost: {0:0.10f}'.format(average_precision_score(self.labels, probs))) + def roc_curve(self, model_name='XGBoost'): """ This function plots the precision recall curve for the used classification model and a majority classifier. - + """ probs = self.probabilities[:, 1] fpr, tpr, _ = roc_curve(self.labels, probs) - auc = round(roc_auc_score(self.labels, probs),3) + auc = round(roc_auc_score(self.labels, probs), 3) pyplot.plot(fpr, tpr, label=self.name + str(auc)) # axis labels pyplot.xlabel('FPR') pyplot.ylabel('TPR') # show the legend pyplot.legend() - + print('ROC score for ', self.name, ' configuration : {0:0.10f}'.format(auc)) return auc - + def f1_ap_rec(self): - + probs = self.probabilities[:, 1] >= 0.5 - prec,rec,f1,num = precision_recall_fscore_support(self.labels, probs, average=None) - - print("Precision:%.3f \nRecall:%.3f \nF1 Score:%.3f"%(prec[1],rec[1],f1[1])) + prec, rec, f1, num = precision_recall_fscore_support(self.labels, probs, average=None) + + print("Precision:%.3f \nRecall:%.3f \nF1 Score:%.3f" % (prec[1], rec[1], f1[1])) micro_f1 = f1_score(self.labels, probs, average='micro') - print("Micro-Average F1 Score:",micro_f1) - #return micro_f1 + print("Micro-Average F1 Score:", micro_f1) + # return micro_f1 diff --git a/models/training-tuning-scripts/fraud-detection-models/graph-sage-fraud-detection.ipynb b/models/training-tuning-scripts/fraud-detection-models/graph-sage-fraud-detection.ipynb index c81e27e446..5bc69507b9 100644 --- a/models/training-tuning-scripts/fraud-detection-models/graph-sage-fraud-detection.ipynb +++ b/models/training-tuning-scripts/fraud-detection-models/graph-sage-fraud-detection.ipynb @@ -67,7 +67,6 @@ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pylab as plt\n", - "#from HinSAGE import HinSAGE_Representation_Learner\n", "from evaluation import Evaluation\n", "from HinSAGE import HinSAGE_Representation_Learner\n", "from stellargraph import StellarGraph\n", @@ -925,7 +924,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -939,7 +938,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.10" + "version": "3.8.13" } }, "nbformat": 4, diff --git a/models/training-tuning-scripts/fraud-detection-models/training.py b/models/training-tuning-scripts/fraud-detection-models/training.py index 967a0b66f1..15ab30c837 100644 --- a/models/training-tuning-scripts/fraud-detection-models/training.py +++ b/models/training-tuning-scripts/fraud-detection-models/training.py @@ -1,26 +1,40 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. """" # EXample usage: python training.py --training-data ../../datasets/training-data/fraud-detection-training-data.csv \ --validation-data ../../datasets/validation-data/fraud-detection-validation-data.csv \ --epoch 10 --output-xgb model/xgb.pt --output-hinsage model/hinsage.pt """ +import argparse -import pandas as pd +import networkx as nx import numpy as np -from xgboost import XGBClassifier +import pandas as pd import tensorflow as tf -from tensorflow.keras import layers, optimizers, Model -from tensorflow.keras.losses import binary_crossentropy -import argparse from evaluation import Evaluation +from stellargraph import StellarGraph from stellargraph.layer import HinSAGE from stellargraph.mapper import HinSAGENodeGenerator -from stellargraph import StellarGraph -import networkx as nx +from tensorflow.keras import Model +from tensorflow.keras import layers +from tensorflow.keras import optimizers +from tensorflow.keras.losses import binary_crossentropy +from xgboost import XGBClassifier -tf.random.set_seed( - 1001 -) +tf.random.set_seed(1001) def graph_construction(nodes, edges, node_features): @@ -39,8 +53,9 @@ def graph_construction(nodes, edges, node_features): def build_graph_features(dataset): transaction_node_data = dataset.drop(["client_node", "merchant_node", "fraud_label", "index"], axis=1) - client_node_data = pd.DataFrame([1]*len(dataset.client_node.unique())).set_index(dataset.client_node.unique()) - merchant_node_data = pd.DataFrame([1]*len(dataset.merchant_node.unique())).set_index(dataset.merchant_node.unique()) + client_node_data = pd.DataFrame([1] * len(dataset.client_node.unique())).set_index(dataset.client_node.unique()) + merchant_node_data = pd.DataFrame([1] * len(dataset.merchant_node.unique())).set_index( + dataset.merchant_node.unique()) nodes = {"client": dataset.client_node, "merchant": dataset.merchant_node, "transaction": dataset.index} edges = [zip(dataset.client_node, dataset.index), zip(dataset.merchant_node, dataset.index)] @@ -51,14 +66,14 @@ def build_graph_features(dataset): def split_train_test(df, ratio=0.7, train_anom_prop=0.1, test_anom_prop=0.1): - cutoff = round(ratio*len(df)) + cutoff = round(ratio * len(df)) train_data = df.head(cutoff) - test_data = df.tail(len(df)-cutoff) + test_data = df.tail(len(df) - cutoff) train_fraud = np.random.choice(train_data[train_data.fraud_label == 1].index, - int((1-train_anom_prop) * train_data.shape[0])) + int((1 - train_anom_prop) * train_data.shape[0])) test_fraud = np.random.choice(test_data[test_data.fraud_label == 1].index, - int((1-test_anom_prop) * test_data.shape[0])) + int((1 - test_anom_prop) * test_data.shape[0])) train_data, test_data = train_data[~train_data.index.isin( train_fraud)], test_data[~test_data.index.isin(test_fraud)] @@ -82,18 +97,18 @@ def train_model(train_graph, node_identifiers, label): xgb_n_estimator = 100 num_samples = [2, 32] - # The mapper feeds data from sampled subgraph to GraphSAGE model - train_node_identifiers = node_identifiers[:round(0.8*len(node_identifiers))] + # The mapper feeds data from sampled subgraph to GraphSAGE model + train_node_identifiers = node_identifiers[:round(0.8 * len(node_identifiers))] train_labels = label.loc[train_node_identifiers] - validation_node_identifiers = node_identifiers[round(0.8*len(node_identifiers)):] + validation_node_identifiers = node_identifiers[round(0.8 * len(node_identifiers)):] validation_labels = label.loc[validation_node_identifiers] generator = HinSAGENodeGenerator(train_graph, batch_size, num_samples, head_node_type=embedding_node_type) train_gen = generator.flow(train_node_identifiers, train_labels, shuffle=True) test_gen = generator.flow(validation_node_identifiers, validation_labels) # HinSAGE model - model = HinSAGE(layer_sizes=[embedding_size]*len(num_samples), generator=generator, dropout=0) + model = HinSAGE(layer_sizes=[embedding_size] * len(num_samples), generator=generator, dropout=0) x_inp, x_out = model.build() # Final estimator layer @@ -107,15 +122,13 @@ def train_model(train_graph, node_identifiers, label): ) # Train Model - model.fit( - train_gen, epochs=epochs, verbose=1, validation_data=test_gen, shuffle=False - ) + model.fit(train_gen, epochs=epochs, verbose=1, validation_data=test_gen, shuffle=False) hinsage_model = Model(inputs=x_inp, outputs=x_out) train_gen_not_shuffled = generator.flow(node_identifiers, label, shuffle=False) embeddings_train = hinsage_model.predict(train_gen_not_shuffled) - inductive_embedding = pd.DataFrame(embeddings_train, index=node_identifiers) + inductive_embedding = pd.DataFrame(embeddings_train, index=node_identifiers) xgb_model = XGBClassifier(n_estimators=xgb_n_estimator) xgb_model.fit(inductive_embedding, label) @@ -135,7 +148,7 @@ def inductive_step_hinsage(S, trained_model, inductive_node_identifiers, batch_s """ This function generates embeddings for unseen nodes using a trained hinsage model. - It returns the embeddings for these unseen nodes. + It returns the embeddings for these unseen nodes. Parameters ---------- @@ -161,7 +174,7 @@ def inductive_step_hinsage(S, trained_model, inductive_node_identifiers, batch_s def model_eval(trained_model, S, node_identifier, label): - + inductive_emb = inductive_step_hinsage(S, trained_model['hinsage'], node_identifier, batch_size=5) predictions = trained_model['xgb'].predict_proba(inductive_emb) # evaluate performance. @@ -187,33 +200,23 @@ def main(): if args.save_model: save_model(model, args.output_xgb, args.output_hinsage) # Save graph info - #val_data['index'] = val_data.index - #val_data.to_csv('val_data.csv', index=False) - print("Model Evaluation...") inductive_data = pd.concat((train_data, val_data)) S_graph = build_graph_features(inductive_data) model_eval(model, S_graph, node_identifier=list(val_data.index), label=val_data['fraud_label']) - if __name__ == "__main__": parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--training-data", required=True, - help="CSV with fraud_label") - parser.add_argument("--validation-data", required=False, - help="CSV with fraud_label") + parser.add_argument("--training-data", required=True, help="CSV with fraud_label") + parser.add_argument("--validation-data", required=False, help="CSV with fraud_label") parser.add_argument("--epochs", help="Number of epochs", type=int, default=10) - parser.add_argument("--node_type", required=False, - help="Target node type", default="transaction") - parser.add_argument("--output-xgb", required=False, - help="output file to save xgboost model") - parser.add_argument("--output-hinsage", required=False, - help="output file to save GraphHinSage model") + parser.add_argument("--node_type", required=False, help="Target node type", default="transaction") + parser.add_argument("--output-xgb", required=False, help="output file to save xgboost model") + parser.add_argument("--output-hinsage", required=False, help="output file to save GraphHinSage model") parser.add_argument("--save_model", type=bool, default=False, help="Save models to give filenames") - parser.add_argument("--embedding_size", required=False, default=64, - help="output file to save new model") + parser.add_argument("--embedding_size", required=False, default=64, help="output file to save new model") args = parser.parse_args() From 2a96c11dcbe998fbbe42a9ef71a920fdd7ea764b Mon Sep 17 00:00:00 2001 From: bsuryadevara Date: Mon, 27 Jun 2022 20:31:04 -0500 Subject: [PATCH 57/73] Ransomware detection pipeline (#149) - Added implementation for ransomware detection pipeline. - Added ransomware models (short, medium, long). - Added AppShield data files. Authors: - https://github.com/bsuryadevara - https://github.com/bsuryadev - Christopher Harris (https://github.com/cwharris) - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - Christopher Harris (https://github.com/cwharris) - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/149 --- .gitattributes | 2 +- .../cmdline_2022-01-30_10-26-00.310528.json | 3 + .../envars_2022-01-30_10-26-01.017250.json | 3 + .../handles_2022-01-30_10-26-04.570268.json | 3 + ...ldrmodules_2022-01-30_10-25-59.669333.json | 3 + .../netscan_2022-01-30_10-26-06.701633.json | 3 + .../pslist_2022-01-30_10-25-58.438453.json | 3 + ...threadlist_2022-01-30_10-26-01.670391.json | 3 + .../vadinfo_2022-01-30_10-26-02.785396.json | 3 + .../cmdline_2022-01-30_10-27-20.192845.json | 3 + .../envars_2022-01-30_10-27-20.824781.json | 3 + .../handles_2022-01-30_10-27-24.351073.json | 3 + ...ldrmodules_2022-01-30_10-27-19.577763.json | 3 + .../netscan_2022-01-30_10-27-26.651085.json | 3 + .../pslist_2022-01-30_10-27-18.426303.json | 3 + ...threadlist_2022-01-30_10-27-21.436988.json | 3 + .../vadinfo_2022-01-30_10-27-22.554357.json | 3 + .../cmdline_2022-01-30_10-27-29.034400.json | 3 + .../envars_2022-01-30_10-27-29.696475.json | 3 + .../handles_2022-01-30_10-27-33.184160.json | 3 + ...ldrmodules_2022-01-30_10-27-28.419808.json | 3 + .../netscan_2022-01-30_10-27-35.412059.json | 3 + .../pslist_2022-01-30_10-27-27.222779.json | 3 + ...threadlist_2022-01-30_10-27-30.310404.json | 3 + .../vadinfo_2022-01-30_10-27-31.425348.json | 3 + .../cmdline_2022-01-30_10-27-37.852093.json | 3 + .../envars_2022-01-30_10-27-38.523393.json | 3 + .../handles_2022-01-30_10-27-42.025544.json | 3 + ...ldrmodules_2022-01-30_10-27-37.207563.json | 3 + .../netscan_2022-01-30_10-27-44.388284.json | 3 + .../pslist_2022-01-30_10-27-36.010670.json | 3 + ...threadlist_2022-01-30_10-27-39.142386.json | 3 + .../vadinfo_2022-01-30_10-27-40.256811.json | 3 + .../cmdline_2022-01-30_10-27-46.768326.json | 3 + .../envars_2022-01-30_10-27-47.392028.json | 3 + .../handles_2022-01-30_10-27-50.868866.json | 3 + ...ldrmodules_2022-01-30_10-27-46.119774.json | 3 + .../netscan_2022-01-30_10-27-53.140515.json | 3 + .../pslist_2022-01-30_10-27-44.942274.json | 3 + ...threadlist_2022-01-30_10-27-48.010827.json | 3 + .../vadinfo_2022-01-30_10-27-49.124816.json | 3 + .../cmdline_2022-01-30_10-27-55.462305.json | 3 + .../envars_2022-01-30_10-27-56.125016.json | 3 + .../handles_2022-01-30_10-27-59.646114.json | 3 + ...ldrmodules_2022-01-30_10-27-54.849536.json | 3 + .../netscan_2022-01-30_10-28-01.868302.json | 3 + .../pslist_2022-01-30_10-27-53.703266.json | 3 + ...threadlist_2022-01-30_10-27-56.742443.json | 3 + .../vadinfo_2022-01-30_10-27-57.840927.json | 3 + .../cmdline_2022-01-30_10-28-04.272964.json | 3 + .../envars_2022-01-30_10-28-04.953163.json | 3 + .../handles_2022-01-30_10-28-08.441869.json | 3 + ...ldrmodules_2022-01-30_10-28-03.626127.json | 3 + .../netscan_2022-01-30_10-28-10.736493.json | 3 + .../pslist_2022-01-30_10-28-02.434170.json | 3 + ...threadlist_2022-01-30_10-28-05.546145.json | 3 + .../vadinfo_2022-01-30_10-28-06.685749.json | 3 + .../cmdline_2022-01-30_10-28-13.170175.json | 3 + .../envars_2022-01-30_10-28-13.853475.json | 3 + .../handles_2022-01-30_10-28-17.421832.json | 3 + ...ldrmodules_2022-01-30_10-28-12.533518.json | 3 + .../netscan_2022-01-30_10-28-19.820209.json | 3 + .../pslist_2022-01-30_10-28-11.304689.json | 3 + ...threadlist_2022-01-30_10-28-14.474304.json | 3 + .../vadinfo_2022-01-30_10-28-15.624847.json | 3 + .../cmdline_2022-01-30_10-28-22.279820.json | 3 + .../envars_2022-01-30_10-28-22.961828.json | 3 + .../handles_2022-01-30_10-28-26.556573.json | 3 + ...ldrmodules_2022-01-30_10-28-21.610465.json | 3 + .../netscan_2022-01-30_10-28-28.935730.json | 3 + .../pslist_2022-01-30_10-28-20.381565.json | 3 + ...threadlist_2022-01-30_10-28-23.581147.json | 3 + .../vadinfo_2022-01-30_10-28-24.735272.json | 3 + .../cmdline_2022-01-30_10-28-31.364334.json | 3 + .../envars_2022-01-30_10-28-32.009314.json | 3 + .../handles_2022-01-30_10-28-35.577547.json | 3 + ...ldrmodules_2022-01-30_10-28-30.714518.json | 3 + .../netscan_2022-01-30_10-28-37.943351.json | 3 + .../pslist_2022-01-30_10-28-29.495682.json | 3 + ...threadlist_2022-01-30_10-28-32.626539.json | 3 + .../vadinfo_2022-01-30_10-28-33.771251.json | 3 + .../cmdline_2022-01-30_10-28-40.413905.json | 3 + .../envars_2022-01-30_10-28-41.081318.json | 3 + .../handles_2022-01-30_10-28-44.565776.json | 3 + ...ldrmodules_2022-01-30_10-28-39.771264.json | 3 + .../netscan_2022-01-30_10-28-46.868661.json | 3 + .../pslist_2022-01-30_10-28-38.532482.json | 3 + ...threadlist_2022-01-30_10-28-41.704092.json | 3 + .../vadinfo_2022-01-30_10-28-42.816266.json | 3 + .../cmdline_2022-01-30_10-26-09.063587.json | 3 + .../envars_2022-01-30_10-26-09.741878.json | 3 + .../handles_2022-01-30_10-26-13.348160.json | 3 + ...ldrmodules_2022-01-30_10-26-08.416585.json | 3 + .../netscan_2022-01-30_10-26-15.507886.json | 3 + .../pslist_2022-01-30_10-26-07.234099.json | 3 + ...threadlist_2022-01-30_10-26-10.364669.json | 3 + .../vadinfo_2022-01-30_10-26-11.510219.json | 3 + .../cmdline_2022-01-30_10-28-49.250538.json | 3 + .../envars_2022-01-30_10-28-49.915433.json | 3 + .../handles_2022-01-30_10-28-53.341373.json | 3 + ...ldrmodules_2022-01-30_10-28-48.612563.json | 3 + .../netscan_2022-01-30_10-28-55.730970.json | 3 + .../pslist_2022-01-30_10-28-47.433187.json | 3 + ...threadlist_2022-01-30_10-28-50.543176.json | 3 + .../vadinfo_2022-01-30_10-28-51.612010.json | 3 + .../cmdline_2022-01-30_10-28-58.110831.json | 3 + .../envars_2022-01-30_10-28-58.780398.json | 3 + .../handles_2022-01-30_10-29-02.202932.json | 3 + ...ldrmodules_2022-01-30_10-28-57.472183.json | 3 + .../netscan_2022-01-30_10-29-04.510655.json | 3 + .../pslist_2022-01-30_10-28-56.297185.json | 3 + ...threadlist_2022-01-30_10-28-59.406043.json | 3 + .../vadinfo_2022-01-30_10-29-00.505583.json | 3 + .../cmdline_2022-01-30_10-29-06.870196.json | 3 + .../envars_2022-01-30_10-29-07.543314.json | 3 + .../handles_2022-01-30_10-29-11.109727.json | 3 + ...ldrmodules_2022-01-30_10-29-06.239801.json | 3 + .../netscan_2022-01-30_10-29-13.326945.json | 3 + .../pslist_2022-01-30_10-29-05.078376.json | 3 + ...threadlist_2022-01-30_10-29-08.155559.json | 3 + .../vadinfo_2022-01-30_10-29-09.270718.json | 3 + .../cmdline_2022-01-30_10-29-15.720796.json | 3 + .../envars_2022-01-30_10-29-16.379235.json | 3 + .../handles_2022-01-30_10-29-19.812454.json | 3 + ...ldrmodules_2022-01-30_10-29-15.085705.json | 3 + .../netscan_2022-01-30_10-29-21.973472.json | 3 + .../pslist_2022-01-30_10-29-13.905168.json | 3 + ...threadlist_2022-01-30_10-29-16.995979.json | 3 + .../vadinfo_2022-01-30_10-29-18.100118.json | 3 + .../cmdline_2022-01-30_10-29-24.261859.json | 3 + .../envars_2022-01-30_10-29-24.903765.json | 3 + .../handles_2022-01-30_10-29-28.334566.json | 3 + ...ldrmodules_2022-01-30_10-29-23.657524.json | 3 + .../netscan_2022-01-30_10-29-30.502509.json | 3 + .../pslist_2022-01-30_10-29-22.509572.json | 3 + ...threadlist_2022-01-30_10-29-25.489737.json | 3 + .../vadinfo_2022-01-30_10-29-26.575787.json | 3 + .../cmdline_2022-01-30_10-29-32.887391.json | 3 + .../envars_2022-01-30_10-29-33.542631.json | 3 + .../handles_2022-01-30_10-29-37.022475.json | 3 + ...ldrmodules_2022-01-30_10-29-32.247923.json | 3 + .../netscan_2022-01-30_10-29-39.392756.json | 3 + .../pslist_2022-01-30_10-29-31.060358.json | 3 + ...threadlist_2022-01-30_10-29-34.161278.json | 3 + .../vadinfo_2022-01-30_10-29-35.270936.json | 3 + .../cmdline_2022-01-30_10-29-41.839842.json | 3 + .../envars_2022-01-30_10-29-42.527012.json | 3 + .../handles_2022-01-30_10-29-45.936013.json | 3 + ...ldrmodules_2022-01-30_10-29-41.162720.json | 3 + .../netscan_2022-01-30_10-29-48.244897.json | 3 + .../pslist_2022-01-30_10-29-39.961317.json | 3 + ...threadlist_2022-01-30_10-29-43.138494.json | 3 + .../vadinfo_2022-01-30_10-29-44.200445.json | 3 + .../cmdline_2022-01-30_10-29-50.599912.json | 3 + .../envars_2022-01-30_10-29-51.238045.json | 3 + ...ldrmodules_2022-01-30_10-29-49.958411.json | 3 + .../pslist_2022-01-30_10-29-48.803574.json | 3 + ...threadlist_2022-01-30_10-29-51.807523.json | 3 + .../vadinfo_2022-01-30_10-29-52.907614.json | 3 + .../cmdline_2022-01-30_10-26-17.919268.json | 3 + .../envars_2022-01-30_10-26-18.597661.json | 3 + .../handles_2022-01-30_10-26-22.247282.json | 3 + ...ldrmodules_2022-01-30_10-26-17.264136.json | 3 + .../netscan_2022-01-30_10-26-24.440847.json | 3 + .../pslist_2022-01-30_10-26-16.067152.json | 3 + ...threadlist_2022-01-30_10-26-19.228078.json | 3 + .../vadinfo_2022-01-30_10-26-20.383782.json | 3 + .../cmdline_2022-01-30_10-26-26.868778.json | 3 + .../envars_2022-01-30_10-26-27.548527.json | 3 + .../handles_2022-01-30_10-26-31.131620.json | 3 + ...ldrmodules_2022-01-30_10-26-26.221177.json | 3 + .../netscan_2022-01-30_10-26-33.571114.json | 3 + .../pslist_2022-01-30_10-26-24.979730.json | 3 + ...threadlist_2022-01-30_10-26-28.170767.json | 3 + .../vadinfo_2022-01-30_10-26-29.318737.json | 3 + .../cmdline_2022-01-30_10-26-36.033256.json | 3 + .../envars_2022-01-30_10-26-36.659912.json | 3 + .../handles_2022-01-30_10-26-40.260473.json | 3 + ...ldrmodules_2022-01-30_10-26-35.368132.json | 3 + .../netscan_2022-01-30_10-26-42.440353.json | 3 + .../pslist_2022-01-30_10-26-34.145862.json | 3 + ...threadlist_2022-01-30_10-26-37.284991.json | 3 + .../vadinfo_2022-01-30_10-26-38.441642.json | 3 + .../cmdline_2022-01-30_10-26-44.783193.json | 3 + .../envars_2022-01-30_10-26-45.454339.json | 3 + .../handles_2022-01-30_10-26-49.032495.json | 3 + ...ldrmodules_2022-01-30_10-26-44.145746.json | 3 + .../netscan_2022-01-30_10-26-51.366634.json | 3 + .../pslist_2022-01-30_10-26-42.971926.json | 3 + ...threadlist_2022-01-30_10-26-46.082396.json | 3 + .../vadinfo_2022-01-30_10-26-47.221952.json | 3 + .../cmdline_2022-01-30_10-26-53.757204.json | 3 + .../envars_2022-01-30_10-26-54.425509.json | 3 + .../handles_2022-01-30_10-26-58.037288.json | 3 + ...ldrmodules_2022-01-30_10-26-53.135374.json | 3 + .../netscan_2022-01-30_10-27-00.347299.json | 3 + .../pslist_2022-01-30_10-26-51.935632.json | 3 + ...threadlist_2022-01-30_10-26-55.050565.json | 3 + .../vadinfo_2022-01-30_10-26-56.199421.json | 3 + .../cmdline_2022-01-30_10-27-02.708217.json | 3 + .../envars_2022-01-30_10-27-03.380959.json | 3 + .../handles_2022-01-30_10-27-06.923742.json | 3 + ...ldrmodules_2022-01-30_10-27-02.100283.json | 3 + .../netscan_2022-01-30_10-27-09.103815.json | 3 + .../pslist_2022-01-30_10-27-00.909801.json | 3 + ...threadlist_2022-01-30_10-27-04.025664.json | 3 + .../vadinfo_2022-01-30_10-27-05.175861.json | 3 + .../cmdline_2022-01-30_10-27-11.397004.json | 3 + .../envars_2022-01-30_10-27-12.030292.json | 3 + .../handles_2022-01-30_10-27-15.535996.json | 3 + ...ldrmodules_2022-01-30_10-27-10.782940.json | 3 + .../netscan_2022-01-30_10-27-17.860931.json | 3 + .../pslist_2022-01-30_10-27-09.634635.json | 3 + ...threadlist_2022-01-30_10-27-12.661218.json | 3 + .../vadinfo_2022-01-30_10-27-13.786086.json | 3 + examples/ransomware_detection/README.md | 109 +++ .../common/data_models.py | 56 ++ .../common/feature_constants.py | 52 ++ .../common/feature_extractor.py | 623 ++++++++++++++++++ .../config/ransomware_detection.yaml | 173 +++++ .../ransomw-model-long-rf/1/checkpoint.tl | Bin 0 -> 1004264 bytes .../models/ransomw-model-long-rf/config.pbtxt | 52 ++ .../ransomw-model-medium-rf/1/checkpoint.tl | Bin 0 -> 1670024 bytes .../ransomw-model-medium-rf/config.pbtxt | 52 ++ .../ransomw-model-short-rf/1/checkpoint.tl | Bin 0 -> 2075784 bytes .../ransomw-model-short-rf/config.pbtxt | 52 ++ examples/ransomware_detection/run.py | 256 +++++++ .../stages/create_features.py | 169 +++++ .../stages/preprocessing.py | 193 ++++++ 229 files changed, 2430 insertions(+), 1 deletion(-) create mode 100644 examples/data/appshield/Heur/snapshot-1/cmdline_2022-01-30_10-26-00.310528.json create mode 100644 examples/data/appshield/Heur/snapshot-1/envars_2022-01-30_10-26-01.017250.json create mode 100644 examples/data/appshield/Heur/snapshot-1/handles_2022-01-30_10-26-04.570268.json create mode 100644 examples/data/appshield/Heur/snapshot-1/ldrmodules_2022-01-30_10-25-59.669333.json create mode 100644 examples/data/appshield/Heur/snapshot-1/netscan_2022-01-30_10-26-06.701633.json create mode 100644 examples/data/appshield/Heur/snapshot-1/pslist_2022-01-30_10-25-58.438453.json create mode 100644 examples/data/appshield/Heur/snapshot-1/threadlist_2022-01-30_10-26-01.670391.json create mode 100644 examples/data/appshield/Heur/snapshot-1/vadinfo_2022-01-30_10-26-02.785396.json create mode 100644 examples/data/appshield/Heur/snapshot-10/cmdline_2022-01-30_10-27-20.192845.json create mode 100644 examples/data/appshield/Heur/snapshot-10/envars_2022-01-30_10-27-20.824781.json create mode 100644 examples/data/appshield/Heur/snapshot-10/handles_2022-01-30_10-27-24.351073.json create mode 100644 examples/data/appshield/Heur/snapshot-10/ldrmodules_2022-01-30_10-27-19.577763.json create mode 100644 examples/data/appshield/Heur/snapshot-10/netscan_2022-01-30_10-27-26.651085.json create mode 100644 examples/data/appshield/Heur/snapshot-10/pslist_2022-01-30_10-27-18.426303.json create mode 100644 examples/data/appshield/Heur/snapshot-10/threadlist_2022-01-30_10-27-21.436988.json create mode 100644 examples/data/appshield/Heur/snapshot-10/vadinfo_2022-01-30_10-27-22.554357.json create mode 100644 examples/data/appshield/Heur/snapshot-11/cmdline_2022-01-30_10-27-29.034400.json create mode 100644 examples/data/appshield/Heur/snapshot-11/envars_2022-01-30_10-27-29.696475.json create mode 100644 examples/data/appshield/Heur/snapshot-11/handles_2022-01-30_10-27-33.184160.json create mode 100644 examples/data/appshield/Heur/snapshot-11/ldrmodules_2022-01-30_10-27-28.419808.json create mode 100644 examples/data/appshield/Heur/snapshot-11/netscan_2022-01-30_10-27-35.412059.json create mode 100644 examples/data/appshield/Heur/snapshot-11/pslist_2022-01-30_10-27-27.222779.json create mode 100644 examples/data/appshield/Heur/snapshot-11/threadlist_2022-01-30_10-27-30.310404.json create mode 100644 examples/data/appshield/Heur/snapshot-11/vadinfo_2022-01-30_10-27-31.425348.json create mode 100644 examples/data/appshield/Heur/snapshot-12/cmdline_2022-01-30_10-27-37.852093.json create mode 100644 examples/data/appshield/Heur/snapshot-12/envars_2022-01-30_10-27-38.523393.json create mode 100644 examples/data/appshield/Heur/snapshot-12/handles_2022-01-30_10-27-42.025544.json create mode 100644 examples/data/appshield/Heur/snapshot-12/ldrmodules_2022-01-30_10-27-37.207563.json create mode 100644 examples/data/appshield/Heur/snapshot-12/netscan_2022-01-30_10-27-44.388284.json create mode 100644 examples/data/appshield/Heur/snapshot-12/pslist_2022-01-30_10-27-36.010670.json create mode 100644 examples/data/appshield/Heur/snapshot-12/threadlist_2022-01-30_10-27-39.142386.json create mode 100644 examples/data/appshield/Heur/snapshot-12/vadinfo_2022-01-30_10-27-40.256811.json create mode 100644 examples/data/appshield/Heur/snapshot-13/cmdline_2022-01-30_10-27-46.768326.json create mode 100644 examples/data/appshield/Heur/snapshot-13/envars_2022-01-30_10-27-47.392028.json create mode 100644 examples/data/appshield/Heur/snapshot-13/handles_2022-01-30_10-27-50.868866.json create mode 100644 examples/data/appshield/Heur/snapshot-13/ldrmodules_2022-01-30_10-27-46.119774.json create mode 100644 examples/data/appshield/Heur/snapshot-13/netscan_2022-01-30_10-27-53.140515.json create mode 100644 examples/data/appshield/Heur/snapshot-13/pslist_2022-01-30_10-27-44.942274.json create mode 100644 examples/data/appshield/Heur/snapshot-13/threadlist_2022-01-30_10-27-48.010827.json create mode 100644 examples/data/appshield/Heur/snapshot-13/vadinfo_2022-01-30_10-27-49.124816.json create mode 100644 examples/data/appshield/Heur/snapshot-14/cmdline_2022-01-30_10-27-55.462305.json create mode 100644 examples/data/appshield/Heur/snapshot-14/envars_2022-01-30_10-27-56.125016.json create mode 100644 examples/data/appshield/Heur/snapshot-14/handles_2022-01-30_10-27-59.646114.json create mode 100644 examples/data/appshield/Heur/snapshot-14/ldrmodules_2022-01-30_10-27-54.849536.json create mode 100644 examples/data/appshield/Heur/snapshot-14/netscan_2022-01-30_10-28-01.868302.json create mode 100644 examples/data/appshield/Heur/snapshot-14/pslist_2022-01-30_10-27-53.703266.json create mode 100644 examples/data/appshield/Heur/snapshot-14/threadlist_2022-01-30_10-27-56.742443.json create mode 100644 examples/data/appshield/Heur/snapshot-14/vadinfo_2022-01-30_10-27-57.840927.json create mode 100644 examples/data/appshield/Heur/snapshot-15/cmdline_2022-01-30_10-28-04.272964.json create mode 100644 examples/data/appshield/Heur/snapshot-15/envars_2022-01-30_10-28-04.953163.json create mode 100644 examples/data/appshield/Heur/snapshot-15/handles_2022-01-30_10-28-08.441869.json create mode 100644 examples/data/appshield/Heur/snapshot-15/ldrmodules_2022-01-30_10-28-03.626127.json create mode 100644 examples/data/appshield/Heur/snapshot-15/netscan_2022-01-30_10-28-10.736493.json create mode 100644 examples/data/appshield/Heur/snapshot-15/pslist_2022-01-30_10-28-02.434170.json create mode 100644 examples/data/appshield/Heur/snapshot-15/threadlist_2022-01-30_10-28-05.546145.json create mode 100644 examples/data/appshield/Heur/snapshot-15/vadinfo_2022-01-30_10-28-06.685749.json create mode 100644 examples/data/appshield/Heur/snapshot-16/cmdline_2022-01-30_10-28-13.170175.json create mode 100644 examples/data/appshield/Heur/snapshot-16/envars_2022-01-30_10-28-13.853475.json create mode 100644 examples/data/appshield/Heur/snapshot-16/handles_2022-01-30_10-28-17.421832.json create mode 100644 examples/data/appshield/Heur/snapshot-16/ldrmodules_2022-01-30_10-28-12.533518.json create mode 100644 examples/data/appshield/Heur/snapshot-16/netscan_2022-01-30_10-28-19.820209.json create mode 100644 examples/data/appshield/Heur/snapshot-16/pslist_2022-01-30_10-28-11.304689.json create mode 100644 examples/data/appshield/Heur/snapshot-16/threadlist_2022-01-30_10-28-14.474304.json create mode 100644 examples/data/appshield/Heur/snapshot-16/vadinfo_2022-01-30_10-28-15.624847.json create mode 100644 examples/data/appshield/Heur/snapshot-17/cmdline_2022-01-30_10-28-22.279820.json create mode 100644 examples/data/appshield/Heur/snapshot-17/envars_2022-01-30_10-28-22.961828.json create mode 100644 examples/data/appshield/Heur/snapshot-17/handles_2022-01-30_10-28-26.556573.json create mode 100644 examples/data/appshield/Heur/snapshot-17/ldrmodules_2022-01-30_10-28-21.610465.json create mode 100644 examples/data/appshield/Heur/snapshot-17/netscan_2022-01-30_10-28-28.935730.json create mode 100644 examples/data/appshield/Heur/snapshot-17/pslist_2022-01-30_10-28-20.381565.json create mode 100644 examples/data/appshield/Heur/snapshot-17/threadlist_2022-01-30_10-28-23.581147.json create mode 100644 examples/data/appshield/Heur/snapshot-17/vadinfo_2022-01-30_10-28-24.735272.json create mode 100644 examples/data/appshield/Heur/snapshot-18/cmdline_2022-01-30_10-28-31.364334.json create mode 100644 examples/data/appshield/Heur/snapshot-18/envars_2022-01-30_10-28-32.009314.json create mode 100644 examples/data/appshield/Heur/snapshot-18/handles_2022-01-30_10-28-35.577547.json create mode 100644 examples/data/appshield/Heur/snapshot-18/ldrmodules_2022-01-30_10-28-30.714518.json create mode 100644 examples/data/appshield/Heur/snapshot-18/netscan_2022-01-30_10-28-37.943351.json create mode 100644 examples/data/appshield/Heur/snapshot-18/pslist_2022-01-30_10-28-29.495682.json create mode 100644 examples/data/appshield/Heur/snapshot-18/threadlist_2022-01-30_10-28-32.626539.json create mode 100644 examples/data/appshield/Heur/snapshot-18/vadinfo_2022-01-30_10-28-33.771251.json create mode 100644 examples/data/appshield/Heur/snapshot-19/cmdline_2022-01-30_10-28-40.413905.json create mode 100644 examples/data/appshield/Heur/snapshot-19/envars_2022-01-30_10-28-41.081318.json create mode 100644 examples/data/appshield/Heur/snapshot-19/handles_2022-01-30_10-28-44.565776.json create mode 100644 examples/data/appshield/Heur/snapshot-19/ldrmodules_2022-01-30_10-28-39.771264.json create mode 100644 examples/data/appshield/Heur/snapshot-19/netscan_2022-01-30_10-28-46.868661.json create mode 100644 examples/data/appshield/Heur/snapshot-19/pslist_2022-01-30_10-28-38.532482.json create mode 100644 examples/data/appshield/Heur/snapshot-19/threadlist_2022-01-30_10-28-41.704092.json create mode 100644 examples/data/appshield/Heur/snapshot-19/vadinfo_2022-01-30_10-28-42.816266.json create mode 100644 examples/data/appshield/Heur/snapshot-2/cmdline_2022-01-30_10-26-09.063587.json create mode 100644 examples/data/appshield/Heur/snapshot-2/envars_2022-01-30_10-26-09.741878.json create mode 100644 examples/data/appshield/Heur/snapshot-2/handles_2022-01-30_10-26-13.348160.json create mode 100644 examples/data/appshield/Heur/snapshot-2/ldrmodules_2022-01-30_10-26-08.416585.json create mode 100644 examples/data/appshield/Heur/snapshot-2/netscan_2022-01-30_10-26-15.507886.json create mode 100644 examples/data/appshield/Heur/snapshot-2/pslist_2022-01-30_10-26-07.234099.json create mode 100644 examples/data/appshield/Heur/snapshot-2/threadlist_2022-01-30_10-26-10.364669.json create mode 100644 examples/data/appshield/Heur/snapshot-2/vadinfo_2022-01-30_10-26-11.510219.json create mode 100644 examples/data/appshield/Heur/snapshot-20/cmdline_2022-01-30_10-28-49.250538.json create mode 100644 examples/data/appshield/Heur/snapshot-20/envars_2022-01-30_10-28-49.915433.json create mode 100644 examples/data/appshield/Heur/snapshot-20/handles_2022-01-30_10-28-53.341373.json create mode 100644 examples/data/appshield/Heur/snapshot-20/ldrmodules_2022-01-30_10-28-48.612563.json create mode 100644 examples/data/appshield/Heur/snapshot-20/netscan_2022-01-30_10-28-55.730970.json create mode 100644 examples/data/appshield/Heur/snapshot-20/pslist_2022-01-30_10-28-47.433187.json create mode 100644 examples/data/appshield/Heur/snapshot-20/threadlist_2022-01-30_10-28-50.543176.json create mode 100644 examples/data/appshield/Heur/snapshot-20/vadinfo_2022-01-30_10-28-51.612010.json create mode 100644 examples/data/appshield/Heur/snapshot-21/cmdline_2022-01-30_10-28-58.110831.json create mode 100644 examples/data/appshield/Heur/snapshot-21/envars_2022-01-30_10-28-58.780398.json create mode 100644 examples/data/appshield/Heur/snapshot-21/handles_2022-01-30_10-29-02.202932.json create mode 100644 examples/data/appshield/Heur/snapshot-21/ldrmodules_2022-01-30_10-28-57.472183.json create mode 100644 examples/data/appshield/Heur/snapshot-21/netscan_2022-01-30_10-29-04.510655.json create mode 100644 examples/data/appshield/Heur/snapshot-21/pslist_2022-01-30_10-28-56.297185.json create mode 100644 examples/data/appshield/Heur/snapshot-21/threadlist_2022-01-30_10-28-59.406043.json create mode 100644 examples/data/appshield/Heur/snapshot-21/vadinfo_2022-01-30_10-29-00.505583.json create mode 100644 examples/data/appshield/Heur/snapshot-22/cmdline_2022-01-30_10-29-06.870196.json create mode 100644 examples/data/appshield/Heur/snapshot-22/envars_2022-01-30_10-29-07.543314.json create mode 100644 examples/data/appshield/Heur/snapshot-22/handles_2022-01-30_10-29-11.109727.json create mode 100644 examples/data/appshield/Heur/snapshot-22/ldrmodules_2022-01-30_10-29-06.239801.json create mode 100644 examples/data/appshield/Heur/snapshot-22/netscan_2022-01-30_10-29-13.326945.json create mode 100644 examples/data/appshield/Heur/snapshot-22/pslist_2022-01-30_10-29-05.078376.json create mode 100644 examples/data/appshield/Heur/snapshot-22/threadlist_2022-01-30_10-29-08.155559.json create mode 100644 examples/data/appshield/Heur/snapshot-22/vadinfo_2022-01-30_10-29-09.270718.json create mode 100644 examples/data/appshield/Heur/snapshot-23/cmdline_2022-01-30_10-29-15.720796.json create mode 100644 examples/data/appshield/Heur/snapshot-23/envars_2022-01-30_10-29-16.379235.json create mode 100644 examples/data/appshield/Heur/snapshot-23/handles_2022-01-30_10-29-19.812454.json create mode 100644 examples/data/appshield/Heur/snapshot-23/ldrmodules_2022-01-30_10-29-15.085705.json create mode 100644 examples/data/appshield/Heur/snapshot-23/netscan_2022-01-30_10-29-21.973472.json create mode 100644 examples/data/appshield/Heur/snapshot-23/pslist_2022-01-30_10-29-13.905168.json create mode 100644 examples/data/appshield/Heur/snapshot-23/threadlist_2022-01-30_10-29-16.995979.json create mode 100644 examples/data/appshield/Heur/snapshot-23/vadinfo_2022-01-30_10-29-18.100118.json create mode 100644 examples/data/appshield/Heur/snapshot-24/cmdline_2022-01-30_10-29-24.261859.json create mode 100644 examples/data/appshield/Heur/snapshot-24/envars_2022-01-30_10-29-24.903765.json create mode 100644 examples/data/appshield/Heur/snapshot-24/handles_2022-01-30_10-29-28.334566.json create mode 100644 examples/data/appshield/Heur/snapshot-24/ldrmodules_2022-01-30_10-29-23.657524.json create mode 100644 examples/data/appshield/Heur/snapshot-24/netscan_2022-01-30_10-29-30.502509.json create mode 100644 examples/data/appshield/Heur/snapshot-24/pslist_2022-01-30_10-29-22.509572.json create mode 100644 examples/data/appshield/Heur/snapshot-24/threadlist_2022-01-30_10-29-25.489737.json create mode 100644 examples/data/appshield/Heur/snapshot-24/vadinfo_2022-01-30_10-29-26.575787.json create mode 100644 examples/data/appshield/Heur/snapshot-25/cmdline_2022-01-30_10-29-32.887391.json create mode 100644 examples/data/appshield/Heur/snapshot-25/envars_2022-01-30_10-29-33.542631.json create mode 100644 examples/data/appshield/Heur/snapshot-25/handles_2022-01-30_10-29-37.022475.json create mode 100644 examples/data/appshield/Heur/snapshot-25/ldrmodules_2022-01-30_10-29-32.247923.json create mode 100644 examples/data/appshield/Heur/snapshot-25/netscan_2022-01-30_10-29-39.392756.json create mode 100644 examples/data/appshield/Heur/snapshot-25/pslist_2022-01-30_10-29-31.060358.json create mode 100644 examples/data/appshield/Heur/snapshot-25/threadlist_2022-01-30_10-29-34.161278.json create mode 100644 examples/data/appshield/Heur/snapshot-25/vadinfo_2022-01-30_10-29-35.270936.json create mode 100644 examples/data/appshield/Heur/snapshot-26/cmdline_2022-01-30_10-29-41.839842.json create mode 100644 examples/data/appshield/Heur/snapshot-26/envars_2022-01-30_10-29-42.527012.json create mode 100644 examples/data/appshield/Heur/snapshot-26/handles_2022-01-30_10-29-45.936013.json create mode 100644 examples/data/appshield/Heur/snapshot-26/ldrmodules_2022-01-30_10-29-41.162720.json create mode 100644 examples/data/appshield/Heur/snapshot-26/netscan_2022-01-30_10-29-48.244897.json create mode 100644 examples/data/appshield/Heur/snapshot-26/pslist_2022-01-30_10-29-39.961317.json create mode 100644 examples/data/appshield/Heur/snapshot-26/threadlist_2022-01-30_10-29-43.138494.json create mode 100644 examples/data/appshield/Heur/snapshot-26/vadinfo_2022-01-30_10-29-44.200445.json create mode 100644 examples/data/appshield/Heur/snapshot-27/cmdline_2022-01-30_10-29-50.599912.json create mode 100644 examples/data/appshield/Heur/snapshot-27/envars_2022-01-30_10-29-51.238045.json create mode 100644 examples/data/appshield/Heur/snapshot-27/ldrmodules_2022-01-30_10-29-49.958411.json create mode 100644 examples/data/appshield/Heur/snapshot-27/pslist_2022-01-30_10-29-48.803574.json create mode 100644 examples/data/appshield/Heur/snapshot-27/threadlist_2022-01-30_10-29-51.807523.json create mode 100644 examples/data/appshield/Heur/snapshot-27/vadinfo_2022-01-30_10-29-52.907614.json create mode 100644 examples/data/appshield/Heur/snapshot-3/cmdline_2022-01-30_10-26-17.919268.json create mode 100644 examples/data/appshield/Heur/snapshot-3/envars_2022-01-30_10-26-18.597661.json create mode 100644 examples/data/appshield/Heur/snapshot-3/handles_2022-01-30_10-26-22.247282.json create mode 100644 examples/data/appshield/Heur/snapshot-3/ldrmodules_2022-01-30_10-26-17.264136.json create mode 100644 examples/data/appshield/Heur/snapshot-3/netscan_2022-01-30_10-26-24.440847.json create mode 100644 examples/data/appshield/Heur/snapshot-3/pslist_2022-01-30_10-26-16.067152.json create mode 100644 examples/data/appshield/Heur/snapshot-3/threadlist_2022-01-30_10-26-19.228078.json create mode 100644 examples/data/appshield/Heur/snapshot-3/vadinfo_2022-01-30_10-26-20.383782.json create mode 100644 examples/data/appshield/Heur/snapshot-4/cmdline_2022-01-30_10-26-26.868778.json create mode 100644 examples/data/appshield/Heur/snapshot-4/envars_2022-01-30_10-26-27.548527.json create mode 100644 examples/data/appshield/Heur/snapshot-4/handles_2022-01-30_10-26-31.131620.json create mode 100644 examples/data/appshield/Heur/snapshot-4/ldrmodules_2022-01-30_10-26-26.221177.json create mode 100644 examples/data/appshield/Heur/snapshot-4/netscan_2022-01-30_10-26-33.571114.json create mode 100644 examples/data/appshield/Heur/snapshot-4/pslist_2022-01-30_10-26-24.979730.json create mode 100644 examples/data/appshield/Heur/snapshot-4/threadlist_2022-01-30_10-26-28.170767.json create mode 100644 examples/data/appshield/Heur/snapshot-4/vadinfo_2022-01-30_10-26-29.318737.json create mode 100644 examples/data/appshield/Heur/snapshot-5/cmdline_2022-01-30_10-26-36.033256.json create mode 100644 examples/data/appshield/Heur/snapshot-5/envars_2022-01-30_10-26-36.659912.json create mode 100644 examples/data/appshield/Heur/snapshot-5/handles_2022-01-30_10-26-40.260473.json create mode 100644 examples/data/appshield/Heur/snapshot-5/ldrmodules_2022-01-30_10-26-35.368132.json create mode 100644 examples/data/appshield/Heur/snapshot-5/netscan_2022-01-30_10-26-42.440353.json create mode 100644 examples/data/appshield/Heur/snapshot-5/pslist_2022-01-30_10-26-34.145862.json create mode 100644 examples/data/appshield/Heur/snapshot-5/threadlist_2022-01-30_10-26-37.284991.json create mode 100644 examples/data/appshield/Heur/snapshot-5/vadinfo_2022-01-30_10-26-38.441642.json create mode 100644 examples/data/appshield/Heur/snapshot-6/cmdline_2022-01-30_10-26-44.783193.json create mode 100644 examples/data/appshield/Heur/snapshot-6/envars_2022-01-30_10-26-45.454339.json create mode 100644 examples/data/appshield/Heur/snapshot-6/handles_2022-01-30_10-26-49.032495.json create mode 100644 examples/data/appshield/Heur/snapshot-6/ldrmodules_2022-01-30_10-26-44.145746.json create mode 100644 examples/data/appshield/Heur/snapshot-6/netscan_2022-01-30_10-26-51.366634.json create mode 100644 examples/data/appshield/Heur/snapshot-6/pslist_2022-01-30_10-26-42.971926.json create mode 100644 examples/data/appshield/Heur/snapshot-6/threadlist_2022-01-30_10-26-46.082396.json create mode 100644 examples/data/appshield/Heur/snapshot-6/vadinfo_2022-01-30_10-26-47.221952.json create mode 100644 examples/data/appshield/Heur/snapshot-7/cmdline_2022-01-30_10-26-53.757204.json create mode 100644 examples/data/appshield/Heur/snapshot-7/envars_2022-01-30_10-26-54.425509.json create mode 100644 examples/data/appshield/Heur/snapshot-7/handles_2022-01-30_10-26-58.037288.json create mode 100644 examples/data/appshield/Heur/snapshot-7/ldrmodules_2022-01-30_10-26-53.135374.json create mode 100644 examples/data/appshield/Heur/snapshot-7/netscan_2022-01-30_10-27-00.347299.json create mode 100644 examples/data/appshield/Heur/snapshot-7/pslist_2022-01-30_10-26-51.935632.json create mode 100644 examples/data/appshield/Heur/snapshot-7/threadlist_2022-01-30_10-26-55.050565.json create mode 100644 examples/data/appshield/Heur/snapshot-7/vadinfo_2022-01-30_10-26-56.199421.json create mode 100644 examples/data/appshield/Heur/snapshot-8/cmdline_2022-01-30_10-27-02.708217.json create mode 100644 examples/data/appshield/Heur/snapshot-8/envars_2022-01-30_10-27-03.380959.json create mode 100644 examples/data/appshield/Heur/snapshot-8/handles_2022-01-30_10-27-06.923742.json create mode 100644 examples/data/appshield/Heur/snapshot-8/ldrmodules_2022-01-30_10-27-02.100283.json create mode 100644 examples/data/appshield/Heur/snapshot-8/netscan_2022-01-30_10-27-09.103815.json create mode 100644 examples/data/appshield/Heur/snapshot-8/pslist_2022-01-30_10-27-00.909801.json create mode 100644 examples/data/appshield/Heur/snapshot-8/threadlist_2022-01-30_10-27-04.025664.json create mode 100644 examples/data/appshield/Heur/snapshot-8/vadinfo_2022-01-30_10-27-05.175861.json create mode 100644 examples/data/appshield/Heur/snapshot-9/cmdline_2022-01-30_10-27-11.397004.json create mode 100644 examples/data/appshield/Heur/snapshot-9/envars_2022-01-30_10-27-12.030292.json create mode 100644 examples/data/appshield/Heur/snapshot-9/handles_2022-01-30_10-27-15.535996.json create mode 100644 examples/data/appshield/Heur/snapshot-9/ldrmodules_2022-01-30_10-27-10.782940.json create mode 100644 examples/data/appshield/Heur/snapshot-9/netscan_2022-01-30_10-27-17.860931.json create mode 100644 examples/data/appshield/Heur/snapshot-9/pslist_2022-01-30_10-27-09.634635.json create mode 100644 examples/data/appshield/Heur/snapshot-9/threadlist_2022-01-30_10-27-12.661218.json create mode 100644 examples/data/appshield/Heur/snapshot-9/vadinfo_2022-01-30_10-27-13.786086.json create mode 100644 examples/ransomware_detection/README.md create mode 100644 examples/ransomware_detection/common/data_models.py create mode 100644 examples/ransomware_detection/common/feature_constants.py create mode 100644 examples/ransomware_detection/common/feature_extractor.py create mode 100644 examples/ransomware_detection/config/ransomware_detection.yaml create mode 100644 examples/ransomware_detection/models/ransomw-model-long-rf/1/checkpoint.tl create mode 100644 examples/ransomware_detection/models/ransomw-model-long-rf/config.pbtxt create mode 100644 examples/ransomware_detection/models/ransomw-model-medium-rf/1/checkpoint.tl create mode 100644 examples/ransomware_detection/models/ransomw-model-medium-rf/config.pbtxt create mode 100644 examples/ransomware_detection/models/ransomw-model-short-rf/1/checkpoint.tl create mode 100644 examples/ransomware_detection/models/ransomw-model-short-rf/config.pbtxt create mode 100644 examples/ransomware_detection/run.py create mode 100644 examples/ransomware_detection/stages/create_features.py create mode 100644 examples/ransomware_detection/stages/preprocessing.py diff --git a/.gitattributes b/.gitattributes index a1e6e0394c..a84a297a6b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,4 @@ -examples/data/* filter=lfs diff=lfs merge=lfs -text +examples/data/** filter=lfs diff=lfs merge=lfs -text morpheus/_version.py export-subst morpheus/data/* filter=lfs diff=lfs merge=lfs -text tests/mock_triton_server/payloads/** filter=lfs diff=lfs merge=lfs -text diff --git a/examples/data/appshield/Heur/snapshot-1/cmdline_2022-01-30_10-26-00.310528.json b/examples/data/appshield/Heur/snapshot-1/cmdline_2022-01-30_10-26-00.310528.json new file mode 100644 index 0000000000..664c6e90e1 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-1/cmdline_2022-01-30_10-26-00.310528.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b2ffddf868dde362f66132a00a4dcbeada226fa4545cee738bafdaf53d55af6 +size 10972 diff --git a/examples/data/appshield/Heur/snapshot-1/envars_2022-01-30_10-26-01.017250.json b/examples/data/appshield/Heur/snapshot-1/envars_2022-01-30_10-26-01.017250.json new file mode 100644 index 0000000000..f54c87ca06 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-1/envars_2022-01-30_10-26-01.017250.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a116e7c5d12ebb718d61f64a922d6c14c757b57b2327d26333d8506d03b97477 +size 345989 diff --git a/examples/data/appshield/Heur/snapshot-1/handles_2022-01-30_10-26-04.570268.json b/examples/data/appshield/Heur/snapshot-1/handles_2022-01-30_10-26-04.570268.json new file mode 100644 index 0000000000..b0d44496f9 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-1/handles_2022-01-30_10-26-04.570268.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5841f1a23aacee7d19077e0d6cc0f58b7b6e90b42b5f0c435285bed5b64640c5 +size 2535628 diff --git a/examples/data/appshield/Heur/snapshot-1/ldrmodules_2022-01-30_10-25-59.669333.json b/examples/data/appshield/Heur/snapshot-1/ldrmodules_2022-01-30_10-25-59.669333.json new file mode 100644 index 0000000000..6f5eb71eee --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-1/ldrmodules_2022-01-30_10-25-59.669333.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d251b4fee088dc3cf13bb65db1261fd587df11f5cdf2198779c20f891ebf388c +size 627744 diff --git a/examples/data/appshield/Heur/snapshot-1/netscan_2022-01-30_10-26-06.701633.json b/examples/data/appshield/Heur/snapshot-1/netscan_2022-01-30_10-26-06.701633.json new file mode 100644 index 0000000000..6210ee8448 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-1/netscan_2022-01-30_10-26-06.701633.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d998604596aa635cfd2591a96ec540972411f06adf159580d5be166d6a76a7ed +size 9729 diff --git a/examples/data/appshield/Heur/snapshot-1/pslist_2022-01-30_10-25-58.438453.json b/examples/data/appshield/Heur/snapshot-1/pslist_2022-01-30_10-25-58.438453.json new file mode 100644 index 0000000000..dbc7bf132d --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-1/pslist_2022-01-30_10-25-58.438453.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67bb6b7e9dc4b989ade430bb59d9205de61cf9cee2b11e214b73e204406c5c0a +size 12803 diff --git a/examples/data/appshield/Heur/snapshot-1/threadlist_2022-01-30_10-26-01.670391.json b/examples/data/appshield/Heur/snapshot-1/threadlist_2022-01-30_10-26-01.670391.json new file mode 100644 index 0000000000..466a595a18 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-1/threadlist_2022-01-30_10-26-01.670391.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4af3e07fa79f04556963c344b40dd9128cd6c868440e01190a885061992c2c36 +size 75525 diff --git a/examples/data/appshield/Heur/snapshot-1/vadinfo_2022-01-30_10-26-02.785396.json b/examples/data/appshield/Heur/snapshot-1/vadinfo_2022-01-30_10-26-02.785396.json new file mode 100644 index 0000000000..e4728f838b --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-1/vadinfo_2022-01-30_10-26-02.785396.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:124f403e710d0f7b3e98a87d57a6b002b8a32d1ab931a3b42335d5ff04fd78d1 +size 1761098 diff --git a/examples/data/appshield/Heur/snapshot-10/cmdline_2022-01-30_10-27-20.192845.json b/examples/data/appshield/Heur/snapshot-10/cmdline_2022-01-30_10-27-20.192845.json new file mode 100644 index 0000000000..e5f54e5aa6 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-10/cmdline_2022-01-30_10-27-20.192845.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de6a7365dd7f4fa85396545f1e77891d72262574c42d73b76a8866c27bd73fac +size 9993 diff --git a/examples/data/appshield/Heur/snapshot-10/envars_2022-01-30_10-27-20.824781.json b/examples/data/appshield/Heur/snapshot-10/envars_2022-01-30_10-27-20.824781.json new file mode 100644 index 0000000000..33c2cc561a --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-10/envars_2022-01-30_10-27-20.824781.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:edcb842776ca7ab0d69ad95711e526c4977142618c022748f143b45b61021586 +size 298572 diff --git a/examples/data/appshield/Heur/snapshot-10/handles_2022-01-30_10-27-24.351073.json b/examples/data/appshield/Heur/snapshot-10/handles_2022-01-30_10-27-24.351073.json new file mode 100644 index 0000000000..448ad3adb8 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-10/handles_2022-01-30_10-27-24.351073.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0dbe07026f6a3c76369e0304767ec68fe2b87485492e9d2f70eb9e8944c115b2 +size 2507677 diff --git a/examples/data/appshield/Heur/snapshot-10/ldrmodules_2022-01-30_10-27-19.577763.json b/examples/data/appshield/Heur/snapshot-10/ldrmodules_2022-01-30_10-27-19.577763.json new file mode 100644 index 0000000000..28b4b9d351 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-10/ldrmodules_2022-01-30_10-27-19.577763.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11a5d9b216a15b72d5df3038cbbd858c642a2d38665439ff1c3d3680f71085e3 +size 605139 diff --git a/examples/data/appshield/Heur/snapshot-10/netscan_2022-01-30_10-27-26.651085.json b/examples/data/appshield/Heur/snapshot-10/netscan_2022-01-30_10-27-26.651085.json new file mode 100644 index 0000000000..d849f17fe9 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-10/netscan_2022-01-30_10-27-26.651085.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a74e3e301356a2d3b55278f44f94ab22de55698ccd03ea877bb4335cddcf169 +size 11532 diff --git a/examples/data/appshield/Heur/snapshot-10/pslist_2022-01-30_10-27-18.426303.json b/examples/data/appshield/Heur/snapshot-10/pslist_2022-01-30_10-27-18.426303.json new file mode 100644 index 0000000000..6f1d2fdf1f --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-10/pslist_2022-01-30_10-27-18.426303.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f1fb72bf18e8507a0adfc3c94634d6d7f31fa0eae445009db95abf1ebf80e2b +size 11782 diff --git a/examples/data/appshield/Heur/snapshot-10/threadlist_2022-01-30_10-27-21.436988.json b/examples/data/appshield/Heur/snapshot-10/threadlist_2022-01-30_10-27-21.436988.json new file mode 100644 index 0000000000..b44c74edaa --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-10/threadlist_2022-01-30_10-27-21.436988.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:079676114d19c6c21d027e4a4f90ec2fc09d7a5ed9f43a661fe03a06f9145c38 +size 65136 diff --git a/examples/data/appshield/Heur/snapshot-10/vadinfo_2022-01-30_10-27-22.554357.json b/examples/data/appshield/Heur/snapshot-10/vadinfo_2022-01-30_10-27-22.554357.json new file mode 100644 index 0000000000..dc38118670 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-10/vadinfo_2022-01-30_10-27-22.554357.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7dcd5fbb1bde15ab846c154bae04f98c95900440454fdb075766c04b84c00923 +size 1736682 diff --git a/examples/data/appshield/Heur/snapshot-11/cmdline_2022-01-30_10-27-29.034400.json b/examples/data/appshield/Heur/snapshot-11/cmdline_2022-01-30_10-27-29.034400.json new file mode 100644 index 0000000000..e5f54e5aa6 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-11/cmdline_2022-01-30_10-27-29.034400.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de6a7365dd7f4fa85396545f1e77891d72262574c42d73b76a8866c27bd73fac +size 9993 diff --git a/examples/data/appshield/Heur/snapshot-11/envars_2022-01-30_10-27-29.696475.json b/examples/data/appshield/Heur/snapshot-11/envars_2022-01-30_10-27-29.696475.json new file mode 100644 index 0000000000..940240cf1a --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-11/envars_2022-01-30_10-27-29.696475.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:83d4ccca085b654fbb42bf39b63d9827fe923d59b30877690f05d7e47f6519ff +size 298572 diff --git a/examples/data/appshield/Heur/snapshot-11/handles_2022-01-30_10-27-33.184160.json b/examples/data/appshield/Heur/snapshot-11/handles_2022-01-30_10-27-33.184160.json new file mode 100644 index 0000000000..1b4506d3ed --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-11/handles_2022-01-30_10-27-33.184160.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0fd9eadfaa3cda995a2be65b68387fb4798b2ea4fdadaffbcef89f9ccc9d5d46 +size 2491256 diff --git a/examples/data/appshield/Heur/snapshot-11/ldrmodules_2022-01-30_10-27-28.419808.json b/examples/data/appshield/Heur/snapshot-11/ldrmodules_2022-01-30_10-27-28.419808.json new file mode 100644 index 0000000000..48cc79276a --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-11/ldrmodules_2022-01-30_10-27-28.419808.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f886dd81e966ce0dae8b1db46c892257e3335e85c653aa9702b01261b78b0e13 +size 599801 diff --git a/examples/data/appshield/Heur/snapshot-11/netscan_2022-01-30_10-27-35.412059.json b/examples/data/appshield/Heur/snapshot-11/netscan_2022-01-30_10-27-35.412059.json new file mode 100644 index 0000000000..670aa32ee1 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-11/netscan_2022-01-30_10-27-35.412059.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38859e17dada7556221d70c136358e1cf17cde0ba5e982f466f2aa6eed2a528f +size 11532 diff --git a/examples/data/appshield/Heur/snapshot-11/pslist_2022-01-30_10-27-27.222779.json b/examples/data/appshield/Heur/snapshot-11/pslist_2022-01-30_10-27-27.222779.json new file mode 100644 index 0000000000..dfd6f7a235 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-11/pslist_2022-01-30_10-27-27.222779.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a9985c9ce99e0f0dcb938cdc41c085dd38b017aedea8f36fb940d7a83a59b52 +size 11669 diff --git a/examples/data/appshield/Heur/snapshot-11/threadlist_2022-01-30_10-27-30.310404.json b/examples/data/appshield/Heur/snapshot-11/threadlist_2022-01-30_10-27-30.310404.json new file mode 100644 index 0000000000..3df43fd9a8 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-11/threadlist_2022-01-30_10-27-30.310404.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5cc0e393996076240c2ecd052a6d6aa0f0feb9b54be6556733827a788817e983 +size 65264 diff --git a/examples/data/appshield/Heur/snapshot-11/vadinfo_2022-01-30_10-27-31.425348.json b/examples/data/appshield/Heur/snapshot-11/vadinfo_2022-01-30_10-27-31.425348.json new file mode 100644 index 0000000000..20798dfe02 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-11/vadinfo_2022-01-30_10-27-31.425348.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b9b017b9b0794b39f80d0abed64c623abe2ccd38dec95c7733c40d7212d9e8e +size 1725871 diff --git a/examples/data/appshield/Heur/snapshot-12/cmdline_2022-01-30_10-27-37.852093.json b/examples/data/appshield/Heur/snapshot-12/cmdline_2022-01-30_10-27-37.852093.json new file mode 100644 index 0000000000..c58fe8956e --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-12/cmdline_2022-01-30_10-27-37.852093.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a93cc04a99b6788d615836da0eb20fb4bb62c3fcdbe89e8764f63a3b0730432e +size 9882 diff --git a/examples/data/appshield/Heur/snapshot-12/envars_2022-01-30_10-27-38.523393.json b/examples/data/appshield/Heur/snapshot-12/envars_2022-01-30_10-27-38.523393.json new file mode 100644 index 0000000000..4579c49be1 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-12/envars_2022-01-30_10-27-38.523393.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9df1e03a0713de72011c566cf921c2f0d61aae2c16a3f9fb0b05577735b2a247 +size 295435 diff --git a/examples/data/appshield/Heur/snapshot-12/handles_2022-01-30_10-27-42.025544.json b/examples/data/appshield/Heur/snapshot-12/handles_2022-01-30_10-27-42.025544.json new file mode 100644 index 0000000000..1ca12e45cd --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-12/handles_2022-01-30_10-27-42.025544.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:674d64892799be66c107ac11e43c8b0bec688c989074f25e30317a453e41620a +size 2469857 diff --git a/examples/data/appshield/Heur/snapshot-12/ldrmodules_2022-01-30_10-27-37.207563.json b/examples/data/appshield/Heur/snapshot-12/ldrmodules_2022-01-30_10-27-37.207563.json new file mode 100644 index 0000000000..4e442b3fc2 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-12/ldrmodules_2022-01-30_10-27-37.207563.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c587b8d25a8f0629d0a1b7fe61189a7d22224f473fe9560a4557ff448c9d36b +size 595326 diff --git a/examples/data/appshield/Heur/snapshot-12/netscan_2022-01-30_10-27-44.388284.json b/examples/data/appshield/Heur/snapshot-12/netscan_2022-01-30_10-27-44.388284.json new file mode 100644 index 0000000000..ed672f2f44 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-12/netscan_2022-01-30_10-27-44.388284.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3773f55b1847d742d6f869012e63b76dc42ef42aba82575514a4a90297b7b1c8 +size 11532 diff --git a/examples/data/appshield/Heur/snapshot-12/pslist_2022-01-30_10-27-36.010670.json b/examples/data/appshield/Heur/snapshot-12/pslist_2022-01-30_10-27-36.010670.json new file mode 100644 index 0000000000..c0e2442a1b --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-12/pslist_2022-01-30_10-27-36.010670.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1f60efc5a3b8411ec99ccb96f971bbc2d2e0c61588df00cca8ce510d3c92425 +size 11560 diff --git a/examples/data/appshield/Heur/snapshot-12/threadlist_2022-01-30_10-27-39.142386.json b/examples/data/appshield/Heur/snapshot-12/threadlist_2022-01-30_10-27-39.142386.json new file mode 100644 index 0000000000..7f4db0013f --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-12/threadlist_2022-01-30_10-27-39.142386.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7947101e623085d3b62cb6e3cb71d38214e4a659e45c8d6067f164e0b13ae78a +size 64181 diff --git a/examples/data/appshield/Heur/snapshot-12/vadinfo_2022-01-30_10-27-40.256811.json b/examples/data/appshield/Heur/snapshot-12/vadinfo_2022-01-30_10-27-40.256811.json new file mode 100644 index 0000000000..fb45c73133 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-12/vadinfo_2022-01-30_10-27-40.256811.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb9be1cccdb461c13bda679adc535beb3308af278d79b15b73664413f938402d +size 1720798 diff --git a/examples/data/appshield/Heur/snapshot-13/cmdline_2022-01-30_10-27-46.768326.json b/examples/data/appshield/Heur/snapshot-13/cmdline_2022-01-30_10-27-46.768326.json new file mode 100644 index 0000000000..851f65dede --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-13/cmdline_2022-01-30_10-27-46.768326.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dcb7e07279b1acd297941310248cdc4ae03a49a5355b1f7730a73dd89fcd95fd +size 9882 diff --git a/examples/data/appshield/Heur/snapshot-13/envars_2022-01-30_10-27-47.392028.json b/examples/data/appshield/Heur/snapshot-13/envars_2022-01-30_10-27-47.392028.json new file mode 100644 index 0000000000..07ce000839 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-13/envars_2022-01-30_10-27-47.392028.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68acfbd56fb38d7dca404747b758730d6d1e6a630ddf64ea2348f35605f66a48 +size 301709 diff --git a/examples/data/appshield/Heur/snapshot-13/handles_2022-01-30_10-27-50.868866.json b/examples/data/appshield/Heur/snapshot-13/handles_2022-01-30_10-27-50.868866.json new file mode 100644 index 0000000000..3b96c2e37f --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-13/handles_2022-01-30_10-27-50.868866.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ebad92b9caa0aeed46493b18056e3496ca63013e50b1062bb9408288cf9cd86 +size 2506791 diff --git a/examples/data/appshield/Heur/snapshot-13/ldrmodules_2022-01-30_10-27-46.119774.json b/examples/data/appshield/Heur/snapshot-13/ldrmodules_2022-01-30_10-27-46.119774.json new file mode 100644 index 0000000000..f51b8d9abd --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-13/ldrmodules_2022-01-30_10-27-46.119774.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4fe503335bf0b1c77f0dac5e1a4e38e718db75f736518b6dc1a7b1f1c72a466b +size 598788 diff --git a/examples/data/appshield/Heur/snapshot-13/netscan_2022-01-30_10-27-53.140515.json b/examples/data/appshield/Heur/snapshot-13/netscan_2022-01-30_10-27-53.140515.json new file mode 100644 index 0000000000..409cbc3801 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-13/netscan_2022-01-30_10-27-53.140515.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd302dc41e6d27526b636055e99048c83937762d17ac92f056b19d94a5bf039b +size 9136 diff --git a/examples/data/appshield/Heur/snapshot-13/pslist_2022-01-30_10-27-44.942274.json b/examples/data/appshield/Heur/snapshot-13/pslist_2022-01-30_10-27-44.942274.json new file mode 100644 index 0000000000..a32478d64e --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-13/pslist_2022-01-30_10-27-44.942274.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4ca98750d4962d0e62c52f2759e3cab58dbfee89fefcdf706c764dd423ab6a4c +size 11452 diff --git a/examples/data/appshield/Heur/snapshot-13/threadlist_2022-01-30_10-27-48.010827.json b/examples/data/appshield/Heur/snapshot-13/threadlist_2022-01-30_10-27-48.010827.json new file mode 100644 index 0000000000..a3d9a8fdda --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-13/threadlist_2022-01-30_10-27-48.010827.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f9301a018b6d5ac3b07cbdb07027b803af1832851ddc6ce3fdc1ecc6b2cf4ae +size 65921 diff --git a/examples/data/appshield/Heur/snapshot-13/vadinfo_2022-01-30_10-27-49.124816.json b/examples/data/appshield/Heur/snapshot-13/vadinfo_2022-01-30_10-27-49.124816.json new file mode 100644 index 0000000000..0d8bc84273 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-13/vadinfo_2022-01-30_10-27-49.124816.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e09d1d362f86f8038187c0128cca3406d68d7ee3df0cfcad693fa050acb8acc +size 1738832 diff --git a/examples/data/appshield/Heur/snapshot-14/cmdline_2022-01-30_10-27-55.462305.json b/examples/data/appshield/Heur/snapshot-14/cmdline_2022-01-30_10-27-55.462305.json new file mode 100644 index 0000000000..2b6aa3d8c0 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-14/cmdline_2022-01-30_10-27-55.462305.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77999df9364b7e4bedb57084f08c7dac1db45c84116de9a73d6b30228cba9bb8 +size 9717 diff --git a/examples/data/appshield/Heur/snapshot-14/envars_2022-01-30_10-27-56.125016.json b/examples/data/appshield/Heur/snapshot-14/envars_2022-01-30_10-27-56.125016.json new file mode 100644 index 0000000000..5dbcf59852 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-14/envars_2022-01-30_10-27-56.125016.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91aadf429c850bc3c4700268c4d4e0bcadcc16d7b7dba6c121c8ef3ceee71c11 +size 292273 diff --git a/examples/data/appshield/Heur/snapshot-14/handles_2022-01-30_10-27-59.646114.json b/examples/data/appshield/Heur/snapshot-14/handles_2022-01-30_10-27-59.646114.json new file mode 100644 index 0000000000..274f9df039 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-14/handles_2022-01-30_10-27-59.646114.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b3d50b963a247a4d5dc95b8609e11a84e65f824da59b49f55da79ca74761477c +size 2506534 diff --git a/examples/data/appshield/Heur/snapshot-14/ldrmodules_2022-01-30_10-27-54.849536.json b/examples/data/appshield/Heur/snapshot-14/ldrmodules_2022-01-30_10-27-54.849536.json new file mode 100644 index 0000000000..977056b0fa --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-14/ldrmodules_2022-01-30_10-27-54.849536.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e02ecd262fe282e596d6c6ab73541e99a0e986505296d481f716b719d1a0b52b +size 597106 diff --git a/examples/data/appshield/Heur/snapshot-14/netscan_2022-01-30_10-28-01.868302.json b/examples/data/appshield/Heur/snapshot-14/netscan_2022-01-30_10-28-01.868302.json new file mode 100644 index 0000000000..49eed3ff18 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-14/netscan_2022-01-30_10-28-01.868302.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e85f9f92e376be8c1080d95ad03d3b479af38ed752a5fd5e9d78fb6966b286ad +size 9729 diff --git a/examples/data/appshield/Heur/snapshot-14/pslist_2022-01-30_10-27-53.703266.json b/examples/data/appshield/Heur/snapshot-14/pslist_2022-01-30_10-27-53.703266.json new file mode 100644 index 0000000000..6fb175761c --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-14/pslist_2022-01-30_10-27-53.703266.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5dab635b808ea042a24735bec503a121986d9a6e59f7e40fbf5f55c0f9d3586b +size 11669 diff --git a/examples/data/appshield/Heur/snapshot-14/threadlist_2022-01-30_10-27-56.742443.json b/examples/data/appshield/Heur/snapshot-14/threadlist_2022-01-30_10-27-56.742443.json new file mode 100644 index 0000000000..4753481ff9 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-14/threadlist_2022-01-30_10-27-56.742443.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5f89b275f61a3aa134f51869fc880afd905078ea765aabb8e427aa3a1c625bd8 +size 61619 diff --git a/examples/data/appshield/Heur/snapshot-14/vadinfo_2022-01-30_10-27-57.840927.json b/examples/data/appshield/Heur/snapshot-14/vadinfo_2022-01-30_10-27-57.840927.json new file mode 100644 index 0000000000..a162b7f5cb --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-14/vadinfo_2022-01-30_10-27-57.840927.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd57967a50e664a6ead97d70550ec21a0da7d5522fdd50e27abe5688d0604b99 +size 1677553 diff --git a/examples/data/appshield/Heur/snapshot-15/cmdline_2022-01-30_10-28-04.272964.json b/examples/data/appshield/Heur/snapshot-15/cmdline_2022-01-30_10-28-04.272964.json new file mode 100644 index 0000000000..b163abd238 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-15/cmdline_2022-01-30_10-28-04.272964.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a91acf24dd2920c8739867581feceabd389712d75cada28fc64c1f750e02d363 +size 10145 diff --git a/examples/data/appshield/Heur/snapshot-15/envars_2022-01-30_10-28-04.953163.json b/examples/data/appshield/Heur/snapshot-15/envars_2022-01-30_10-28-04.953163.json new file mode 100644 index 0000000000..e9ad871835 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-15/envars_2022-01-30_10-28-04.953163.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51ead6251540f3c153e37356ea4a3cf5584a4740404ed526cd20dc78a7b0a11f +size 305355 diff --git a/examples/data/appshield/Heur/snapshot-15/handles_2022-01-30_10-28-08.441869.json b/examples/data/appshield/Heur/snapshot-15/handles_2022-01-30_10-28-08.441869.json new file mode 100644 index 0000000000..755e71128f --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-15/handles_2022-01-30_10-28-08.441869.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:892dbca3736cac33e635ec3c3b301352e2d70f796af373d1616f69b8b7328e87 +size 2325442 diff --git a/examples/data/appshield/Heur/snapshot-15/ldrmodules_2022-01-30_10-28-03.626127.json b/examples/data/appshield/Heur/snapshot-15/ldrmodules_2022-01-30_10-28-03.626127.json new file mode 100644 index 0000000000..34f59c8d78 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-15/ldrmodules_2022-01-30_10-28-03.626127.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c9a5bb2403af3da4e8396623224ffa875121de420dfb49e8281be11edd6287e +size 616387 diff --git a/examples/data/appshield/Heur/snapshot-15/netscan_2022-01-30_10-28-10.736493.json b/examples/data/appshield/Heur/snapshot-15/netscan_2022-01-30_10-28-10.736493.json new file mode 100644 index 0000000000..b637b34b8c --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-15/netscan_2022-01-30_10-28-10.736493.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a712ca6677f295391892ad9de0aea712029f4cfc0b0b7cab13bd1d2f78d4122d +size 9614 diff --git a/examples/data/appshield/Heur/snapshot-15/pslist_2022-01-30_10-28-02.434170.json b/examples/data/appshield/Heur/snapshot-15/pslist_2022-01-30_10-28-02.434170.json new file mode 100644 index 0000000000..38e36c7e31 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-15/pslist_2022-01-30_10-28-02.434170.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f8e559ba446ff1991ee815e7df33c9f17a341c0c7d13da229310d2fbaec710b +size 12104 diff --git a/examples/data/appshield/Heur/snapshot-15/threadlist_2022-01-30_10-28-05.546145.json b/examples/data/appshield/Heur/snapshot-15/threadlist_2022-01-30_10-28-05.546145.json new file mode 100644 index 0000000000..742eda622b --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-15/threadlist_2022-01-30_10-28-05.546145.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2ac83d8a8b01c186c60ffd4cfd2d9d87d94cd728949215b4dd68c1e282540fd +size 63339 diff --git a/examples/data/appshield/Heur/snapshot-15/vadinfo_2022-01-30_10-28-06.685749.json b/examples/data/appshield/Heur/snapshot-15/vadinfo_2022-01-30_10-28-06.685749.json new file mode 100644 index 0000000000..34ff2a3d36 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-15/vadinfo_2022-01-30_10-28-06.685749.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:324a7fb39bae06db0dd2b6d73f82aa422cf8ee8e3dc74c1d815f7b36763ebd5e +size 1657916 diff --git a/examples/data/appshield/Heur/snapshot-16/cmdline_2022-01-30_10-28-13.170175.json b/examples/data/appshield/Heur/snapshot-16/cmdline_2022-01-30_10-28-13.170175.json new file mode 100644 index 0000000000..6ebb9d643e --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-16/cmdline_2022-01-30_10-28-13.170175.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01d158bc7e012c815d08fb0a9b53f1640fd8e79ee03b0f2d5012d9181a7607a4 +size 10371 diff --git a/examples/data/appshield/Heur/snapshot-16/envars_2022-01-30_10-28-13.853475.json b/examples/data/appshield/Heur/snapshot-16/envars_2022-01-30_10-28-13.853475.json new file mode 100644 index 0000000000..170b184ed6 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-16/envars_2022-01-30_10-28-13.853475.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d0ab2edb298858681a7558b6ee36823432e24e6fa29e59574fe2e98264ea4f4d +size 308862 diff --git a/examples/data/appshield/Heur/snapshot-16/handles_2022-01-30_10-28-17.421832.json b/examples/data/appshield/Heur/snapshot-16/handles_2022-01-30_10-28-17.421832.json new file mode 100644 index 0000000000..cd5da33b00 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-16/handles_2022-01-30_10-28-17.421832.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e730244aacd2677c0f3ccfe2627df09e71c0527e1975100728c29cdcf0e602a4 +size 2530890 diff --git a/examples/data/appshield/Heur/snapshot-16/ldrmodules_2022-01-30_10-28-12.533518.json b/examples/data/appshield/Heur/snapshot-16/ldrmodules_2022-01-30_10-28-12.533518.json new file mode 100644 index 0000000000..9955dd4df5 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-16/ldrmodules_2022-01-30_10-28-12.533518.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7fdced23501b806d54e7d6e4fafb3a41b84d3eb0ede5c2b763dc431afff9bff7 +size 618293 diff --git a/examples/data/appshield/Heur/snapshot-16/netscan_2022-01-30_10-28-19.820209.json b/examples/data/appshield/Heur/snapshot-16/netscan_2022-01-30_10-28-19.820209.json new file mode 100644 index 0000000000..ab2dae4205 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-16/netscan_2022-01-30_10-28-19.820209.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b71713752160a51ab43dfb069bae05164410b52bded89cb03afe9571659f1367 +size 9614 diff --git a/examples/data/appshield/Heur/snapshot-16/pslist_2022-01-30_10-28-11.304689.json b/examples/data/appshield/Heur/snapshot-16/pslist_2022-01-30_10-28-11.304689.json new file mode 100644 index 0000000000..bb408d6783 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-16/pslist_2022-01-30_10-28-11.304689.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7725a87f5a1aeb43c4fe00095a3fda1a337dcb4565136c98c58a6f2cb81bfdf9 +size 12356 diff --git a/examples/data/appshield/Heur/snapshot-16/threadlist_2022-01-30_10-28-14.474304.json b/examples/data/appshield/Heur/snapshot-16/threadlist_2022-01-30_10-28-14.474304.json new file mode 100644 index 0000000000..6eda34ba02 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-16/threadlist_2022-01-30_10-28-14.474304.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d0b9b320fb54099134f584f61448dbc859282402556e556221730e6fa44ab5b8 +size 67854 diff --git a/examples/data/appshield/Heur/snapshot-16/vadinfo_2022-01-30_10-28-15.624847.json b/examples/data/appshield/Heur/snapshot-16/vadinfo_2022-01-30_10-28-15.624847.json new file mode 100644 index 0000000000..e7cfb9bfa6 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-16/vadinfo_2022-01-30_10-28-15.624847.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e025510e4349d695dc179f1391b913e27af10d31f1bb6ad41b614ebe2ca40e1 +size 1779962 diff --git a/examples/data/appshield/Heur/snapshot-17/cmdline_2022-01-30_10-28-22.279820.json b/examples/data/appshield/Heur/snapshot-17/cmdline_2022-01-30_10-28-22.279820.json new file mode 100644 index 0000000000..e833502e07 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-17/cmdline_2022-01-30_10-28-22.279820.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:069bc23145921c6bf7fe4962cf26b61012274778b3663872fa1021e8c609892a +size 10587 diff --git a/examples/data/appshield/Heur/snapshot-17/envars_2022-01-30_10-28-22.961828.json b/examples/data/appshield/Heur/snapshot-17/envars_2022-01-30_10-28-22.961828.json new file mode 100644 index 0000000000..1b59cb27e2 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-17/envars_2022-01-30_10-28-22.961828.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1237d682be6ab15e14db0b12be8bf40178b282f6852934ee0b95d6b072449b11 +size 316131 diff --git a/examples/data/appshield/Heur/snapshot-17/handles_2022-01-30_10-28-26.556573.json b/examples/data/appshield/Heur/snapshot-17/handles_2022-01-30_10-28-26.556573.json new file mode 100644 index 0000000000..c5105b463f --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-17/handles_2022-01-30_10-28-26.556573.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7560e17149fb018beedc574212348efb68e0f62269d05c30b2a02dae567ccf63 +size 2524861 diff --git a/examples/data/appshield/Heur/snapshot-17/ldrmodules_2022-01-30_10-28-21.610465.json b/examples/data/appshield/Heur/snapshot-17/ldrmodules_2022-01-30_10-28-21.610465.json new file mode 100644 index 0000000000..f2a5a01af6 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-17/ldrmodules_2022-01-30_10-28-21.610465.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b6720d9e99519c07d252a5ef65c66bec7401723ad0329798d103e1160f8fe221 +size 623350 diff --git a/examples/data/appshield/Heur/snapshot-17/netscan_2022-01-30_10-28-28.935730.json b/examples/data/appshield/Heur/snapshot-17/netscan_2022-01-30_10-28-28.935730.json new file mode 100644 index 0000000000..305fa96e96 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-17/netscan_2022-01-30_10-28-28.935730.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:140a3b6d8032ab4ff660784fa2b2c7d63f39683668902959895cca22b560dc88 +size 9614 diff --git a/examples/data/appshield/Heur/snapshot-17/pslist_2022-01-30_10-28-20.381565.json b/examples/data/appshield/Heur/snapshot-17/pslist_2022-01-30_10-28-20.381565.json new file mode 100644 index 0000000000..3850eac7f7 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-17/pslist_2022-01-30_10-28-20.381565.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c41ae9d34edfbb40bf367295a42d6e42994f6b90146872f90ed218b768745c98 +size 12465 diff --git a/examples/data/appshield/Heur/snapshot-17/threadlist_2022-01-30_10-28-23.581147.json b/examples/data/appshield/Heur/snapshot-17/threadlist_2022-01-30_10-28-23.581147.json new file mode 100644 index 0000000000..f55f172444 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-17/threadlist_2022-01-30_10-28-23.581147.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:924884df4af1ce8c395ed1452928e4e6caf3da62c0282a07060b83bb41305bb7 +size 68355 diff --git a/examples/data/appshield/Heur/snapshot-17/vadinfo_2022-01-30_10-28-24.735272.json b/examples/data/appshield/Heur/snapshot-17/vadinfo_2022-01-30_10-28-24.735272.json new file mode 100644 index 0000000000..48b33e3dc1 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-17/vadinfo_2022-01-30_10-28-24.735272.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:54c3c5baff965cc33ac6a3cfc246f6ccfb94968244d5c7c9a8aa6d50fd8b588e +size 1769690 diff --git a/examples/data/appshield/Heur/snapshot-18/cmdline_2022-01-30_10-28-31.364334.json b/examples/data/appshield/Heur/snapshot-18/cmdline_2022-01-30_10-28-31.364334.json new file mode 100644 index 0000000000..f55c1fedaf --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-18/cmdline_2022-01-30_10-28-31.364334.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d601f56e3cafd5d5e60df6650397859cee055b43e27cdb940bea830c01eb2e14 +size 10146 diff --git a/examples/data/appshield/Heur/snapshot-18/envars_2022-01-30_10-28-32.009314.json b/examples/data/appshield/Heur/snapshot-18/envars_2022-01-30_10-28-32.009314.json new file mode 100644 index 0000000000..1f1545ee36 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-18/envars_2022-01-30_10-28-32.009314.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f46448e97857109e5a03d696336b49368e3bda95733d6c9155c6c2cb9e0409e +size 302376 diff --git a/examples/data/appshield/Heur/snapshot-18/handles_2022-01-30_10-28-35.577547.json b/examples/data/appshield/Heur/snapshot-18/handles_2022-01-30_10-28-35.577547.json new file mode 100644 index 0000000000..8ddbdb04d8 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-18/handles_2022-01-30_10-28-35.577547.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c18e5ef69e7efde1e5de18b89ae3cd3460ed522621535aa3f311b0725d503998 +size 2489532 diff --git a/examples/data/appshield/Heur/snapshot-18/ldrmodules_2022-01-30_10-28-30.714518.json b/examples/data/appshield/Heur/snapshot-18/ldrmodules_2022-01-30_10-28-30.714518.json new file mode 100644 index 0000000000..d6db6cc324 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-18/ldrmodules_2022-01-30_10-28-30.714518.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c11b0b55e3ecb879e4518fbb07f0d5436cdc024fb387f6f8a760980d214fd318 +size 610048 diff --git a/examples/data/appshield/Heur/snapshot-18/netscan_2022-01-30_10-28-37.943351.json b/examples/data/appshield/Heur/snapshot-18/netscan_2022-01-30_10-28-37.943351.json new file mode 100644 index 0000000000..9e8ff62a61 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-18/netscan_2022-01-30_10-28-37.943351.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d6528fadd9597ecd8b31f79f1a200b122829e7dace99b671effbe74c944c58b +size 9614 diff --git a/examples/data/appshield/Heur/snapshot-18/pslist_2022-01-30_10-28-29.495682.json b/examples/data/appshield/Heur/snapshot-18/pslist_2022-01-30_10-28-29.495682.json new file mode 100644 index 0000000000..2ef46933c1 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-18/pslist_2022-01-30_10-28-29.495682.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b4729fe4b84a50a1c6d65c1d48bc275e124ea808373355869c07a8105118b3c +size 12009 diff --git a/examples/data/appshield/Heur/snapshot-18/threadlist_2022-01-30_10-28-32.626539.json b/examples/data/appshield/Heur/snapshot-18/threadlist_2022-01-30_10-28-32.626539.json new file mode 100644 index 0000000000..d15d3628f4 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-18/threadlist_2022-01-30_10-28-32.626539.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb79afcda689acf93e7aa76a38887192391b4ec6e0501610e8a42ac024854bcb +size 65678 diff --git a/examples/data/appshield/Heur/snapshot-18/vadinfo_2022-01-30_10-28-33.771251.json b/examples/data/appshield/Heur/snapshot-18/vadinfo_2022-01-30_10-28-33.771251.json new file mode 100644 index 0000000000..d2ab0d762f --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-18/vadinfo_2022-01-30_10-28-33.771251.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52b4d4edcc3cb42069fe21ac9d2f3520f929659695298edb837b38a1b58f3f4b +size 1740230 diff --git a/examples/data/appshield/Heur/snapshot-19/cmdline_2022-01-30_10-28-40.413905.json b/examples/data/appshield/Heur/snapshot-19/cmdline_2022-01-30_10-28-40.413905.json new file mode 100644 index 0000000000..0390ae800c --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-19/cmdline_2022-01-30_10-28-40.413905.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0136cebc8eee226e370b65ea91e53db4a527c8288116427243680290cf2aac85 +size 10028 diff --git a/examples/data/appshield/Heur/snapshot-19/envars_2022-01-30_10-28-41.081318.json b/examples/data/appshield/Heur/snapshot-19/envars_2022-01-30_10-28-41.081318.json new file mode 100644 index 0000000000..05691c9894 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-19/envars_2022-01-30_10-28-41.081318.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e9a9c0d94c71c14c7f236db05b9ef00e1e91bb1a73a4cb9fbc4ce5c3613c33b +size 302339 diff --git a/examples/data/appshield/Heur/snapshot-19/handles_2022-01-30_10-28-44.565776.json b/examples/data/appshield/Heur/snapshot-19/handles_2022-01-30_10-28-44.565776.json new file mode 100644 index 0000000000..e6c15d6870 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-19/handles_2022-01-30_10-28-44.565776.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02bfef6d865c9886c9508e86228aa9594bcbe2178313e6263b0604ec67966786 +size 2453709 diff --git a/examples/data/appshield/Heur/snapshot-19/ldrmodules_2022-01-30_10-28-39.771264.json b/examples/data/appshield/Heur/snapshot-19/ldrmodules_2022-01-30_10-28-39.771264.json new file mode 100644 index 0000000000..7da0542fda --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-19/ldrmodules_2022-01-30_10-28-39.771264.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d14e711ae97eacc126959acabf0f00f6e1fcd004c20cb7bbc0556dd454bad1fe +size 600101 diff --git a/examples/data/appshield/Heur/snapshot-19/netscan_2022-01-30_10-28-46.868661.json b/examples/data/appshield/Heur/snapshot-19/netscan_2022-01-30_10-28-46.868661.json new file mode 100644 index 0000000000..cf8c3a28f1 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-19/netscan_2022-01-30_10-28-46.868661.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e77f5cb209e00c5325cfafe1cfaa8ea3b917dc921cff68022cfe858e35dca4d +size 9614 diff --git a/examples/data/appshield/Heur/snapshot-19/pslist_2022-01-30_10-28-38.532482.json b/examples/data/appshield/Heur/snapshot-19/pslist_2022-01-30_10-28-38.532482.json new file mode 100644 index 0000000000..1ea1976c28 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-19/pslist_2022-01-30_10-28-38.532482.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bbc6bf7856d9741648c3e6c0af0912edd7a86b637e34684cdad2174758294d06 +size 11789 diff --git a/examples/data/appshield/Heur/snapshot-19/threadlist_2022-01-30_10-28-41.704092.json b/examples/data/appshield/Heur/snapshot-19/threadlist_2022-01-30_10-28-41.704092.json new file mode 100644 index 0000000000..188a625169 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-19/threadlist_2022-01-30_10-28-41.704092.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b541a28fda42caef7dae3765efe61fc500d6b066c29ae021ec78c54e51dc01e +size 64514 diff --git a/examples/data/appshield/Heur/snapshot-19/vadinfo_2022-01-30_10-28-42.816266.json b/examples/data/appshield/Heur/snapshot-19/vadinfo_2022-01-30_10-28-42.816266.json new file mode 100644 index 0000000000..e126518163 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-19/vadinfo_2022-01-30_10-28-42.816266.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:046d61f230322d70bfedc3edd55be818a3f27c9ba4abdabda481474698330039 +size 1714527 diff --git a/examples/data/appshield/Heur/snapshot-2/cmdline_2022-01-30_10-26-09.063587.json b/examples/data/appshield/Heur/snapshot-2/cmdline_2022-01-30_10-26-09.063587.json new file mode 100644 index 0000000000..901e845ee0 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-2/cmdline_2022-01-30_10-26-09.063587.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f385e3c8105f27e31629e0a9c534d3b38cfff6e8590ab59dc1407b3523f67e5b +size 10682 diff --git a/examples/data/appshield/Heur/snapshot-2/envars_2022-01-30_10-26-09.741878.json b/examples/data/appshield/Heur/snapshot-2/envars_2022-01-30_10-26-09.741878.json new file mode 100644 index 0000000000..8ae3b71437 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-2/envars_2022-01-30_10-26-09.741878.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:921dc809bb99cdb953907c6dd767771019f732ad9203aef1c77ce4bad5e555c5 +size 332427 diff --git a/examples/data/appshield/Heur/snapshot-2/handles_2022-01-30_10-26-13.348160.json b/examples/data/appshield/Heur/snapshot-2/handles_2022-01-30_10-26-13.348160.json new file mode 100644 index 0000000000..4c403bf17c --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-2/handles_2022-01-30_10-26-13.348160.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13cee70aead1c1b7b332b7d8e72e8a02f60a4416aaa955e684f363db08d7b506 +size 2659382 diff --git a/examples/data/appshield/Heur/snapshot-2/ldrmodules_2022-01-30_10-26-08.416585.json b/examples/data/appshield/Heur/snapshot-2/ldrmodules_2022-01-30_10-26-08.416585.json new file mode 100644 index 0000000000..4dde244da8 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-2/ldrmodules_2022-01-30_10-26-08.416585.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:373ea7d9daf71bf2c95cedb0fcab906c48f4d2d8ade1f912ac1fab2d8508a14e +size 614666 diff --git a/examples/data/appshield/Heur/snapshot-2/netscan_2022-01-30_10-26-15.507886.json b/examples/data/appshield/Heur/snapshot-2/netscan_2022-01-30_10-26-15.507886.json new file mode 100644 index 0000000000..552d62c978 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-2/netscan_2022-01-30_10-26-15.507886.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:892779a9ec55bc2dc33682c2de5b9b5760e69a2da4871aa3874997735f3294ac +size 9822 diff --git a/examples/data/appshield/Heur/snapshot-2/pslist_2022-01-30_10-26-07.234099.json b/examples/data/appshield/Heur/snapshot-2/pslist_2022-01-30_10-26-07.234099.json new file mode 100644 index 0000000000..aec37c8d03 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-2/pslist_2022-01-30_10-26-07.234099.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d84e974e643fa306e6ca5da2760d2839faaeeb600e0091bb1e83346a90ed6216 +size 12253 diff --git a/examples/data/appshield/Heur/snapshot-2/threadlist_2022-01-30_10-26-10.364669.json b/examples/data/appshield/Heur/snapshot-2/threadlist_2022-01-30_10-26-10.364669.json new file mode 100644 index 0000000000..b945847b1c --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-2/threadlist_2022-01-30_10-26-10.364669.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d51f5b9181802d5b5d858c11ba3aa3e0abdcb256d1cf04f33d9a76692bba1dd8 +size 73404 diff --git a/examples/data/appshield/Heur/snapshot-2/vadinfo_2022-01-30_10-26-11.510219.json b/examples/data/appshield/Heur/snapshot-2/vadinfo_2022-01-30_10-26-11.510219.json new file mode 100644 index 0000000000..2ed0297b0c --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-2/vadinfo_2022-01-30_10-26-11.510219.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:31d4f532563bdb117f3f77efe0a08d617a81de792b2eeda11051c84143eca2ab +size 1816059 diff --git a/examples/data/appshield/Heur/snapshot-20/cmdline_2022-01-30_10-28-49.250538.json b/examples/data/appshield/Heur/snapshot-20/cmdline_2022-01-30_10-28-49.250538.json new file mode 100644 index 0000000000..87b3af6bbc --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-20/cmdline_2022-01-30_10-28-49.250538.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:09370e5f526a2123f48862dcae90fbad115719a60db4c379bc00969def8cf52a +size 9955 diff --git a/examples/data/appshield/Heur/snapshot-20/envars_2022-01-30_10-28-49.915433.json b/examples/data/appshield/Heur/snapshot-20/envars_2022-01-30_10-28-49.915433.json new file mode 100644 index 0000000000..d1e655599c --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-20/envars_2022-01-30_10-28-49.915433.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45346895ff078c23f4d5b3a37926223623b54c966ac2344addea09f4823080d5 +size 299161 diff --git a/examples/data/appshield/Heur/snapshot-20/handles_2022-01-30_10-28-53.341373.json b/examples/data/appshield/Heur/snapshot-20/handles_2022-01-30_10-28-53.341373.json new file mode 100644 index 0000000000..b0585924e3 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-20/handles_2022-01-30_10-28-53.341373.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53f64ff2dc80ad1c9888b981c8bbc0ffe15cbe057aa4dea8c798109ed0ee5bc0 +size 2405043 diff --git a/examples/data/appshield/Heur/snapshot-20/ldrmodules_2022-01-30_10-28-48.612563.json b/examples/data/appshield/Heur/snapshot-20/ldrmodules_2022-01-30_10-28-48.612563.json new file mode 100644 index 0000000000..3fa330964e --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-20/ldrmodules_2022-01-30_10-28-48.612563.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f30d4ecb70fed3022c94f3dde1e1296efa87f2b328014f5b6c2cf42b015a300 +size 594388 diff --git a/examples/data/appshield/Heur/snapshot-20/netscan_2022-01-30_10-28-55.730970.json b/examples/data/appshield/Heur/snapshot-20/netscan_2022-01-30_10-28-55.730970.json new file mode 100644 index 0000000000..ae7ae5d6ea --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-20/netscan_2022-01-30_10-28-55.730970.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a506730696c389d3efb2fc5a8d0af7cbd82fae547f6e38daa5f71570980557b8 +size 9230 diff --git a/examples/data/appshield/Heur/snapshot-20/pslist_2022-01-30_10-28-47.433187.json b/examples/data/appshield/Heur/snapshot-20/pslist_2022-01-30_10-28-47.433187.json new file mode 100644 index 0000000000..9b281d759f --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-20/pslist_2022-01-30_10-28-47.433187.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:260e74114e82b4ccccd1489e10a4842cbedb4e0862a1b82125a898666f2bc091 +size 11679 diff --git a/examples/data/appshield/Heur/snapshot-20/threadlist_2022-01-30_10-28-50.543176.json b/examples/data/appshield/Heur/snapshot-20/threadlist_2022-01-30_10-28-50.543176.json new file mode 100644 index 0000000000..0cd84b79d1 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-20/threadlist_2022-01-30_10-28-50.543176.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:056346ebf8f2b45583b49dceb98877f9bad94272bd397345d27ef31ca900d19c +size 64279 diff --git a/examples/data/appshield/Heur/snapshot-20/vadinfo_2022-01-30_10-28-51.612010.json b/examples/data/appshield/Heur/snapshot-20/vadinfo_2022-01-30_10-28-51.612010.json new file mode 100644 index 0000000000..7207ef35e4 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-20/vadinfo_2022-01-30_10-28-51.612010.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03ccef8d13a0a9abc8739fc0498aa0731b1e166ebe810202b51e416055fbd36a +size 1642094 diff --git a/examples/data/appshield/Heur/snapshot-21/cmdline_2022-01-30_10-28-58.110831.json b/examples/data/appshield/Heur/snapshot-21/cmdline_2022-01-30_10-28-58.110831.json new file mode 100644 index 0000000000..7901f50aef --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-21/cmdline_2022-01-30_10-28-58.110831.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:340ab4067b8711948147af06016b0fa3dd462e660a419646c45108fcae707886 +size 9740 diff --git a/examples/data/appshield/Heur/snapshot-21/envars_2022-01-30_10-28-58.780398.json b/examples/data/appshield/Heur/snapshot-21/envars_2022-01-30_10-28-58.780398.json new file mode 100644 index 0000000000..4680ec4196 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-21/envars_2022-01-30_10-28-58.780398.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ef4cf66ed51da859c1a6d30f9ee3b87fe7e3a292000e2655a2c71eb5805df25 +size 288765 diff --git a/examples/data/appshield/Heur/snapshot-21/handles_2022-01-30_10-29-02.202932.json b/examples/data/appshield/Heur/snapshot-21/handles_2022-01-30_10-29-02.202932.json new file mode 100644 index 0000000000..020755353d --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-21/handles_2022-01-30_10-29-02.202932.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd5b44ce1dea3952214d7f2738d6e0f8b1a328f47a5ef032209c1fc38950f36f +size 2399494 diff --git a/examples/data/appshield/Heur/snapshot-21/ldrmodules_2022-01-30_10-28-57.472183.json b/examples/data/appshield/Heur/snapshot-21/ldrmodules_2022-01-30_10-28-57.472183.json new file mode 100644 index 0000000000..297719e379 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-21/ldrmodules_2022-01-30_10-28-57.472183.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae4d5cb1a366f70af98429183aae91872089c38cd3045ee1b5d4481c035f9037 +size 587468 diff --git a/examples/data/appshield/Heur/snapshot-21/netscan_2022-01-30_10-29-04.510655.json b/examples/data/appshield/Heur/snapshot-21/netscan_2022-01-30_10-29-04.510655.json new file mode 100644 index 0000000000..091873062b --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-21/netscan_2022-01-30_10-29-04.510655.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d8ee75b94ef841b7ea8f9f68009f4039dc8a77560cf2b858c8f055ed05afb79 +size 9230 diff --git a/examples/data/appshield/Heur/snapshot-21/pslist_2022-01-30_10-28-56.297185.json b/examples/data/appshield/Heur/snapshot-21/pslist_2022-01-30_10-28-56.297185.json new file mode 100644 index 0000000000..5c23012626 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-21/pslist_2022-01-30_10-28-56.297185.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:162b368eb31a1f7128c65bf5f9d6069fe515b223dd099477f4cbecfbe4a4b1c1 +size 11457 diff --git a/examples/data/appshield/Heur/snapshot-21/threadlist_2022-01-30_10-28-59.406043.json b/examples/data/appshield/Heur/snapshot-21/threadlist_2022-01-30_10-28-59.406043.json new file mode 100644 index 0000000000..ec6f45fbdd --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-21/threadlist_2022-01-30_10-28-59.406043.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7cf04181932ae119eedf9339780f308a07b95405240eb1858d7c59dd7a633bc0 +size 63134 diff --git a/examples/data/appshield/Heur/snapshot-21/vadinfo_2022-01-30_10-29-00.505583.json b/examples/data/appshield/Heur/snapshot-21/vadinfo_2022-01-30_10-29-00.505583.json new file mode 100644 index 0000000000..f1699bab22 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-21/vadinfo_2022-01-30_10-29-00.505583.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:938d883a313019d970b8e76086cb2c5bb9fa0d4ce178700358dd5c2724a000dd +size 1637536 diff --git a/examples/data/appshield/Heur/snapshot-22/cmdline_2022-01-30_10-29-06.870196.json b/examples/data/appshield/Heur/snapshot-22/cmdline_2022-01-30_10-29-06.870196.json new file mode 100644 index 0000000000..219804c80d --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-22/cmdline_2022-01-30_10-29-06.870196.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25d318fb72a7bee4f853b334d06b962480b874e37906e306d91b3069e036d6fa +size 9794 diff --git a/examples/data/appshield/Heur/snapshot-22/envars_2022-01-30_10-29-07.543314.json b/examples/data/appshield/Heur/snapshot-22/envars_2022-01-30_10-29-07.543314.json new file mode 100644 index 0000000000..01d37acddd --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-22/envars_2022-01-30_10-29-07.543314.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9946730a5238debab449a2fbec8f65402084ad0e8c771422b78fba0f9269f38 +size 295070 diff --git a/examples/data/appshield/Heur/snapshot-22/handles_2022-01-30_10-29-11.109727.json b/examples/data/appshield/Heur/snapshot-22/handles_2022-01-30_10-29-11.109727.json new file mode 100644 index 0000000000..cf61a07bf8 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-22/handles_2022-01-30_10-29-11.109727.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c6be512090b35a9e6496e767ec52ce8b57bafb835db41e1c8606b9d057be2e5 +size 2429824 diff --git a/examples/data/appshield/Heur/snapshot-22/ldrmodules_2022-01-30_10-29-06.239801.json b/examples/data/appshield/Heur/snapshot-22/ldrmodules_2022-01-30_10-29-06.239801.json new file mode 100644 index 0000000000..297719e379 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-22/ldrmodules_2022-01-30_10-29-06.239801.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae4d5cb1a366f70af98429183aae91872089c38cd3045ee1b5d4481c035f9037 +size 587468 diff --git a/examples/data/appshield/Heur/snapshot-22/netscan_2022-01-30_10-29-13.326945.json b/examples/data/appshield/Heur/snapshot-22/netscan_2022-01-30_10-29-13.326945.json new file mode 100644 index 0000000000..e367d40a08 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-22/netscan_2022-01-30_10-29-13.326945.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a76a6da0dd488599b8150f184cc8b182358c56067f1dd17df779632a684c821 +size 9230 diff --git a/examples/data/appshield/Heur/snapshot-22/pslist_2022-01-30_10-29-05.078376.json b/examples/data/appshield/Heur/snapshot-22/pslist_2022-01-30_10-29-05.078376.json new file mode 100644 index 0000000000..62d89c1f93 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-22/pslist_2022-01-30_10-29-05.078376.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f57d3807ba5caf4d15d43ac2a2dd60ec41667d73b60929ef585fbc8711c99c23 +size 11457 diff --git a/examples/data/appshield/Heur/snapshot-22/threadlist_2022-01-30_10-29-08.155559.json b/examples/data/appshield/Heur/snapshot-22/threadlist_2022-01-30_10-29-08.155559.json new file mode 100644 index 0000000000..2eb7b30953 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-22/threadlist_2022-01-30_10-29-08.155559.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c0146e0dbeb817adc99be4ee9fb6f1c456feb2be8f7df52967e12a62f974aa2 +size 63731 diff --git a/examples/data/appshield/Heur/snapshot-22/vadinfo_2022-01-30_10-29-09.270718.json b/examples/data/appshield/Heur/snapshot-22/vadinfo_2022-01-30_10-29-09.270718.json new file mode 100644 index 0000000000..a6c1844086 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-22/vadinfo_2022-01-30_10-29-09.270718.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cf9f500e4fee4bf4acb92c14138debf3845d3ab991499dc1284e550c7db98219 +size 1658931 diff --git a/examples/data/appshield/Heur/snapshot-23/cmdline_2022-01-30_10-29-15.720796.json b/examples/data/appshield/Heur/snapshot-23/cmdline_2022-01-30_10-29-15.720796.json new file mode 100644 index 0000000000..e6543f5e76 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-23/cmdline_2022-01-30_10-29-15.720796.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4387c2a7653f0a59fcd6a158e8c3e98c7746185a944dda8c50c73e8383266595 +size 9867 diff --git a/examples/data/appshield/Heur/snapshot-23/envars_2022-01-30_10-29-16.379235.json b/examples/data/appshield/Heur/snapshot-23/envars_2022-01-30_10-29-16.379235.json new file mode 100644 index 0000000000..a22c5931a3 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-23/envars_2022-01-30_10-29-16.379235.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49b056e04e9c4331a2a309d0f1bf6fae16d4ad5761de782580caf8741782bb8e +size 295070 diff --git a/examples/data/appshield/Heur/snapshot-23/handles_2022-01-30_10-29-19.812454.json b/examples/data/appshield/Heur/snapshot-23/handles_2022-01-30_10-29-19.812454.json new file mode 100644 index 0000000000..7db004a529 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-23/handles_2022-01-30_10-29-19.812454.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1506ceeac8c07ecdb88a160f86caf23ce6da51ef4b55f377e4b8a0a10d83783 +size 2427005 diff --git a/examples/data/appshield/Heur/snapshot-23/ldrmodules_2022-01-30_10-29-15.085705.json b/examples/data/appshield/Heur/snapshot-23/ldrmodules_2022-01-30_10-29-15.085705.json new file mode 100644 index 0000000000..24d749bcec --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-23/ldrmodules_2022-01-30_10-29-15.085705.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:503ff85919647c131c7d42d683912420b50831d1a42ba310a302391f8fb21275 +size 594872 diff --git a/examples/data/appshield/Heur/snapshot-23/netscan_2022-01-30_10-29-21.973472.json b/examples/data/appshield/Heur/snapshot-23/netscan_2022-01-30_10-29-21.973472.json new file mode 100644 index 0000000000..caf131a754 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-23/netscan_2022-01-30_10-29-21.973472.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56fc9ed7fb3c7d63d9e3e34f806a4ca957976203a4febf3702b9573790296a1e +size 9230 diff --git a/examples/data/appshield/Heur/snapshot-23/pslist_2022-01-30_10-29-13.905168.json b/examples/data/appshield/Heur/snapshot-23/pslist_2022-01-30_10-29-13.905168.json new file mode 100644 index 0000000000..db45540a67 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-23/pslist_2022-01-30_10-29-13.905168.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e64b3f0e002ac8bd53903f7451bf1fa36df5d9bd6c8271b1b8cb603fd5e8bb6a +size 11676 diff --git a/examples/data/appshield/Heur/snapshot-23/threadlist_2022-01-30_10-29-16.995979.json b/examples/data/appshield/Heur/snapshot-23/threadlist_2022-01-30_10-29-16.995979.json new file mode 100644 index 0000000000..8afd230787 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-23/threadlist_2022-01-30_10-29-16.995979.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f51fa6ae0fef11231d6306e22277097095ac74f998d0f2fb44827a8cecd1c409 +size 63479 diff --git a/examples/data/appshield/Heur/snapshot-23/vadinfo_2022-01-30_10-29-18.100118.json b/examples/data/appshield/Heur/snapshot-23/vadinfo_2022-01-30_10-29-18.100118.json new file mode 100644 index 0000000000..a889a074b0 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-23/vadinfo_2022-01-30_10-29-18.100118.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a4cb2fb0477aeafba8e738383255eac9865094bcd131808b0dfb2d7e2d65ba8 +size 1652949 diff --git a/examples/data/appshield/Heur/snapshot-24/cmdline_2022-01-30_10-29-24.261859.json b/examples/data/appshield/Heur/snapshot-24/cmdline_2022-01-30_10-29-24.261859.json new file mode 100644 index 0000000000..e6543f5e76 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-24/cmdline_2022-01-30_10-29-24.261859.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4387c2a7653f0a59fcd6a158e8c3e98c7746185a944dda8c50c73e8383266595 +size 9867 diff --git a/examples/data/appshield/Heur/snapshot-24/envars_2022-01-30_10-29-24.903765.json b/examples/data/appshield/Heur/snapshot-24/envars_2022-01-30_10-29-24.903765.json new file mode 100644 index 0000000000..7643fb7be9 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-24/envars_2022-01-30_10-29-24.903765.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c72f31bd85579b8ebe1a39bd8ed19f4879110af9e1427f77ab000c118d93ffc +size 295070 diff --git a/examples/data/appshield/Heur/snapshot-24/handles_2022-01-30_10-29-28.334566.json b/examples/data/appshield/Heur/snapshot-24/handles_2022-01-30_10-29-28.334566.json new file mode 100644 index 0000000000..10e8ec79c8 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-24/handles_2022-01-30_10-29-28.334566.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eeab98815245082ad3f8a464c50fee7f2674190b6fbe5e491c64c305ac577567 +size 2438774 diff --git a/examples/data/appshield/Heur/snapshot-24/ldrmodules_2022-01-30_10-29-23.657524.json b/examples/data/appshield/Heur/snapshot-24/ldrmodules_2022-01-30_10-29-23.657524.json new file mode 100644 index 0000000000..c055428dd5 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-24/ldrmodules_2022-01-30_10-29-23.657524.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:58c87bb4b90b7a11c99443775c28144818c503d511d82f28ac161b230bf4b8b6 +size 596149 diff --git a/examples/data/appshield/Heur/snapshot-24/netscan_2022-01-30_10-29-30.502509.json b/examples/data/appshield/Heur/snapshot-24/netscan_2022-01-30_10-29-30.502509.json new file mode 100644 index 0000000000..b8aededbea --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-24/netscan_2022-01-30_10-29-30.502509.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a10c02288d14af72aa2950df02fe57e509e5750e5bbc3dc5d04cb69953c06d87 +size 9230 diff --git a/examples/data/appshield/Heur/snapshot-24/pslist_2022-01-30_10-29-22.509572.json b/examples/data/appshield/Heur/snapshot-24/pslist_2022-01-30_10-29-22.509572.json new file mode 100644 index 0000000000..8586eef81f --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-24/pslist_2022-01-30_10-29-22.509572.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a6fac54d68e1dcf85b2014bc6593548ab825081469737ca2c15a5467535a8a07 +size 11676 diff --git a/examples/data/appshield/Heur/snapshot-24/threadlist_2022-01-30_10-29-25.489737.json b/examples/data/appshield/Heur/snapshot-24/threadlist_2022-01-30_10-29-25.489737.json new file mode 100644 index 0000000000..4297a6ebdd --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-24/threadlist_2022-01-30_10-29-25.489737.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:149957557b1aaa235f1176c5a4e2b129394f3c51acbcc01f3802a362ca996796 +size 63821 diff --git a/examples/data/appshield/Heur/snapshot-24/vadinfo_2022-01-30_10-29-26.575787.json b/examples/data/appshield/Heur/snapshot-24/vadinfo_2022-01-30_10-29-26.575787.json new file mode 100644 index 0000000000..0636b3799c --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-24/vadinfo_2022-01-30_10-29-26.575787.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad93879dd6f20af1b5330a099c53b102154accc07ce04a1abbd6d11894973403 +size 1659945 diff --git a/examples/data/appshield/Heur/snapshot-25/cmdline_2022-01-30_10-29-32.887391.json b/examples/data/appshield/Heur/snapshot-25/cmdline_2022-01-30_10-29-32.887391.json new file mode 100644 index 0000000000..e6543f5e76 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-25/cmdline_2022-01-30_10-29-32.887391.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4387c2a7653f0a59fcd6a158e8c3e98c7746185a944dda8c50c73e8383266595 +size 9867 diff --git a/examples/data/appshield/Heur/snapshot-25/envars_2022-01-30_10-29-33.542631.json b/examples/data/appshield/Heur/snapshot-25/envars_2022-01-30_10-29-33.542631.json new file mode 100644 index 0000000000..2f6dd18ddd --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-25/envars_2022-01-30_10-29-33.542631.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69e9d606cd9eaca5b724637f4edbce9476b9d6a40bd0d174746a5f2b31754aaa +size 295070 diff --git a/examples/data/appshield/Heur/snapshot-25/handles_2022-01-30_10-29-37.022475.json b/examples/data/appshield/Heur/snapshot-25/handles_2022-01-30_10-29-37.022475.json new file mode 100644 index 0000000000..1c927865fc --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-25/handles_2022-01-30_10-29-37.022475.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f35309497dd4b5c3a1e8bbeee93a86fdd126a5be29df5b421a063a3affa54f7 +size 2419422 diff --git a/examples/data/appshield/Heur/snapshot-25/ldrmodules_2022-01-30_10-29-32.247923.json b/examples/data/appshield/Heur/snapshot-25/ldrmodules_2022-01-30_10-29-32.247923.json new file mode 100644 index 0000000000..c055428dd5 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-25/ldrmodules_2022-01-30_10-29-32.247923.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:58c87bb4b90b7a11c99443775c28144818c503d511d82f28ac161b230bf4b8b6 +size 596149 diff --git a/examples/data/appshield/Heur/snapshot-25/netscan_2022-01-30_10-29-39.392756.json b/examples/data/appshield/Heur/snapshot-25/netscan_2022-01-30_10-29-39.392756.json new file mode 100644 index 0000000000..a94bcb331b --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-25/netscan_2022-01-30_10-29-39.392756.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec27df8cf7cb00a3b54defb7da7ca52ff5c792f73eff467c5a896ab0c956c323 +size 9230 diff --git a/examples/data/appshield/Heur/snapshot-25/pslist_2022-01-30_10-29-31.060358.json b/examples/data/appshield/Heur/snapshot-25/pslist_2022-01-30_10-29-31.060358.json new file mode 100644 index 0000000000..9fdaade8c6 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-25/pslist_2022-01-30_10-29-31.060358.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0eb70796104fc27650aa095adb88c4525b40d7590904843d55f572fb6ede32b4 +size 11674 diff --git a/examples/data/appshield/Heur/snapshot-25/threadlist_2022-01-30_10-29-34.161278.json b/examples/data/appshield/Heur/snapshot-25/threadlist_2022-01-30_10-29-34.161278.json new file mode 100644 index 0000000000..4e9f40e1d2 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-25/threadlist_2022-01-30_10-29-34.161278.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ad1f8eba39547ea1dde214e2bbd54b348e6f7f3be08e7bfb257dd706a0ca3c1 +size 59552 diff --git a/examples/data/appshield/Heur/snapshot-25/vadinfo_2022-01-30_10-29-35.270936.json b/examples/data/appshield/Heur/snapshot-25/vadinfo_2022-01-30_10-29-35.270936.json new file mode 100644 index 0000000000..402f108cf5 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-25/vadinfo_2022-01-30_10-29-35.270936.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dfea6818eb86ea9c27a16914ecfc5485886b230036311b2a26b8eae126eed241 +size 1646186 diff --git a/examples/data/appshield/Heur/snapshot-26/cmdline_2022-01-30_10-29-41.839842.json b/examples/data/appshield/Heur/snapshot-26/cmdline_2022-01-30_10-29-41.839842.json new file mode 100644 index 0000000000..e6543f5e76 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-26/cmdline_2022-01-30_10-29-41.839842.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4387c2a7653f0a59fcd6a158e8c3e98c7746185a944dda8c50c73e8383266595 +size 9867 diff --git a/examples/data/appshield/Heur/snapshot-26/envars_2022-01-30_10-29-42.527012.json b/examples/data/appshield/Heur/snapshot-26/envars_2022-01-30_10-29-42.527012.json new file mode 100644 index 0000000000..a4fc16b7be --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-26/envars_2022-01-30_10-29-42.527012.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98f4bf9f8f3af7ff7fd04bc40221a55801a0575f4ad111f035b46b66cc1b6c44 +size 295070 diff --git a/examples/data/appshield/Heur/snapshot-26/handles_2022-01-30_10-29-45.936013.json b/examples/data/appshield/Heur/snapshot-26/handles_2022-01-30_10-29-45.936013.json new file mode 100644 index 0000000000..a6d269b986 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-26/handles_2022-01-30_10-29-45.936013.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:655b667ca6e10820a3224420aea3ceb6d738f22fe8ffcb6dd6a12da626a720c0 +size 2418138 diff --git a/examples/data/appshield/Heur/snapshot-26/ldrmodules_2022-01-30_10-29-41.162720.json b/examples/data/appshield/Heur/snapshot-26/ldrmodules_2022-01-30_10-29-41.162720.json new file mode 100644 index 0000000000..6dd740c541 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-26/ldrmodules_2022-01-30_10-29-41.162720.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:688395d725f6d929febc8bce177c899e2298a98bc276f1180087d11facaeee37 +size 596067 diff --git a/examples/data/appshield/Heur/snapshot-26/netscan_2022-01-30_10-29-48.244897.json b/examples/data/appshield/Heur/snapshot-26/netscan_2022-01-30_10-29-48.244897.json new file mode 100644 index 0000000000..63c1b66260 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-26/netscan_2022-01-30_10-29-48.244897.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f02b20ede1d90334430c9b1826f34930fa991b61bcc443ce790f89b173240915 +size 9230 diff --git a/examples/data/appshield/Heur/snapshot-26/pslist_2022-01-30_10-29-39.961317.json b/examples/data/appshield/Heur/snapshot-26/pslist_2022-01-30_10-29-39.961317.json new file mode 100644 index 0000000000..aafd50af9f --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-26/pslist_2022-01-30_10-29-39.961317.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96fe2ef27554b993b5f9e7052a554437ba511843cb44cc632227e03237c4491d +size 11671 diff --git a/examples/data/appshield/Heur/snapshot-26/threadlist_2022-01-30_10-29-43.138494.json b/examples/data/appshield/Heur/snapshot-26/threadlist_2022-01-30_10-29-43.138494.json new file mode 100644 index 0000000000..5b29c531eb --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-26/threadlist_2022-01-30_10-29-43.138494.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b2e6aa7eb47db0ffcd4b5a3b1035af42c7d2c7c60fa9d58e53a9588f5fd8bd7 +size 59426 diff --git a/examples/data/appshield/Heur/snapshot-26/vadinfo_2022-01-30_10-29-44.200445.json b/examples/data/appshield/Heur/snapshot-26/vadinfo_2022-01-30_10-29-44.200445.json new file mode 100644 index 0000000000..e5218e9859 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-26/vadinfo_2022-01-30_10-29-44.200445.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b01a45af06459f0474cfe2464fd2810db867cdc7086f62e0ada786863d95c2ef +size 1643667 diff --git a/examples/data/appshield/Heur/snapshot-27/cmdline_2022-01-30_10-29-50.599912.json b/examples/data/appshield/Heur/snapshot-27/cmdline_2022-01-30_10-29-50.599912.json new file mode 100644 index 0000000000..e6543f5e76 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-27/cmdline_2022-01-30_10-29-50.599912.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4387c2a7653f0a59fcd6a158e8c3e98c7746185a944dda8c50c73e8383266595 +size 9867 diff --git a/examples/data/appshield/Heur/snapshot-27/envars_2022-01-30_10-29-51.238045.json b/examples/data/appshield/Heur/snapshot-27/envars_2022-01-30_10-29-51.238045.json new file mode 100644 index 0000000000..39ceaa6c16 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-27/envars_2022-01-30_10-29-51.238045.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d0b10d0974a03407cb70e9d4203eb95c8fe07c44f98bbd3d709afb735fad2948 +size 295070 diff --git a/examples/data/appshield/Heur/snapshot-27/ldrmodules_2022-01-30_10-29-49.958411.json b/examples/data/appshield/Heur/snapshot-27/ldrmodules_2022-01-30_10-29-49.958411.json new file mode 100644 index 0000000000..6751d6fdad --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-27/ldrmodules_2022-01-30_10-29-49.958411.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b1d41c456ca6c30a4b4a32ddf19ad34baef1ed51d45640d36770a0c05721e97 +size 594550 diff --git a/examples/data/appshield/Heur/snapshot-27/pslist_2022-01-30_10-29-48.803574.json b/examples/data/appshield/Heur/snapshot-27/pslist_2022-01-30_10-29-48.803574.json new file mode 100644 index 0000000000..e0d2ee2987 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-27/pslist_2022-01-30_10-29-48.803574.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4532696554af0918be0227a0c8c7f3975ba8543366580af8310bf96a4c83c1bd +size 11672 diff --git a/examples/data/appshield/Heur/snapshot-27/threadlist_2022-01-30_10-29-51.807523.json b/examples/data/appshield/Heur/snapshot-27/threadlist_2022-01-30_10-29-51.807523.json new file mode 100644 index 0000000000..9fe83d6cb1 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-27/threadlist_2022-01-30_10-29-51.807523.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a983f9ac1548340905d7e6c86f0bff6649d0aca97d8af23aa1e52f5f6d59a464 +size 59084 diff --git a/examples/data/appshield/Heur/snapshot-27/vadinfo_2022-01-30_10-29-52.907614.json b/examples/data/appshield/Heur/snapshot-27/vadinfo_2022-01-30_10-29-52.907614.json new file mode 100644 index 0000000000..cef1a92730 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-27/vadinfo_2022-01-30_10-29-52.907614.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:403e46aed7901b13c0b36b4fa1f687061af6c3438b4a3491fcfb6a3df7aeb2f3 +size 1639711 diff --git a/examples/data/appshield/Heur/snapshot-3/cmdline_2022-01-30_10-26-17.919268.json b/examples/data/appshield/Heur/snapshot-3/cmdline_2022-01-30_10-26-17.919268.json new file mode 100644 index 0000000000..3a0e77b60e --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-3/cmdline_2022-01-30_10-26-17.919268.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8967473ea9878f73b74d1f3da917814374d241552aebd6628e83394ae4252b06 +size 10813 diff --git a/examples/data/appshield/Heur/snapshot-3/envars_2022-01-30_10-26-18.597661.json b/examples/data/appshield/Heur/snapshot-3/envars_2022-01-30_10-26-18.597661.json new file mode 100644 index 0000000000..f120b60240 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-3/envars_2022-01-30_10-26-18.597661.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d40ce35a1a21d7d973ce87b099316393ebd8085336a3f1c2013e10d6a3a3919 +size 322102 diff --git a/examples/data/appshield/Heur/snapshot-3/handles_2022-01-30_10-26-22.247282.json b/examples/data/appshield/Heur/snapshot-3/handles_2022-01-30_10-26-22.247282.json new file mode 100644 index 0000000000..4bda49236b --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-3/handles_2022-01-30_10-26-22.247282.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4ed9b6bc69a313af354186bf38c111ef05ded5e60889e55257fd1cd4ca7f221a +size 2705835 diff --git a/examples/data/appshield/Heur/snapshot-3/ldrmodules_2022-01-30_10-26-17.264136.json b/examples/data/appshield/Heur/snapshot-3/ldrmodules_2022-01-30_10-26-17.264136.json new file mode 100644 index 0000000000..d3f8d85972 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-3/ldrmodules_2022-01-30_10-26-17.264136.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d6577f1e3dc484a540435286fd4a031ed9e837295ecf15d7522c3d13d6e8b63 +size 611310 diff --git a/examples/data/appshield/Heur/snapshot-3/netscan_2022-01-30_10-26-24.440847.json b/examples/data/appshield/Heur/snapshot-3/netscan_2022-01-30_10-26-24.440847.json new file mode 100644 index 0000000000..52c1a5fb57 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-3/netscan_2022-01-30_10-26-24.440847.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab347f845d31254a8c5bf2de476fe8cd33f79bd43d4a0fdc1fa0d641ba0eacc4 +size 13142 diff --git a/examples/data/appshield/Heur/snapshot-3/pslist_2022-01-30_10-26-16.067152.json b/examples/data/appshield/Heur/snapshot-3/pslist_2022-01-30_10-26-16.067152.json new file mode 100644 index 0000000000..3db24027b2 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-3/pslist_2022-01-30_10-26-16.067152.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:63cb6733dae7abebd6ca25fcbaeeb24a94c0c555f15a3ad4e4d8cad1d44d1df0 +size 12140 diff --git a/examples/data/appshield/Heur/snapshot-3/threadlist_2022-01-30_10-26-19.228078.json b/examples/data/appshield/Heur/snapshot-3/threadlist_2022-01-30_10-26-19.228078.json new file mode 100644 index 0000000000..d6959d7779 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-3/threadlist_2022-01-30_10-26-19.228078.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e4a19a45b820fd4118736e36fcf88753280b1867618c7764826fe649e1013fd +size 75919 diff --git a/examples/data/appshield/Heur/snapshot-3/vadinfo_2022-01-30_10-26-20.383782.json b/examples/data/appshield/Heur/snapshot-3/vadinfo_2022-01-30_10-26-20.383782.json new file mode 100644 index 0000000000..875f7e918c --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-3/vadinfo_2022-01-30_10-26-20.383782.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4281fa5d34e04abbd6c35008de50b4e0e23872e30820d89422de06afd6efd28f +size 1886052 diff --git a/examples/data/appshield/Heur/snapshot-4/cmdline_2022-01-30_10-26-26.868778.json b/examples/data/appshield/Heur/snapshot-4/cmdline_2022-01-30_10-26-26.868778.json new file mode 100644 index 0000000000..2a3c534fa3 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-4/cmdline_2022-01-30_10-26-26.868778.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5931b9b26007f4f65c384282ea8a918f31ab3cec044f1e226a5a74fea8de7c58 +size 10263 diff --git a/examples/data/appshield/Heur/snapshot-4/envars_2022-01-30_10-26-27.548527.json b/examples/data/appshield/Heur/snapshot-4/envars_2022-01-30_10-26-27.548527.json new file mode 100644 index 0000000000..31aa6c9059 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-4/envars_2022-01-30_10-26-27.548527.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69922d107153915e3d0d7d4d26a148eccb942157baa7b58137acc61d58234c67 +size 309347 diff --git a/examples/data/appshield/Heur/snapshot-4/handles_2022-01-30_10-26-31.131620.json b/examples/data/appshield/Heur/snapshot-4/handles_2022-01-30_10-26-31.131620.json new file mode 100644 index 0000000000..a352a66231 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-4/handles_2022-01-30_10-26-31.131620.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b4e6f089fdfb1395b8ce369906e68a645fa32652e500a77640e0e095cc59770d +size 2648518 diff --git a/examples/data/appshield/Heur/snapshot-4/ldrmodules_2022-01-30_10-26-26.221177.json b/examples/data/appshield/Heur/snapshot-4/ldrmodules_2022-01-30_10-26-26.221177.json new file mode 100644 index 0000000000..6e422d01d7 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-4/ldrmodules_2022-01-30_10-26-26.221177.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9350f6925f347b49a70c1fdf4cbc97b5fe780470e229178b9a6f161985709d17 +size 647758 diff --git a/examples/data/appshield/Heur/snapshot-4/netscan_2022-01-30_10-26-33.571114.json b/examples/data/appshield/Heur/snapshot-4/netscan_2022-01-30_10-26-33.571114.json new file mode 100644 index 0000000000..ccac98020b --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-4/netscan_2022-01-30_10-26-33.571114.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:36b1387f635e38802cc1eb16dc93f2c847f80768b3a10efd300f3690392c8333 +size 12961 diff --git a/examples/data/appshield/Heur/snapshot-4/pslist_2022-01-30_10-26-24.979730.json b/examples/data/appshield/Heur/snapshot-4/pslist_2022-01-30_10-26-24.979730.json new file mode 100644 index 0000000000..f0cf8b0d49 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-4/pslist_2022-01-30_10-26-24.979730.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:819962e2a9a9e8c4835167b5ea69ead4a4a732c3a820e739451feb89dc3b6306 +size 12255 diff --git a/examples/data/appshield/Heur/snapshot-4/threadlist_2022-01-30_10-26-28.170767.json b/examples/data/appshield/Heur/snapshot-4/threadlist_2022-01-30_10-26-28.170767.json new file mode 100644 index 0000000000..a7c3cc635f --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-4/threadlist_2022-01-30_10-26-28.170767.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b0001e525752492adbc8d90f2b850d1890363f0b84f976dc25944afaea573549 +size 75950 diff --git a/examples/data/appshield/Heur/snapshot-4/vadinfo_2022-01-30_10-26-29.318737.json b/examples/data/appshield/Heur/snapshot-4/vadinfo_2022-01-30_10-26-29.318737.json new file mode 100644 index 0000000000..d788e97b79 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-4/vadinfo_2022-01-30_10-26-29.318737.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28e69b0c51c916d22124aa3d9fbbe3a05400372f13318105075314271a618c4b +size 1825512 diff --git a/examples/data/appshield/Heur/snapshot-5/cmdline_2022-01-30_10-26-36.033256.json b/examples/data/appshield/Heur/snapshot-5/cmdline_2022-01-30_10-26-36.033256.json new file mode 100644 index 0000000000..2a3c534fa3 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-5/cmdline_2022-01-30_10-26-36.033256.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5931b9b26007f4f65c384282ea8a918f31ab3cec044f1e226a5a74fea8de7c58 +size 10263 diff --git a/examples/data/appshield/Heur/snapshot-5/envars_2022-01-30_10-26-36.659912.json b/examples/data/appshield/Heur/snapshot-5/envars_2022-01-30_10-26-36.659912.json new file mode 100644 index 0000000000..019f99f3c3 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-5/envars_2022-01-30_10-26-36.659912.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:15f0fe6c4959c58435941d6b1b4c59e91f03672e772f447700b9d3717a44c77b +size 309347 diff --git a/examples/data/appshield/Heur/snapshot-5/handles_2022-01-30_10-26-40.260473.json b/examples/data/appshield/Heur/snapshot-5/handles_2022-01-30_10-26-40.260473.json new file mode 100644 index 0000000000..fb26f0aa2d --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-5/handles_2022-01-30_10-26-40.260473.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c381fe8c5d2693aff02dbebf748cc4be6c8ffaeb9c6ca24ef9992ceb987bb90a +size 2645866 diff --git a/examples/data/appshield/Heur/snapshot-5/ldrmodules_2022-01-30_10-26-35.368132.json b/examples/data/appshield/Heur/snapshot-5/ldrmodules_2022-01-30_10-26-35.368132.json new file mode 100644 index 0000000000..a381aac78b --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-5/ldrmodules_2022-01-30_10-26-35.368132.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3520f019007604f75ca8878f1d50aa3b292635aa36b3a263a28628f235e627ea +size 622876 diff --git a/examples/data/appshield/Heur/snapshot-5/netscan_2022-01-30_10-26-42.440353.json b/examples/data/appshield/Heur/snapshot-5/netscan_2022-01-30_10-26-42.440353.json new file mode 100644 index 0000000000..2231a773a3 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-5/netscan_2022-01-30_10-26-42.440353.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dbaa3582f3ab3ebda87fd74c7a17d2e0c299655c4487acf7d4590f29e4a127f1 +size 12219 diff --git a/examples/data/appshield/Heur/snapshot-5/pslist_2022-01-30_10-26-34.145862.json b/examples/data/appshield/Heur/snapshot-5/pslist_2022-01-30_10-26-34.145862.json new file mode 100644 index 0000000000..4cbfcb42b2 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-5/pslist_2022-01-30_10-26-34.145862.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:039d801170da513268a54844a5868b0e33870e34ce4ac4652e81a078b91a7c01 +size 12026 diff --git a/examples/data/appshield/Heur/snapshot-5/threadlist_2022-01-30_10-26-37.284991.json b/examples/data/appshield/Heur/snapshot-5/threadlist_2022-01-30_10-26-37.284991.json new file mode 100644 index 0000000000..ec92676e7c --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-5/threadlist_2022-01-30_10-26-37.284991.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ddd60f1962a995a29105bcf47e012a4a94a1c6e8efd9020d2d2a39e60ec6a8d +size 74894 diff --git a/examples/data/appshield/Heur/snapshot-5/vadinfo_2022-01-30_10-26-38.441642.json b/examples/data/appshield/Heur/snapshot-5/vadinfo_2022-01-30_10-26-38.441642.json new file mode 100644 index 0000000000..32f5cd822d --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-5/vadinfo_2022-01-30_10-26-38.441642.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a6bf0a299803f675ed2b747a1f3c8db5a47bdd3099f6d7fba706772565bba20 +size 1823804 diff --git a/examples/data/appshield/Heur/snapshot-6/cmdline_2022-01-30_10-26-44.783193.json b/examples/data/appshield/Heur/snapshot-6/cmdline_2022-01-30_10-26-44.783193.json new file mode 100644 index 0000000000..80778dafa0 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-6/cmdline_2022-01-30_10-26-44.783193.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:179629c103d0315519c4f30e9a4fba70d197ce60c5c7eff449262876bbab078c +size 10116 diff --git a/examples/data/appshield/Heur/snapshot-6/envars_2022-01-30_10-26-45.454339.json b/examples/data/appshield/Heur/snapshot-6/envars_2022-01-30_10-26-45.454339.json new file mode 100644 index 0000000000..ab6ca80cf4 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-6/envars_2022-01-30_10-26-45.454339.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19979915d6e590e17c6af19196e0232c6fd0992022d1d97482da6b33335e9614 +size 305837 diff --git a/examples/data/appshield/Heur/snapshot-6/handles_2022-01-30_10-26-49.032495.json b/examples/data/appshield/Heur/snapshot-6/handles_2022-01-30_10-26-49.032495.json new file mode 100644 index 0000000000..3d44017cae --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-6/handles_2022-01-30_10-26-49.032495.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64ead11c23c38f25e954bf56e3a5d1f0889167df599801b0d4d43554fdb06775 +size 2582806 diff --git a/examples/data/appshield/Heur/snapshot-6/ldrmodules_2022-01-30_10-26-44.145746.json b/examples/data/appshield/Heur/snapshot-6/ldrmodules_2022-01-30_10-26-44.145746.json new file mode 100644 index 0000000000..b405e3635a --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-6/ldrmodules_2022-01-30_10-26-44.145746.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d4f2c65f91e734d69b7c4b6dc46c7663f1ae0a267a5e833a70830bc8f7674c1e +size 611919 diff --git a/examples/data/appshield/Heur/snapshot-6/netscan_2022-01-30_10-26-51.366634.json b/examples/data/appshield/Heur/snapshot-6/netscan_2022-01-30_10-26-51.366634.json new file mode 100644 index 0000000000..87be03b67c --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-6/netscan_2022-01-30_10-26-51.366634.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dca940eabcbf63a038af2c4a38d1a0f9669d54ffda7abf286a1f3def1d916dc9 +size 12219 diff --git a/examples/data/appshield/Heur/snapshot-6/pslist_2022-01-30_10-26-42.971926.json b/examples/data/appshield/Heur/snapshot-6/pslist_2022-01-30_10-26-42.971926.json new file mode 100644 index 0000000000..9bfd7a4e05 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-6/pslist_2022-01-30_10-26-42.971926.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:129d9021f0c0bf33e41ac8e7a614f40d120ccaf48335fe1f86242bfa50701ad7 +size 11805 diff --git a/examples/data/appshield/Heur/snapshot-6/threadlist_2022-01-30_10-26-46.082396.json b/examples/data/appshield/Heur/snapshot-6/threadlist_2022-01-30_10-26-46.082396.json new file mode 100644 index 0000000000..15bda354eb --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-6/threadlist_2022-01-30_10-26-46.082396.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca315bb14be868eb08c3e7636062d7eceb88f83db3bdf548f8c9a0579b971cb2 +size 72558 diff --git a/examples/data/appshield/Heur/snapshot-6/vadinfo_2022-01-30_10-26-47.221952.json b/examples/data/appshield/Heur/snapshot-6/vadinfo_2022-01-30_10-26-47.221952.json new file mode 100644 index 0000000000..e6678b84f9 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-6/vadinfo_2022-01-30_10-26-47.221952.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e92a311f74dca37c8953c4604b0bb4281d663f97e268a51bca6df887ae3d4da +size 1787689 diff --git a/examples/data/appshield/Heur/snapshot-7/cmdline_2022-01-30_10-26-53.757204.json b/examples/data/appshield/Heur/snapshot-7/cmdline_2022-01-30_10-26-53.757204.json new file mode 100644 index 0000000000..71dd14e298 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-7/cmdline_2022-01-30_10-26-53.757204.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34d331b414abcafc123194ff5fcfc45a7091b7385dc295d910c7d3c67c18e154 +size 10217 diff --git a/examples/data/appshield/Heur/snapshot-7/envars_2022-01-30_10-26-54.425509.json b/examples/data/appshield/Heur/snapshot-7/envars_2022-01-30_10-26-54.425509.json new file mode 100644 index 0000000000..73a87bb248 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-7/envars_2022-01-30_10-26-54.425509.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f53e3d31dc66a848c2f239b76be6ae4f6b9c8f560bbc130454c0db41582e7d9 +size 308952 diff --git a/examples/data/appshield/Heur/snapshot-7/handles_2022-01-30_10-26-58.037288.json b/examples/data/appshield/Heur/snapshot-7/handles_2022-01-30_10-26-58.037288.json new file mode 100644 index 0000000000..d90b51c413 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-7/handles_2022-01-30_10-26-58.037288.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a43db38b01e1bd60a364ab8eb1743ea34a5e36df07c27f187bf32183caece0d1 +size 2584599 diff --git a/examples/data/appshield/Heur/snapshot-7/ldrmodules_2022-01-30_10-26-53.135374.json b/examples/data/appshield/Heur/snapshot-7/ldrmodules_2022-01-30_10-26-53.135374.json new file mode 100644 index 0000000000..83ad707815 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-7/ldrmodules_2022-01-30_10-26-53.135374.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0796326604ee645ea3db8185ee54146f0c28ca4c6952855a6aec6966d8732e13 +size 609737 diff --git a/examples/data/appshield/Heur/snapshot-7/netscan_2022-01-30_10-27-00.347299.json b/examples/data/appshield/Heur/snapshot-7/netscan_2022-01-30_10-27-00.347299.json new file mode 100644 index 0000000000..dadeb06fcc --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-7/netscan_2022-01-30_10-27-00.347299.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62278ca0090229a6643fdcc98cde36f42007284594d5ee8c93c25c74889e2d98 +size 12621 diff --git a/examples/data/appshield/Heur/snapshot-7/pslist_2022-01-30_10-26-51.935632.json b/examples/data/appshield/Heur/snapshot-7/pslist_2022-01-30_10-26-51.935632.json new file mode 100644 index 0000000000..8a11d02e20 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-7/pslist_2022-01-30_10-26-51.935632.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a44fc9093faadb22faa4cc79bb91df581d241cd5f5119978bcf99f659bb99de2 +size 11916 diff --git a/examples/data/appshield/Heur/snapshot-7/threadlist_2022-01-30_10-26-55.050565.json b/examples/data/appshield/Heur/snapshot-7/threadlist_2022-01-30_10-26-55.050565.json new file mode 100644 index 0000000000..7b2c121092 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-7/threadlist_2022-01-30_10-26-55.050565.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3bacb32530ae6266e27d76cacedd19f77be4359bd3f27b3d9c4123cc03cb666f +size 72257 diff --git a/examples/data/appshield/Heur/snapshot-7/vadinfo_2022-01-30_10-26-56.199421.json b/examples/data/appshield/Heur/snapshot-7/vadinfo_2022-01-30_10-26-56.199421.json new file mode 100644 index 0000000000..36d916af6e --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-7/vadinfo_2022-01-30_10-26-56.199421.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec760be9568d487e17506c5faafafd59247c7d92a4a5c549f9c222b76246ea07 +size 1791567 diff --git a/examples/data/appshield/Heur/snapshot-8/cmdline_2022-01-30_10-27-02.708217.json b/examples/data/appshield/Heur/snapshot-8/cmdline_2022-01-30_10-27-02.708217.json new file mode 100644 index 0000000000..00e265114f --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-8/cmdline_2022-01-30_10-27-02.708217.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51d87550e111c052d25196ddd9f75d369258662eabc31d5184041d6f67526be8 +size 10043 diff --git a/examples/data/appshield/Heur/snapshot-8/envars_2022-01-30_10-27-03.380959.json b/examples/data/appshield/Heur/snapshot-8/envars_2022-01-30_10-27-03.380959.json new file mode 100644 index 0000000000..fe41faa7f7 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-8/envars_2022-01-30_10-27-03.380959.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b4dd4a22ee5aca9e926d9318363f7d64dd2b0edfdedf525d177e7d329d08e51f +size 309082 diff --git a/examples/data/appshield/Heur/snapshot-8/handles_2022-01-30_10-27-06.923742.json b/examples/data/appshield/Heur/snapshot-8/handles_2022-01-30_10-27-06.923742.json new file mode 100644 index 0000000000..4166002ea6 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-8/handles_2022-01-30_10-27-06.923742.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:087a2c65da55659031a3514fa85ac7b3d97f7001171c7121f2cc89a8a8711a3d +size 2481770 diff --git a/examples/data/appshield/Heur/snapshot-8/ldrmodules_2022-01-30_10-27-02.100283.json b/examples/data/appshield/Heur/snapshot-8/ldrmodules_2022-01-30_10-27-02.100283.json new file mode 100644 index 0000000000..461e428f31 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-8/ldrmodules_2022-01-30_10-27-02.100283.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56a803b6e4cb4eced80b2234627561ca05a564c042606492c1acd4d8bf5b5b0b +size 605834 diff --git a/examples/data/appshield/Heur/snapshot-8/netscan_2022-01-30_10-27-09.103815.json b/examples/data/appshield/Heur/snapshot-8/netscan_2022-01-30_10-27-09.103815.json new file mode 100644 index 0000000000..c1b45c32e3 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-8/netscan_2022-01-30_10-27-09.103815.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c5a200c198a34dc45253ee22d4fd01e7321fed1ec9e64b2bd25c2abfb403c8c +size 11869 diff --git a/examples/data/appshield/Heur/snapshot-8/pslist_2022-01-30_10-27-00.909801.json b/examples/data/appshield/Heur/snapshot-8/pslist_2022-01-30_10-27-00.909801.json new file mode 100644 index 0000000000..82b66959e4 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-8/pslist_2022-01-30_10-27-00.909801.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab646d5e85afc344694d9fd60fa12c0f4c1277e6d4e6fe0ec38de5fb94ad8535 +size 11806 diff --git a/examples/data/appshield/Heur/snapshot-8/threadlist_2022-01-30_10-27-04.025664.json b/examples/data/appshield/Heur/snapshot-8/threadlist_2022-01-30_10-27-04.025664.json new file mode 100644 index 0000000000..2b639793d1 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-8/threadlist_2022-01-30_10-27-04.025664.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9bd8e81754fa2db4da1cfc75604ba5e1320b30b564c6964ab5476e311368031 +size 68984 diff --git a/examples/data/appshield/Heur/snapshot-8/vadinfo_2022-01-30_10-27-05.175861.json b/examples/data/appshield/Heur/snapshot-8/vadinfo_2022-01-30_10-27-05.175861.json new file mode 100644 index 0000000000..602dfefea6 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-8/vadinfo_2022-01-30_10-27-05.175861.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7bba2a4be4f7482e90066b25012c2ed04fbf40cf95ce19a34917d731367174db +size 1712932 diff --git a/examples/data/appshield/Heur/snapshot-9/cmdline_2022-01-30_10-27-11.397004.json b/examples/data/appshield/Heur/snapshot-9/cmdline_2022-01-30_10-27-11.397004.json new file mode 100644 index 0000000000..caa4432bfc --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-9/cmdline_2022-01-30_10-27-11.397004.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66eed65709e4647d21503589e5954a52420cc8fc010340771a8e7bc0c3f81a4f +size 9972 diff --git a/examples/data/appshield/Heur/snapshot-9/envars_2022-01-30_10-27-12.030292.json b/examples/data/appshield/Heur/snapshot-9/envars_2022-01-30_10-27-12.030292.json new file mode 100644 index 0000000000..4f9be8444e --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-9/envars_2022-01-30_10-27-12.030292.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d84e2c58e3ffb002c5df85e20854f76db45cb08c81af33b4339f7f62dec8e75e +size 298603 diff --git a/examples/data/appshield/Heur/snapshot-9/handles_2022-01-30_10-27-15.535996.json b/examples/data/appshield/Heur/snapshot-9/handles_2022-01-30_10-27-15.535996.json new file mode 100644 index 0000000000..6028f16266 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-9/handles_2022-01-30_10-27-15.535996.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7743ef1383e92139be3a6a7cd08bfa49488121420f55bdc0d9518600e227aa8e +size 2515546 diff --git a/examples/data/appshield/Heur/snapshot-9/ldrmodules_2022-01-30_10-27-10.782940.json b/examples/data/appshield/Heur/snapshot-9/ldrmodules_2022-01-30_10-27-10.782940.json new file mode 100644 index 0000000000..fcf461b5a1 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-9/ldrmodules_2022-01-30_10-27-10.782940.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:187289fc194f6998b067923e55b50a2f6a562cd2dde12429a42a89b05be3ce45 +size 592710 diff --git a/examples/data/appshield/Heur/snapshot-9/netscan_2022-01-30_10-27-17.860931.json b/examples/data/appshield/Heur/snapshot-9/netscan_2022-01-30_10-27-17.860931.json new file mode 100644 index 0000000000..3997c0c3af --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-9/netscan_2022-01-30_10-27-17.860931.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9973b594c56b188d2d1cb22fedbd178c664d790275655699b48e36404b17831 +size 11532 diff --git a/examples/data/appshield/Heur/snapshot-9/pslist_2022-01-30_10-27-09.634635.json b/examples/data/appshield/Heur/snapshot-9/pslist_2022-01-30_10-27-09.634635.json new file mode 100644 index 0000000000..12105ce8fc --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-9/pslist_2022-01-30_10-27-09.634635.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4bd20a25c7da07b5a667f2d925eb05b399a14683a7613303ee624601e4bec923 +size 11569 diff --git a/examples/data/appshield/Heur/snapshot-9/threadlist_2022-01-30_10-27-12.661218.json b/examples/data/appshield/Heur/snapshot-9/threadlist_2022-01-30_10-27-12.661218.json new file mode 100644 index 0000000000..5b248c0399 --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-9/threadlist_2022-01-30_10-27-12.661218.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43350232aa6a0b1a0ce9cd33d061d39921f95d68d6ff5e804ba4afce87ba67c9 +size 68667 diff --git a/examples/data/appshield/Heur/snapshot-9/vadinfo_2022-01-30_10-27-13.786086.json b/examples/data/appshield/Heur/snapshot-9/vadinfo_2022-01-30_10-27-13.786086.json new file mode 100644 index 0000000000..710a2e80ea --- /dev/null +++ b/examples/data/appshield/Heur/snapshot-9/vadinfo_2022-01-30_10-27-13.786086.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1bb8b9db0321ae51ef310177f87c4668d8d5233c7dd176fd43dccf8d2f83dcb9 +size 1736291 diff --git a/examples/ransomware_detection/README.md b/examples/ransomware_detection/README.md new file mode 100644 index 0000000000..2c3b09a13b --- /dev/null +++ b/examples/ransomware_detection/README.md @@ -0,0 +1,109 @@ + + +# Example Ransomware Detection Morpheus Pipeline for AppShield Data + +Example Morpheus pipeline using Docker containers for Triton Inference server and Morpheus SDK/Client. + +## Setup Triton Inference Server + +##### Pull Triton Inference Server Docker Image +Pull Docker image from NGC (https://ngc.nvidia.com/catalog/containers/nvidia:tritonserver) suitable for your environment. + +Example: + +``` +docker pull nvcr.io/nvidia/tritonserver:22.02-py3 +``` + +##### Start Triton Inference Server container +```bash +cd ${MORPHEUS_ROOT}/examples/ransomware_detection + +# Run Triton in explicit mode +docker run --rm -ti --gpus=all -p8000:8000 -p8001:8001 -p8002:8002 -v $PWD/models:/models/triton-model-repo nvcr.io/nvidia/tritonserver:22.02-py3 \ + tritonserver --model-repository=/models/triton-model-repo \ + --exit-on-error=false \ + --model-control-mode=explicit \ + --load-model ransomw-model-short-rf +``` + +## Requirements +Prior to running the ransomware detection pipeline, additional requirements must be installed in to your conda environment. + +```bash +conda install dask==2022.5.2 distributed==2022.5.2 +``` + +## Run Pipeline +Launch the example using the following + +```bash +cd ${MORPHEUS_ROOT}/examples/ransomware_detection + +python run.py --server_url= \ + --model_name=ransomw-model-short-rf \ + --conf_file=./config/ransomware_detection.yaml \ + --input_glob=${MORPHEUS_ROOT}/examples/data/appshield/*/snapshot-*/*.json \ + --output_file=./ransomware_detection_output.jsonlines +``` + +The configuration options for this example can be queried with: + +```bash +python run.py --help +``` + +``` +Usage: run.py [OPTIONS] + +Options: + --debug BOOLEAN + --use_cpp BOOLEAN + --num_threads INTEGER RANGE Number of internal pipeline threads to use + [x>=1] + --n_dask_workers INTEGER RANGE Number of dask workers [x>=2] + --threads_per_dask_worker INTEGER RANGE + Number of threads per each dask worker + [x>=2] + --model_max_batch_size INTEGER RANGE + Max batch size to use for the model [x>=1] + --model_fea_length INTEGER RANGE + Features length to use for the model [x>=1] + --features_file TEXT File path for ransomware detection features + --model_name TEXT The name of the model that is deployed on + Tritonserver + --server_url TEXT Tritonserver url [required] + --sliding_window INTEGER RANGE Sliding window to be used for model input + request [x>=1] + --input_glob TEXT Input glob pattern to match files to read. + For example, + './input_dir/*/snapshot-*/*.json' would read + all files with the 'json' extension in the + directory 'input_dir'. [required] + --watch_directory BOOLEAN The watch directory option instructs this + stage to not close down once all files have + been read. Instead it will read all files + that match the 'input_glob' pattern, and + then continue to watch the directory for + additional files. Any new files that are + added that match the glob will then be + processed. + --output_file TEXT The path to the file where the inference + output will be saved. + --help Show this message and exit. + ``` diff --git a/examples/ransomware_detection/common/data_models.py b/examples/ransomware_detection/common/data_models.py new file mode 100644 index 0000000000..559ee50622 --- /dev/null +++ b/examples/ransomware_detection/common/data_models.py @@ -0,0 +1,56 @@ +# Copyright (c) 2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import dataclasses +import typing + +import pandas as pd + + +@dataclasses.dataclass +class FeatureConfig: + """ + This dataclass holds a features creation configuration. + """ + + file_extns: typing.List[str] + interested_plugins: typing.List[str] + features_with_zeros: typing.Dict[str, int] + + +@dataclasses.dataclass +class SnapshotData(object): + """ + This dataclass holds appshield snapshot data. + """ + + snapshot_id: int + data: typing.List[float] + + +@dataclasses.dataclass +class ProtectionData: + """ + This dataclass contains protection data that is used to construct protection features. + """ + + commit_charges: pd.Series + vads_protection_size: int + vad_protection_size: int + commit_charge_size: int + protection_df_size: int + protection_id: str + vadinfo_df_size: int + vadsinfo_size: int + vadinfo_size: int diff --git a/examples/ransomware_detection/common/feature_constants.py b/examples/ransomware_detection/common/feature_constants.py new file mode 100644 index 0000000000..0701a3cf95 --- /dev/null +++ b/examples/ransomware_detection/common/feature_constants.py @@ -0,0 +1,52 @@ +# Copyright (c) 2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +class FeatureConstants(): + + FILE_EXTN_EXP = '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL' + + FULL_MEMORY_ADDRESS = 2147483647 + + HANDLES_TYPES = [('Directory', 'directory'), ('TpWorkerFactory', 'tpworkerfactory'), + ('WaitCompletionPacket', 'waitcompletionpacket'), ('Section', 'section'), ('File', 'file'), + ('Mutant', 'mutant'), ('Event', 'event'), ('Semaphore', 'semaphore'), ('Key', 'key'), + ('IoCompletion', 'iocompletion'), ('ALPC Port', 'alpc port'), ('Thread', 'thread')] + + HANDLES_TYPES_2 = [('IoCompletionReserve', 'iocompletionreserve'), ('Desktop', 'desktop'), + ('EtwRegistration', 'etwregistration'), ('WindowStation', 'windowstation')] + + PROTECTIONS = { + 'PAGE_EXECUTE_READWRITE ': 'page_execute_readwrite', + 'PAGE_NOACCESS ': 'page_noaccess', + 'PAGE_EXECUTE_WRITECOPY ': 'page_execute_writecopy', + 'PAGE_READONLY ': 'page_readonly', + 'PAGE_READWRITE ': 'page_readwrite' + } + + WAIT_REASON_LIST = ['9', '31', '13'] + + VAD = 'Vad ' + + VADS = 'VadS' + + PAGE_NOACCESS = 'PAGE_NOACCESS ' + + PAGE_EXECUTE_READWRITE = 'PAGE_EXECUTE_READWRITE ' + + PAGE_EXECUTE_WRITECOPY = 'PAGE_EXECUTE_WRITECOPY ' + + PAGE_READONLY = 'PAGE_READONLY ' + + PAGE_READWRITE = 'PAGE_READWRITE ' diff --git a/examples/ransomware_detection/common/feature_extractor.py b/examples/ransomware_detection/common/feature_extractor.py new file mode 100644 index 0000000000..a8a810a0c4 --- /dev/null +++ b/examples/ransomware_detection/common/feature_extractor.py @@ -0,0 +1,623 @@ +# Copyright (c) 2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import typing + +import pandas as pd +from common.data_models import FeatureConfig +from common.data_models import ProtectionData +from common.feature_constants import FeatureConstants as fc + + +class FeatureExtractor(): + """ + This is a helper class to extract required features for ransomware detection pipeline. + """ + + def __init__(self, config: FeatureConfig) -> None: + self._config = config + self._features = None + + def _filter_by_pid_process(self, plugin_dict: typing.Dict[str, pd.DataFrame], + pid_process: str) -> typing.Dict[str, pd.DataFrame]: + """ + This function filter plugins data by pid_process. + """ + + filtered_plugin_dict = {} + + for plugin_name in plugin_dict.keys(): + plugin_df = plugin_dict[plugin_name] + plugin_df = plugin_df[plugin_df.PID_Process == pid_process] + filtered_plugin_dict[plugin_name] = plugin_df + + return filtered_plugin_dict + + def _count_double_extension(self, file_paths: typing.List[str]): + """ + This function counts the amount of double extensions to a common type files and + return the largest double extension. + """ + + count = 0 + max_ext_word_dot = 0 + + for file_path in file_paths: + + file_split_dot = file_path.split('.') + + split_dot = file_split_dot[:-1] + + if len(split_dot) > 1: + + for word_dot in split_dot: + + if word_dot in self._config.file_extns: + count += 1 + index_word_dot = file_split_dot.index(word_dot) + ext_word_dot = ".".join(file_split_dot[index_word_dot + 1:]) + if len(ext_word_dot) > max_ext_word_dot: + max_ext_word_dot = len(ext_word_dot) + + break + + self._features['count_double_extension_count_handles'] = count + self._features['double_extension_len_handles'] = max_ext_word_dot + + def _extract_envars(self, x: pd.DataFrame): + """ + This function extracts environment features. + """ + + x = x[x.Variable.str.contains('PATHEXT', regex=False)] + x = x[x.Value.str.contains(fc.FILE_EXTN_EXP, regex=False)] + + if not x.empty: + self._features['envirs_pathext'] = 1 + + self._features['envars_df_count'] = len(x) + + def _extract_threadlist(self, x: pd.DataFrame): + """ + # Count amount of unique states and wait reasons and thread with state and waitreason: + # '2'-'Running' + # '9'-'WrPageIn' + # '13'-'WrUserRequest' + # '31'-'WrDispatchInt' + """ + + x_state2 = x[x.State == '2'] + x_state_unique = x.State.unique() + x_waitreason_unique = x.WaitReason.unique() + + self._features['threadlist_df_count'] = len(x) + self._features['threadlist_df_state_2'] = len(x_state2) + self._features['threadlist_df_state_unique'] = len(x_state_unique) + self._features['threadlist_df_wait_reason_unique'] = len(x_waitreason_unique) + + for wait_reason in fc.WAIT_REASON_LIST: + wait_reason_df = x[x.WaitReason == wait_reason] + self._features['threadlist_df_wait_reason_' + wait_reason] = len(wait_reason_df) + + def _extract_vad_cc(self, cc: pd.Series): + """ + This function extracts 'vad' specific commit charge features. + """ + + cc_size = len(cc) + + # Calculate mean, max, sum of commit charged of vad + if cc_size: + self._features['get_commit_charge_mean_vad'] = cc.mean() + self._features['get_commit_charge_max_vad'] = cc.max() + self._features['get_commit_charge_sum_vad'] = cc.sum() + + def _extract_cc(self, cc: pd.Series): + """ + This function extracts commit charge features. + """ + + cc_size = len(cc) + + # Calculate mean, max, sum, len of the commit charged + if cc_size: + self._features['get_commit_charge_mean'] = cc.mean() + self._features['get_commit_charge_max'] = cc.max() + self._features['get_commit_charge_sum'] = cc.sum() + self._features['get_commit_charge_len'] = cc_size + + def _extract_vads_cc(self, cc: pd.Series, vads_cc: pd.Series): + """ + This function extracts 'vads' commit charge features. + """ + + cc_size = len(cc) + + # Calculate min of commit charged of vads + if cc_size: + self._features['get_commit_charge_min_vads'] = cc.min() + + # Calculate the amount of entire memory commit charged of vads + cc = vads_cc[vads_cc == fc.FULL_MEMORY_ADDRESS] + self._features['count_entire_commit_charge_vads'] = len(cc) + + def _extract_cc_vad_page_noaccess(self, cc: pd.Series): + """ + This function extracts 'vad' commit charge features specific to 'page_noaccess' protection. + """ + + cc = cc[cc < fc.FULL_MEMORY_ADDRESS] + + # Calculate min and mean of commit charged of vad memory with PAGE_NOACCESS protection + if not cc.empty: + self._features['get_commit_charge_min_vad_page_noaccess'] = cc.min() + self._features['get_commit_charge_mean_vad_page_noaccess'] = cc.mean() + + def _extract_unique_file_extns(self, x: pd.DataFrame): + """ + This function extracts unique file extenstion featurs. + """ + + vadinfo_files = x[x.File != 'N/A'].File + + # Count the amount of unique file extensions + if not vadinfo_files.empty: + unique_file_extns = vadinfo_files.str.lower().str.extract('(\\.[^.]*)$')[0].dropna().unique() + self._features['get_count_unique_extensions'] = len(unique_file_extns) + + def _extract_vadinfo(self, x: pd.DataFrame): + """ + This function extracts vadinfo features about commit charged, vad/vads and + private memory and memory protection type. + """ + + # CommitCharge - is the total amount of virtual memory of all processes that + # must be backed by either physical memory or the page file + # vad - virtual address descriptor + # vads - virtual address descriptor short + # private memory - this field refers to committed regions that cannot be shared with other processes. + + # Calculate the commit charges of vad and vads + vad_cc = x[x.Tag == fc.VAD].CommitCharge + vads_cc = x[x.Tag == fc.VADS].CommitCharge + + vadinfo_size = len(vad_cc) + vadsinfo_size = len(vads_cc) + + vad_size = len(x) + + private_memory_one_df = x[x.PrivateMemory == '1'] + vad_private_memory_len = len(private_memory_one_df) + + # Count vad, vads and private memory amount + self._features['vad_count'] = vadinfo_size + self._features['vads_count'] = vadsinfo_size + self._features['count_private_memory'] = len(private_memory_one_df) + + # Calculate the ratio of vad and private memory in reduce time delay bias + if vad_size: + self._features['ratio_private_memory'] = (vad_private_memory_len / vad_size) + self._features['vad_ratio'] = (vadinfo_size / vad_size) + + cc = x[x.CommitCharge < fc.FULL_MEMORY_ADDRESS].CommitCharge + self._extract_cc(cc) + + # calculating the amount of commit charged of vad + cc = vad_cc[vad_cc < fc.FULL_MEMORY_ADDRESS] + self._extract_vad_cc(cc) + + # Calculate the amount of commit charged of vads + cc = vads_cc[vads_cc < fc.FULL_MEMORY_ADDRESS] + self._extract_vads_cc(cc, vads_cc) + + # calculating commit charged of memory with PAGE_NOACCESS protection + cc = x[(x.Protection == fc.PAGE_NOACCESS) & (x.Tag == fc.VAD)].CommitCharge + self._extract_cc_vad_page_noaccess(cc) + + self._extract_protections(x, vad_size, vadsinfo_size, vadinfo_size) + + self._extract_unique_file_extns(x) + + def _get_protection_data(self, + x: pd.DataFrame, + protection: str, + vadinfo_df_size: int, + vadsinfo_size: int, + vadinfo_size: int): + """ + This function creates protection data instance. + """ + + protection_df = x[x.Protection == protection] + cc = protection_df.CommitCharge + cc = cc[cc < fc.FULL_MEMORY_ADDRESS] + vads_protection_size = len(protection_df[protection_df.Tag == fc.VADS]) + vad_protection_size = len(protection_df[protection_df.Tag == fc.VAD]) + commit_charge_size = len(cc) + protection_df_size = len(protection_df) + protection_id = fc.PROTECTIONS[protection] + + p_data = ProtectionData(cc, + vads_protection_size, + vad_protection_size, + commit_charge_size, + protection_df_size, + protection_id, + vadinfo_df_size, + vadsinfo_size, + vadinfo_size) + + return p_data + + def _page_execute_readwrite(self, x: ProtectionData): + """ + This function extracts 'page_execute_readwrite' protection reelated features. + """ + + cc = x.commit_charges + + if x.commit_charge_size: + self._features['get_commit_charge_mean_page_execute_readwrite'] = cc.mean() + self._features['get_commit_charge_min_page_execute_readwrite'] = cc.min() + self._features['get_commit_charge_max_page_execute_readwrite'] = cc.max() + self._features['get_commit_charge_sum_page_execute_readwrite'] = cc.sum() + self._features['get_commit_charge_std_page_execute_readwrite'] = cc.std(ddof=0) + + # Calculate amount and ratio of memory pages with 'PAGE_EXECUTE_READWRITE protection + if x.protection_df_size: + self._features['page_execute_readwrite_count'] = x.protection_df_size + self._features['page_execute_readwrite_ratio'] = (x.protection_df_size / x.vadinfo_df_size) + + if x.vads_protection_size: + # Calculate amount and ratio of vads memory pages with 'PAGE_EXECUTE_READWRITE' protection + self._features['page_execute_readwrite_vads_count'] = x.vads_protection_size + self._features['page_execute_readwrite_vads_ratio'] = (x.vads_protection_size / x.vadsinfo_size) + + def _page_noaccess(self, x: ProtectionData): + """ + This function extracts 'page_noaccess' protection reelated features. + """ + + cc = x.commit_charges + + if x.commit_charge_size: + self._features['get_commit_charge_mean_page_no_access'] = cc.mean() + self._features['get_commit_charge_min_page_no_access'] = cc.min() + self._features['get_commit_charge_max_page_no_access'] = cc.max() + self._features['get_commit_charge_sum_page_no_access'] = cc.sum() + + # Calculate amount and ratio of memory pages with 'PAGE_NOACCESS' protection + if x.protection_df_size: + self._features['page_no_access_count'] = x.protection_df_size + self._features['page_no_access_ratio'] = (x.protection_df_size / x.vadinfo_df_size) + + # Calculate amount and ratio of vad and vads memory pages with 'PAGE_NOACCESS' protection + self._features['page_no_access_vads_count'] = x.vads_protection_size + self._features['page_no_access_vad_count'] = x.vad_protection_size + + if x.vads_protection_size: + self._features['page_no_access_vads_ratio'] = (x.vads_protection_size / x.vadsinfo_size) + + if x.vad_protection_size: + self._features['page_no_access_vad_ratio'] = (x.vad_protection_size / x.vadinfo_size) + + def _page_execute_writecopy(self, x: ProtectionData): + """ + This function extracts 'page_execute_writecopy' protection reelated features. + """ + + cc = x.commit_charges + + # Calculate min and sum of commit charged with memory pages with 'PAGE_EXECUTE_WRITECOPY' protection + if x.commit_charge_size: + self._features['get_commit_charge_min_page_execute_writecopy'] = cc.min() + self._features['get_commit_charge_sum_page_execute_writecopy'] = cc.sum() + + # Calculate amount and ratio of vad memory pages with 'PAGE_EXECUTE_WRITECOPY' protection + self._features['page_execute_writecopy_vad_count'] = x.vad_protection_size + if x.vad_protection_size: + self._features['page_execute_writecopy_vad_ratio'] = (x.vad_protection_size / x.vadinfo_size) + + def _page_readonly(self, x: ProtectionData): + """ + This function extracts 'page_readonly' protection reelated features. + """ + + cc = x.commit_charges + + # Calculate mean of commit charged with memory pages with 'PAGE_READONLY' protection + if x.commit_charge_size: + self._features['get_commit_charge_mean_page_readonly'] = cc.mean() + + # Calculate amount and ratio of memory pages with 'PAGE_READONLY' protection + if x.protection_df_size: + self._features['page_readonly_count'] = x.protection_df_size + self._features['page_readonly_ratio'] = (x.protection_df_size / x.vadinfo_df_size) + + # Calculate amount and ratio of vad and vads memory pages with 'PAGE_READONLY' protection + self._features['page_readonly_vads_count'] = x.vads_protection_size + self._features['page_readonly_vad_count'] = x.vad_protection_size + + if x.vads_protection_size: + self._features['page_readonly_vads_ratio'] = (x.vads_protection_size / x.vadsinfo_size) + + if x.vad_protection_size: + self._features['page_readonly_vad_ratio'] = (x.vad_protection_size / x.vadinfo_size) + + def _page_readwrite(self, x: ProtectionData): + """ + This function extracts 'page_readwrite' protection reelated features. + """ + + # Calculate ratio of memory pages with 'PAGE_READWRITE' protection + if x.protection_df_size: + self._features['page_readwrite_ratio'] = (x.protection_df_size / x.vadinfo_df_size) + + # Calculate amount and ratio of vad and vads memory pages with 'PAGE_READWRITE' protection + self._features['page_readwrite_vads_count'] = x.vads_protection_size + self._features['page_readwrite_vad_count'] = x.vad_protection_size + + if x.vads_protection_size: + self._features['page_readwrite_vads_ratio'] = (x.vads_protection_size / x.vadsinfo_size) + + if x.vad_protection_size: + self._features['page_readwrite_vad_ratio'] = (x.vad_protection_size / x.vadinfo_size) + + def _extract_protections(self, x: pd.DataFrame, vadinfo_df_size: int, vadsinfo_size: int, vadinfo_size: int): + """ + This function extracts protection features related to vadinfo plugin. + """ + page_execute_writecopy_count = 0 + + for protection in fc.PROTECTIONS.keys(): + + p_data = self._get_protection_data(x, protection, vadinfo_df_size, vadsinfo_size, vadinfo_size) + + # Calculate features related to memory pages with 'PAGE_EXECUTE_READWRITE' access + if protection == fc.PAGE_EXECUTE_READWRITE: + # Calculate mean, min, max, sum and std of commit charged with memory pages with 'PAGE_EXECUTE_READWRITE + # protection + self._page_execute_readwrite(p_data) + + # Calculate features related to memory pages with 'PAGE_NOACCESS' access + elif protection == fc.PAGE_NOACCESS: + # Calculate mean, min, max and sum of commit charged with memory pages with 'PAGE_NOACCESS' + # protection + self._page_noaccess(p_data) + + # Calculate features related to memory pages with 'PAGE_EXECUTE_WRITECOPY' access + elif protection == fc.PAGE_EXECUTE_WRITECOPY: + self._page_execute_writecopy(p_data) + page_execute_writecopy_count = p_data.protection_df_size + + # Calculate features related to memory pages with 'PAGE_READONLY' access + elif protection == fc.PAGE_READONLY: + self._page_readonly(p_data) + + # Calculate features related to memory pages with 'PAGE_READWRITE' access + elif protection == fc.PAGE_READWRITE: + self._page_readwrite(p_data) + + else: + continue + + # Count the amount of unique file paths in vadinfo + self._features['vadinfo_df_path_unique'] = len(x.File.unique()) + self._features['vads_page_execute_writecopy_ratio'] = vadsinfo_size / (page_execute_writecopy_count + 1) + + def _extract_handle_types(self, x: pd.DataFrame): + """ + This function extracts file handle type features from handles plugin. + """ + + # Get count and ratio for the handles by their type. + for t in (fc.HANDLES_TYPES + fc.HANDLES_TYPES_2): + + df = x[x.Type == t[0]] + df_len = len(df) + + if t in fc.HANDLES_TYPES: + col = 'handles_df_' + t[1] + '_count' + self._features[col] = df_len + + col = 'handles_df_' + t[1] + '_ratio' + self._features[col] = df_len / (self._features['handles_df_count'] + 1) + + def _extract_file_handle_dirs(self, file_paths: pd.Series): + """ + This function extracts file handle directory features from handles plugin. + """ + + filepath_split_df = file_paths[file_paths.str.split('\\').str.len() > 3].str.split('\\', expand=True) + + if not filepath_split_df.empty: + # Count the unique directories + directories_uniques_count = len(file_paths.str.extract('^(.*)\\\\.*')[0].unique()) + if len(filepath_split_df) > 3: + filepath_split_df = filepath_split_df[(~filepath_split_df[4].isna()) + & (filepath_split_df[1] == 'device') & + (filepath_split_df[2].str.contains('harddisk'))] + + windows = filepath_split_df[filepath_split_df[3].str.contains('windows')] + users = filepath_split_df[filepath_split_df[3].str.contains('users')] + + # Count handles files of personal users directories + self._features['file_users_exists'] = len(users) + + # Count handles files of Windows directories + self._features['file_windows_count'] = len(windows) + + # Count amount of unique directories + self._features['count_directories_handles_uniques'] = directories_uniques_count + + def _extract_handles(self, x: pd.DataFrame): + """ + This function extracts features related to handles such as amount and ratio of each handle type. + """ + + # Amount of files path in handles files + file_paths = x[x.Type == 'File'].Name.str.lower() + + file_paths = file_paths[(~file_paths.isna()) & (file_paths != '')] + + # Count handles files with double extensions + self._count_double_extension(file_paths=list(file_paths)) + + # Count handles files with common extension + file_extensions = file_paths.str.extract('\\.([^.]*)$')[0].dropna() + + file_extns = file_extensions[file_extensions.isin(self._config.file_extns)] + self._features['check_doc_file_handle_count'] = len(file_extns) + + self._extract_file_handle_dirs(file_paths) + + # Count unique file handles extensions + self._features['count_extension_handles_uniques'] = len(file_extensions.unique()) + + # Count number of handles + self._features['handles_df_count'] = len(x) + name_unique_count = len(x.Name.unique()) + + # Count handles with unique name + self._features['handles_df_name_unique'] = name_unique_count + + # Calculate the ratio of handles with unique name + self._features['handles_df_name_unique_ratio'] = name_unique_count / (self._features['handles_df_count'] + 1) + + type_unique_count = len(x.Type.unique()) + + # Count the amount of unique handles type + self._features['handles_df_type_unique'] = type_unique_count + + # Calculate the ratio of handles with unique type + self._features['handles_df_type_unique_ratio'] = type_unique_count / (self._features['handles_df_count'] + 1) + + self._extract_handle_types(x) + + def _extract_ldrmodules(self, x: pd.DataFrame): + """ + This function extracts size of the ldrmodules process and it's path. + """ + + if not x.empty: + process = x.Process.iloc[0].lower() + x = x[x.Name.str.contains(process)] + if not x.empty: + self._features['ldrmodules_df_size_int'] = int(x.Size.iloc[0], 16) + self._features['ldrmodules_df_path'] = x.Path.iloc[0] + else: + self._features['ldrmodules_df_path'] = "" + + def extract_features(self, x: pd.DataFrame) -> pd.DataFrame: + """ + This function extracts all different ransomware features. + + Parameters + ---------- + x : `pandas.DataFrame` + Dataframe with appshield snapshot data. + + Returns + ------- + pandas.DataFrame + Ransomware features dataframe. + """ + + features_per_pid_process = [] + + # Get unique PID_Process for a given snapshot + pid_processes = list(x["PID_Process"].unique()) + + # Filter snapshot data by plugin + plugin_dict = {plugin: x[x.plugin == plugin] for plugin in self._config.interested_plugins} + + # Filter plugin per pid_process and create features + for pid_process in pid_processes: + + # Setting default values to features all keys. + self._features = self._config.features_with_zeros.copy() + + fltr_plugin_dict = self._filter_by_pid_process(plugin_dict, pid_process) + + try: + ldrmodules_df = fltr_plugin_dict['ldrmodules'] + threadlist_df = fltr_plugin_dict['threadlist'] + envars_df = fltr_plugin_dict['envars'] + vadinfo_df = fltr_plugin_dict['vadinfo'] + handles_df = fltr_plugin_dict['handles'] + + except KeyError as e: + raise KeyError('Missing required plugins: %s' % (e)) + + # Envars plugin features displays a process's environment variables. + # Typically this will show the number of CPUs installed and the hardware architecture, + # the process's current directory, temporary directory, session name, computer name, user name, + # and various other interesting artifacts. + self._extract_envars(envars_df) + + # Threadlist plugin features displays the threads that are used by a process. + self._extract_threadlist(threadlist_df) + + # VadInfo plugin features displays extended information about a process's VAD nodes. + # In particular, it shows: + # - The address of the MMVAD structure in kernel memory + # - The starting and ending virtual addresses in process memory that the MMVAD structure pertains to + # - The VAD Tag + # - The VAD flags, control flags, etc + # - The name of the memory mapped file (if one exists) + # - The memory protection constant (permissions) + self._extract_vadinfo(vadinfo_df) + + # Handles plugin features displays the open handles in a process, use the handles command. + # This applies to files, registry keys, mutexes, named pipes, events, window stations, desktops, threads, + # and all other types of securable executive objects. + self._extract_handles(handles_df) + + # LdrModules plugin features displays a process's loaded DLLs. LdrModules detects a dll-hiding or injection + # kind of activities in a process memory. + self._extract_ldrmodules(ldrmodules_df) + + # Add pid_process + self._features['pid_process'] = pid_process + + # Add pid_process features to a list + features_per_pid_process.append(self._features) + + # Convert list of pid_process features to a dataframe + features_df = pd.DataFrame.from_dict(features_per_pid_process) + + # Snapshot id is used to determine which snapshot the pid_process belongs to + features_df['snapshot_id'] = x.snapshot_id.iloc[0] + + # Add timestamp. Here we consider only ldrmodules timestamp for all the entries. + features_df['timestamp'] = plugin_dict['ldrmodules'].timestamp.iloc[0] + + return features_df + + @staticmethod + def combine_features(x: typing.List[pd.DataFrame]) -> pd.DataFrame: + """ + This function combines features of multiple snapshots to a single dataframe + + Parameters + ---------- + x : `typing.List[pd.DataFrame]` + Features of multiple snapshots. + + Returns + ------- + pandas.DataFrame + Ransomware features dataframe. + """ + return pd.concat(x) diff --git a/examples/ransomware_detection/config/ransomware_detection.yaml b/examples/ransomware_detection/config/ransomware_detection.yaml new file mode 100644 index 0000000000..1184d1ec2b --- /dev/null +++ b/examples/ransomware_detection/config/ransomware_detection.yaml @@ -0,0 +1,173 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- +file_extensions: + - doc + - docx + - html + - htm + - odt + - pdf + - xls + - xlsx + - ods + - ppt + - pptx + - txt + - csv + - jpg + - jpeg + - png + - zip + - gif + - bmp + - dmp + - 7z + - rar + - msg +model_features: + - envirs_pathext + - count_double_extension_count_handles + - page_readonly_vads_count + - double_extension_len_handles + - get_commit_charge_max_vad + - count_entire_commit_charge_vads + - get_commit_charge_min_vad_page_noaccess + - check_doc_file_handle_count + - envars_df_count + - page_noaccess_vad_count + - get_commit_charge_min_vads + - get_commit_charge_mean_vad_page_noaccess + - page_noaccess_vad_ratio + - handles_df_directory_count + - threadlist_df_wait_reason_9 + - page_noaccess_count + - get_commit_charge_mean_page_noaccess + - ldrmodules_df_size_int + - get_commit_charge_max_page_execute_readwrite + - ratio_private_memory + - get_commit_charge_max_page_noaccess + - page_readwrite_ratio + - get_commit_charge_mean_page_execute_readwrite + - handles_df_section_ratio + - vad_ratio + - page_noaccess_ratio + - page_execute_writecopy_vad_ratio + - handles_df_section_count + - handles_df_tpworkerfactory_count + - page_readonly_count + - handles_df_waitcompletionpacket_count + - get_commit_charge_mean_page_readonly + - page_readonly_vad_ratio + - handles_df_event_ratio + - handles_df_semaphore_ratio + - get_commit_charge_sum_page_execute_readwrite + - threadlist_df_state_2 + - handles_df_iocompletionreserve_count + - handles_df_directory_ratio + - handles_df_iocompletionreserve_ratio + - get_commit_charge_mean_vad + - get_commit_charge_sum_page_execute_writecopy + - page_execute_readwrite_ratio + - get_commit_charge_min_page_execute_readwrite + - threadlist_df_wait_reason_31 + - get_commit_charge_sum_page_noaccess + - page_readwrite_vads_ratio + - handles_df_mutant_ratio + - get_commit_charge_sum_vad + - get_commit_charge_max + - handles_df_type_unique + - handles_df_iocompletion_ratio + - handles_df_waitcompletionpacket_ratio + - handles_df_tpworkerfactory_ratio + - vadinfo_df_path_unique + - vad_count + - page_readonly_ratio + - count_private_memory + - page_execute_readwrite_vads_ratio + - vads_page_execute_writecopy_ratio + - handles_df_file_ratio + - handles_df_etwregistration_ratio + - handles_df_key_ratio + - get_commit_charge_min_page_noaccess + - page_readonly_vads_ratio + - handles_df_thread_ratio + - handles_df_file_count + - handles_df_thread_count + - threadlist_df_count + - get_commit_charge_len + - get_commit_charge_min_page_execute_writecopy + - "handles_df_alpc port_ratio" + - file_users_exists + - file_windows_count + - handles_df_key_count + - threadlist_df_wait_reason_13 + - threadlist_df_wait_reason_unique + - handles_df_semaphore_count + - handles_df_name_unique_ratio + - threadlist_df_state_unique + - get_count_unique_extensions + - handles_df_name_unique + - page_noaccess_vads_ratio + - handles_df_event_count + - page_readwrite_vad_ratio + - "handles_df_alpc port_count" + - get_commit_charge_std_page_execute_readwrite + - count_directories_handles_uniques + - count_extension_handles_uniques + - page_readwrite_vad_count + - get_commit_charge_sum + - get_commit_charge_mean + - handles_df_desktop_ratio + - handles_df_count + - handles_df_mutant_count + - handles_df_windowstation_ratio + - page_execute_readwrite_vads_count + - handles_df_type_unique_ratio + - page_execute_readwrite_count + - ldrmodules_df_path +raw_columns: + - Base + - Block + - CommitCharge + - "End VPN" + - File + - GrantedAccess + - HandleValue + - InInit + - InLoad + - InMem + - Name + - Offset + - PID + - Parent + - Path + - PrivateMemory + - Process + - Protection + - SHA256 + - Size + - "Start VPN" + - State + - TID + - Tag + - Type + - Value + - Variable + - WaitReason + - plugin + - snapshot_id + - timestamp diff --git a/examples/ransomware_detection/models/ransomw-model-long-rf/1/checkpoint.tl b/examples/ransomware_detection/models/ransomw-model-long-rf/1/checkpoint.tl new file mode 100644 index 0000000000000000000000000000000000000000..c675828e25e6cfe63d6f41334bd19099be203c41 GIT binary patch literal 1004264 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%0A^Qnb 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 literal 0 HcmV?d00001 diff --git a/examples/ransomware_detection/models/ransomw-model-long-rf/config.pbtxt b/examples/ransomware_detection/models/ransomw-model-long-rf/config.pbtxt new file mode 100644 index 0000000000..92b7bce7e0 --- /dev/null +++ b/examples/ransomware_detection/models/ransomw-model-long-rf/config.pbtxt @@ -0,0 +1,52 @@ +name: "ransomw-model-long-rf" +backend: "fil" +max_batch_size: 8192 +input [ + { + name: "input__0" + data_type: TYPE_FP32 + dims: [ 990 ] + } +] +output [ + { + name: "output__0" + data_type: TYPE_FP32 + dims: [ 2 ] + } +] +instance_group [{ kind: KIND_GPU }] +parameters [ + { + key: "model_type" + value: { string_value: "treelite_checkpoint" } + }, + { + key: "predict_proba" + value: { string_value: "true" } + }, + { + key: "output_class" + value: { string_value: "true" } + }, + { + key: "threshold" + value: { string_value: "0.5" } + }, + { + key: "algo" + value: { string_value: "ALGO_AUTO" } + }, + { + key: "storage_type" + value: { string_value: "AUTO" } + }, + { + key: "blocks_per_sm" + value: { string_value: "0" } + } +] + +dynamic_batching { + max_queue_delay_microseconds: 100 +} diff --git a/examples/ransomware_detection/models/ransomw-model-medium-rf/1/checkpoint.tl b/examples/ransomware_detection/models/ransomw-model-medium-rf/1/checkpoint.tl new file mode 100644 index 0000000000000000000000000000000000000000..50fbb3104c854158ca68066c136cf3c92f7c53ff GIT binary patch literal 1670024 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

-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℘iDBU+*zajgsKTDQL#W5dFG~&V% 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
<}W9^7`m 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 IudxLF5ArvGcK`qY literal 0 HcmV?d00001 diff --git a/examples/ransomware_detection/models/ransomw-model-medium-rf/config.pbtxt b/examples/ransomware_detection/models/ransomw-model-medium-rf/config.pbtxt new file mode 100644 index 0000000000..206d1e359e --- /dev/null +++ b/examples/ransomware_detection/models/ransomw-model-medium-rf/config.pbtxt @@ -0,0 +1,52 @@ +name: "ransomw-model-medium-rf" +backend: "fil" +max_batch_size: 8192 +input [ + { + name: "input__0" + data_type: TYPE_FP32 + dims: [ 495 ] + } +] +output [ + { + name: "output__0" + data_type: TYPE_FP32 + dims: [ 2 ] + } +] +instance_group [{ kind: KIND_GPU }] +parameters [ + { + key: "model_type" + value: { string_value: "treelite_checkpoint" } + }, + { + key: "predict_proba" + value: { string_value: "true" } + }, + { + key: "output_class" + value: { string_value: "true" } + }, + { + key: "threshold" + value: { string_value: "0.5" } + }, + { + key: "algo" + value: { string_value: "ALGO_AUTO" } + }, + { + key: "storage_type" + value: { string_value: "AUTO" } + }, + { + key: "blocks_per_sm" + value: { string_value: "0" } + } +] + +dynamic_batching { + max_queue_delay_microseconds: 100 +} diff --git a/examples/ransomware_detection/models/ransomw-model-short-rf/1/checkpoint.tl b/examples/ransomware_detection/models/ransomw-model-short-rf/1/checkpoint.tl new file mode 100644 index 0000000000000000000000000000000000000000..c855c42d9fbfb83996af0584ecaf1ab67c0a1169 GIT binary patch literal 2075784 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 z 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%0Dc+|c{JeBz)xy`+SL`?Ivw#* zv#B?Z)$Q*`Ru_zvbry{G`Xl>Db*xV39CRF+2yw6{Xs~o03gYQl+P)d5eeSN};zMEr z;N?8dl1u6%*zA|o>~bP+tD-87`i?-B1#I^+{7{Oy-{1imOd~mpzVjn0{7p9%ml)FM zd~*)s;HaR~LKp;3DR`vh$2+A|oZ`#peB>S5Kh7rw3iYgZ;z&&WrMLzl8I+zJ7 zl_aN%=BU?=!d17v!}m>7LmKs0OTjnpU#iAzs!Ki0?gTRVv;UC zN`i!Tuaqd0_4|?PYP)9zj34lELEe1<*E4_g=ess+cYnZS1Ac`#DckC$#q|ncb-@4Fa))eRcg~>4go@W4L z%n3XfwuodC`lo-h;_sW~l>cSEb)orK_3i(eUYxaq=!-(2YaG3=8WY3if<(AS zSX!Z8tmnV&BXEDyP`_tBZO8nLd;JAMY98RXh=Ze8@{vAlIGVEI^4fNv(ASn1(((ac z(cr8^Jipr~W?FB}H(R3u{zY~goJ1wa67s`g0pJOOyrn`t*Uw-1eOMuUk6Q8NgKtK5 zlo;LUJ-|d!6YxGo@*Nq0f9{VtP^5IOO1cH5Pv z3x$>ghUbgyC_m=RnSErc<3RbTIb~MNwvE`YscldKK7hE$f}QG0qOHH0Ep@{RiGNY$ z1p}r$@D0RSMije9va!>E6h_~sp3E6W(8gQ=qCbsOwj4o3y$l!%)r`RBLq)(; z0_NU>x9_>1L%5FCPMTL_O~4hC`@Fl~L37tuZ2sO;WjMDgz%x;wL1|9)CXa=7A2)Jf z_c^O@&vtjOBV(Mok4IS>F$U{tdo$uN$pLleX?E)#>Ce5z>&RH1xvxg?J+DN0(ez9FDaLwne~;A!oCIyqmAt2>?|(Y0r}#Zcl<7*I`{Pe{$63jR z`-E7}IuKD8_!hRiH9F#w?mf9O%YEM$lh3QqY3hrkYX<-?!w(~vPmA}n{p1~)GZXJ; z^&w{iV7#BnFA6{KlP(L_`<*APKJ6`H{=B8*Zew!Y4lLCO$x<3Z5?wp6mp?yP^IA=S zRG-;&(-8~Kj~YWdJTonTmoaNvX`CRiM?m^!H>ct_(zu_oXE&C^hg_YX`TeXZ6h(dV z@GCn??RoB!zoZ;E;w&-2*_v$_v|nv^#kbDguNxK3FjF_4Nc&IvEx8KeT2g1{N9Xm% zWPEN-|ug0<9-WW0MixtGA|F>p*O_wbf!(5@kd+X+Er(I zaqqceK7Tis=l=7L+6|4#_&Pc?Fz=U4bw`s?#vq6_#wpqB2>n`#cZOr%2Dm}|FryH1 zCGY3gCJn#$aoD|&uL!l17?ZKQZkGoXe_r|)DQygbSYsT^ZX+;%aYC+e=JP+}{=(kh zG8X7cp8NCZUdF;8*0nsRYH{F{V!J5;&#y-V9u5444{^ct62=Hh?r-AOe7*B*p z10D_ht2F@gNjj&r6CIP%X$;u>WqXAEpOw7YhetFNXX{4e1U5s4vqpP(FeDDyu3eS zLi|o%8pxFvc&i4NMS2TyJblmisn`N5+A_rUW8W{kpn7?v z9DF4qJgQj7_bnRYUWdOx9N5`3@7q`g772bR;Cy^joLJeXtlD2PLV70Pe>lC!Rkljk z1l-2NpZ6wMRbRy^Yf#`<#;p0J@zN&rsP53#ZIKVQwUM1dJM1ny{Y1%o z=TsXjwOQl@hW;kQ4<(<1Yhs9vh1LJwKQc@>@P}2;c`%-;g_Wt#cyOaQ$K858$4!8IZIA-w?b9;_!E z1xT-j`(XWVr-q+gi#|VU^94Jwr4Ww`k|lc2;pyRvi7$#2#Qq8S?Q1l+H3gw_p5NE) z8?^G!(A_N(WL5ih5x~*DAIi&vJ)UXZc}g1pMv^?G6RS95eY$HawOGV8FDRR}gR*9# zyr!OorSzE59;%eP;EYl`aeoKndRk5QO(+4S(X|#}f0pe9+yB|fOFXcLK6QRw;6s`v z>h=CB#Fhd+!Q*5}x7H%y?uXS0#^726YNIRz?1$Hp#jgHDK84T&r=9c$}lgGSzN%jcW(b~GlkL5amYZNO0CIlFUM>704$Xj=xKYV*c=_Z-+ zIx;>#bDxnh&V2uvicqskz=QaDwjZOr-fM?mU%O}{eglB&tqL&QpJe!96uv?ltb`rE zTM|U}lfIezM(91xm|V5HyS8WdpGS0DV@$5=`Ij*WVi~R~gsK5&=C40XcHJ7H)t84a zc>dX3pFiuXVAXS1pUPRVQndeF>&5K(?yO%Y)C%E_T+4G0$L4695H9Fi9=#736T{JQ zN)6x^{B;ETFs+ZPMdfHJZOImf<4Bk{*w^O3b3#^gS{v!UjnMntrUyqW;kc(ZWQJ!g z_0b~E;w$;6g|NV}CPO2AzTkIvjoSfyR00kUUF#(&W)woMaQ1x=h5X8)E1b>Ey|&%& z*FWn+)t-fN#Q(ZJzXW_%O_<^8KwMp57+1-TWNAEkMOF#@?DU0|i!(OCZ#&h4%yg^? zW()-fM`@*F@Smr2&)e5;+eT8Ko5uZx-Q##1hFzaue9S0>T;a_7i?W6Y9_KPwu=Jat zm)fll77M6}`xlDmr|e&0c7JIILg-qczP!9fMS{h7$I!;R_w1=qS=DD_z%&6ahq#!E z?RF9Ixf!*4?9r6{ov&?d(wk%{wss|%C!8M??I2hBwEeWbplO$l+pjixLHaAj>wb;p zrR#bqZP!C{b^Ayn+!&{%=TZW?UspKuah6h?V)s*yJ-;3e{3mI^)4%_dTGMkb&NR@> zS%N3tqk;b*4fKI?p-hR6favh=5{@O|$Xg2A4?i45#s75qRy_S4_UAP?E3rm#AP5Gx zZhzp}L)?3mj@{|}MB`(T%Se5_wK%^^58h@S)JGlj(y=u4RYJXGN6wzNcBGc#c{z?8 zKNCiLt&wa)D;1~s9N`=l9OU$p?rhNFHZ&Uha7HQ|)6+RAt`nosXD+zV~{;+#d1aYN9H60gjDjdAAdi&H~EzQ8hHPuPDT zpKyLZ(*Du9NN~8SPsPXiP=m`Wr4(?pTg9ywcW`qRM{RS|9)CiEvyyB=JFME+YkA-R z^yN7_KUxoCay5qlf16NGEW;Jf-1hbh6qEs2?4R>dfIW1lL-@x%Yq6h!t;g;g)%ao~ zyXy9&i_EvBO`P`mRDHtrD!!i|v8rj5Zk_kpzrV%nvH*RtSpnwR z=ASw(Rdckp`vWE$Fn7I6=l@P8-DGNm6h_j*-{l@wJiqJ^odXztWtM~fPbHNQaPz07 zik~$@BlY~KjWj24KMgK}^hGc>w4K*EY->WaiO{(v^*L&7XnG%u_pBuE-n7K?Q+$US z-`YQOq|Q(lPq$uNzbGXPQtJsecDoO79@f)#e*6j|`p6nD95rzU_a2^czh-_OULJ;- z!i;g|bAQF>I0WlyP4oTiHFf#2{dQ>@V{D&Z%{KOn)PBQXejZ z?}Iq2rx!0w6K3b9_$uFGJt0>rX|-Sz>F{{Zu^;d8y~ZMtt0*wnuOnu*jvxz!er9>K zf6T6__*^LlnBu^5QC`rHdXq^o#PQT>{?J z?EYV;t<)w&h9R==Ok(Z>^iS>`QZ>4!y@26O$JViREbqlozpP;aXBr042%( z&-w%F%zV`5`m6xuh5$do{$icK=AiC7#I+hvEZCwPUhlL%m4G>0w9m;>F9^M-^0al# z@9Wdt#`|YwNTfc;VJJ^pU+@VLZM9V^$$2A^;&+dY`-}Nr(e%DWeRBIz9=w3IK=)0D z@_PfqYfVJoc6Gqi00x_<3_p}YM;DDD6Ie5`82JCNSt741`|!Eqte)_kaYC#>#TUe_ zfw7c5e}vFy8&6&Dy>D^#9KKJk_=2=PM?Z;+5;1Uf9el5`4kS`v0(YOVt}EP! zT;xFze(=}9hvVO7R_{yoATA6T+F6DlN}(MOR*-0UJk9h?zv@!7^R;VAUg5T+M8hxB zi?Kez_U;tOaP^^t2EcGHl;MYx{PD~(-FHww)UOh;C<~64oXMllePeP}Pj|mv;O@7H z6s;N6)O9`SeZZJp;oN^u&C6IA#JZB_{&%Fan8;InI{w&SVp|=)pu5kv$h|x9o^clS zdQf~iaF3By5pp%jTNsDjuCu96z{WT#t|?@ucB?}?4(7Kr)k0WcNodH2Z$E-noU{H( z=e)+`TAxlYBPZ>^d}RBG8Ll~02K?dl-Ya9h{H4*XI%<@6ba>dJB6xpsc76dWLJYV* zKS3M^c8#NU1Y>fAGk@NS=cjy^+f1J=p)%pXy)^o?lCwf3i}cEWsOL5F=MjBw7?bPs z6S_55gfVXYI!ez?`-`X-rQljhK=*4bk7fIRegA|t%d9%OS}OOmR**u+nlR3m9hoA2 zvtHNjtC8vSsyxf{;Ct_FAah$_xPK`)ILa>3c^XfH{%kxx@;1%`oawV257LC$3DETR zz?n7j3hKra>GB8f=vfZe#&!TqM^>K9e&~NI=_}}E{mSWWt{uZQi=7}BojZGJe%kL^mk6J8&jVyL(H$h5nM@!1E`n)<9-I;4nhG!$dx>cWwnqS4~=nb-G#w|y z{9J|~2f_P`;1uEMXtKT^+D{&-&b8t}BFxJz=LKA|tvm|e+q>+w;?%j4DvsK+=zJ4w z7c%CwlC{EQvRvv78`ljQqT&)l=0w2Z8l1Oui&liAzVk2kns^!aGIur?8M&DQX@bUc z3MET^deVl(aP%~i0E@P`A%YRFQIBd{%9ZS-o}aUNW){v5MKgKS7D?^95xib{ww4ZH zMtdk^ZLtIQXNRitl0j^8;JGH_gU1W%0KvCHMOCn1=iTq~18_~6v0lvI&s5el z!F!c5h@}*fDehQ8Z9F`^>e8&<<-_K_DDY`HA=VDY^)!F4T3MTKD3=9bQZA z*UH+Yvl@9;G7ie)X}kCL!pS%rrLkTt7U8nxieM+;4>8$*;oTisO?GEp(<$}z)fkSwlC9fnrjx7GZ4Wlc> zFUuN{|D8)UdZh|B{F_jTEk9x*XbYN?hW@O zzZ8MgqQKV>XR&;58Z15^c0Ag#V3-&B5|uSuu$D?j0p%q6+~6tR%W-@B*5ld;{B{lCDh2Q|9|2h? zn7pzOQ4Sbv^s<^3*-oPO9G+&(eI2}I0Is!E)@;Ctf-MzoK>sxS7o{i9Fw=uDHFxHFvYd?hU$%$qu!4N~Q?SHWSV8PfXDY*cw z8usb?u0hzZD*z@0816GN{Mbo8bynA3YUCVs^A#{q57wCmV6BUX zJR10K*FbY9kuoLvM5WK^KQ&_^FRA-}nu^r+dCZ-!p`+9}C>>jS0VmMltYq_6#L&>* z53@>+ODCzg_za`l`|%((B6HL^Uyr+U9t>4+bS_41;mz{VEHMfPQcRGn-@)TP*6fI-% zR^4}2`kbzsU}DdDsy-E4xM(w+Ae>*Jam!x^d9_h-icNbv%JWOJ?heV$s-srnOOf}} zJ{>^YpJLO#i8u(Ali+<44dpC$u)~j*_#H|*cc3P$u3Uv@~(0lWxta*B2_L>6$V)|@RBGPj7@UyR$q zMrsK-JY?-a=Wx_+!`Y5va^>wv{8+M@Jz3b_+H@*`9&^lUhj~)dLo|SzyY>lG!q-IAeX9`y>>b zFK_FxtQ{bU?~%{^)~tf%8}1*V*nIC{J*DvJRmm)2^4cn{&*)c|N~rZL2-T-H-<^ny zp8a$^87Q3Jy>+2?zjQGFjv>A87!&Ida9(y>@j8?jQ~k>_-5zAQy+6Djz8c>qnXdtds_ z$NQZ+jrp(JfQ(Xw99d0bOi3@r`V>CAr7+JNMjxZ;gOFM{XOf-H}yUk3~}Xw zk7#gNq?Q8iz=E_}hsgL|a0N&Y0p|L3)Vg(#iFp03yD}xJ{Y?CBX+^+L8|5dI7j>lP zB;EI^=QbX)YfnLZAI@33ClvGvMLUQk7~|ak-l<1EvP>D8$+B)!RzM=SrfNO^5J-Prf#!h5~cn8i;uQ=qni@C`QVhe`}X7 z+0^U7xE;*j2dD$G>H>57D)@MNPa(-6j;H2#N8}yU7=3ic^32y%IKv62$BA~;&upX- zms1;LxOxyt?d5Qvk=1ng21;}FfCaAo{b6s1sz*$o5AKd%*g7CVq~p-_`O$fkF}cDi z9t$I+E1b}QTP+VvzZu}{{EB16gb=GI z^=&o)hPi<3$l&*6btHjf4MqJ?$yPrC-xq5LskHB}K^z>Vl6GlOupd~eh*GUOTGf6{ zpI1$QVZI})S>-}fcUB!W>O@$X_}<-d-w5&i`nS#ne~$^ZBN&tGcJML=L98p>|NZx{ zOXB&3J_$Na(hKsw&nh=Rs}<(~;`y=cHr@UmSd6QBS}X}MqYyI2rEA{zLdA5iNJb$y z9vb8NMt7gS-Fp~Wg&BpAF^>7nj+**BMZGBR1%o}!2^q`lRQyit$EzbrN0w}WHO8@w zHr==f3vh)~dK2cxkhUV?^8oXCLLLqL=V`#x-~aR4)N@AW8famj#goIMf&VxS41hDD zOo@(s;sT4l)cX5rDpI+Ldp_k%t$(kmJ&vs*b1WGKMt7bT+g@M$TCtsKn}`pIbiDWq zanZ9E6(ZM#$-{?5IR-wf)>FmNF*Nn1&PJR?4tXdQ7UV6-k+@6wkkTrS7EA5MDL5Q> z=Ok*&;pw+jQ-l2z{+}Q1zJ_FuuT7H2SoXliDG>bi#`Dc4}C`hfR zvv#N)#R}2?XD9v(BxC?iBlMT7f6;Vhw-g7x=P<}kN!`jl= zKeIzz4q(xC{fyp>IVv9Wt^34mhzo$UoWR#m9+z4=)}Y57-S;8uH{DUY)MxZ{7`LDKUQ*OoKz*W|uRr2T z)!t;7&|#+9s{DHQ#Vz&x3IV1t@NKMTP>~|>Bnjepl0U~QC41xbUIY@00&~w5>)U1H z$Tl7X;bgB?9ND`M*IX#RMz}6yM^ktY(zTOE6B*(4DojZ9Bi@;-4;UN96|o)s)(`BriQ5A300-$teB8HsCcjN8F{jes%EM(Fd+m{|K&fW#1B z&Sw}ty!>t5Ue|}}ZKxl2y1DIB81`_YnY@Y+QwcZ#ulKdjU&%V(QSAlAd+q6o-yN%EftO=M}z>g8v)9=DD zLVbxm1&8cHC@#h~AUn~LuPz>0VuG?r&0^m$`UuJq!rPt-<^84H70SMqE>{eF-lMp6R0 zUsv+jTv7+IN4Ub7k3*V58O?x)Vt?^VH|;cOB-{s6cJ6-iYNh0Azoyp;YsJZN!avX}=!xOU+8uR)ph zd#A!$WLeE>8=$*?7Ae$lO0}|iowgtK7&h;F-}HSlXYHO+6)px`^=o!777^^&70!GO zr?Ywr-GvkFS{}8p7?UfU`{OfeKQbm)^4xu2mD$Ez$?F1%U4b?B5b*Wa6Yeh;0$#o= z?tM^QBOtZ|`&P##H~X3U=auq&MT^Sv7sN#`^$Mw7AhR8kkAgHA8L zIm_L?ahzVa4D0T5%-wGjnCqnnRIDefoXmdcf2;0W7P)<1_RiG~-^1<&xq1U<(dflr z60e7O1$!MEy$HWuBla^Yjgp{F7HR*_+OH3UVGgI;r)nXWlLkL$%v`3;BJ=r}d-nkq5V&aWRt^aq}b`i#7_BviNOc*nf8dgj0IRkcru`rH`(wcp&&ok%CA3N^kS z7A~N4!*q{cQJ!)htW@QQ|23A!a@a@!pH&lfjdM?)yW_f_UqijW<<&3k_P-(XH0Q)0 z{AV1N?v{CYIt(ZK&W4S25K|8Y&`sjx=_It>ie#dsn-8t`b~f0_p9{Eadt zI3i+ILJzl&;*Xk+j91?4e6`m54 zve(B}B%c=tf?%CG`8&<|fwoh68q}Vvv4KiWBp)rz@@Z1~6iu7qchRVCBRTLilm|!t z(vK)DaDKv0OSXj`V@-U#im_gmfv&l{s{-`HkgzSc@v`*auOS;u%kAvFcP zT>a+dJN7ufPni+wmG-r}pd2fB}1!1#EsY{5Z&}dyl9> zqvu!GJ;L|cl{HK+1YC&FU-~Am8abR>n_#RLSQDa%*8Q>q{UJUZZ~>HOJu>-~?mfQA z1A^WTTbfcmzwCg?0nFK$f^wx^M3M;lyb`$P<=H8o1~d9s36oa2)H`07ihl%LOrkT-1i|0!(4xYdr30kzjg{f&X3;1jfqvn7-w$#c82@Q#8z7bDpM2~9aUR8=VSfl%%cJ;=m|Jv|7 z?k7+TG8YH_j5urdGHb{fMIFi&DYMr+9mtG4xk?yf|Oz! z=9y3K3jM5Tiyw^}aQDx$kg*&vT=z2kP_ib>T#?Xo=IQW>^V1iF<8xYB6LuAGhkI}C zD~;qq5Vq}0_dW2Ixvx1yz~Lb~fnbOz4-C(F*^y=&ed;0sADxE2{hs;Dg2{zceO7=} zS~k~TN=~yxlKcX$eE8(gM^~OQxnC>2LL<^~zzVDgN0oqo$9lq%RkxN!3f}Ow~&u*SZp2*fqzK?t0JJV-!9;6Ag6Q~1mb%Fmzd2pkeB*~h*aGxABHgVdcR+H<` zeEd=m%B5@N9-}(fSHKM^Oy5{z-m-M|RSaLSsu9b7$O#jEZ+ z$2(4hye*Ohebmn6#WxaVk7M$bHCmH6dD%90(5+2Bc`oAjuaD8U-5knj0St3T*e&JI^W_c^Qo_ip3cCvj;$cEH86L7iD)o%A-TX# zLxt9CoABk{xC(kw>o@#r_HBTl_u(oshA08uFFSFupH;GN?6A{x?Mw$KuOl$r zzhpAQ`94_2I5y`+UGO2-dNFH1V|g~+S}T<3N}hSY?ga()1`go+3ykN} zqX2totB>v1?zPP4IY|T@9=fWhO}GD(JR11-)4)im5@kwsj=ZF$`{9S9RMqb^7_d&imPzYN ziX~~baUcjbDU@ZMZ))6Ef{y*E-$>&-j!qLiDX|vkTewN%ICHwIHkE{soCw&))w9{J zD@Z26sc>jWtwot-Nd&_t3&6*peGrA926kM3X{QXKBwCU`=h+1kdw|+ zw7C4zOnTBB<>;2N+qyxxMj;ubQG3)ejXZDZvLNsAjnp41ZrATO1^!&wQM|R(j-7=1 zrFc3Yn*V0OR;5(Eq=ZDUV_V?+v@+)Nl2X$S!O?`Px1+6H>#Dfakmd_K0p-Dwl{^w~ zQ5$|)?RysWk_K|61qS=13_lLCk_p23{gw5>%+Vd2s`99foZ2(;^0>&llDMYjN5RgQ z7dF5(LeAPfSdgdGM6oI;Ym&h4EGudA;_f7~lmo}_kywa5)FDl7vb#sH zDv$acas#*5$n%jt3-_1Dr)u6EA3JZjYJiy}hKz#;0EvpfKYK1-M z%Z2N}z9tFUQO11bqPjv`TQk#UTEmjUrp~%Z)0xD7H*$h8BCvrAf_-dcisA3ezb+qKE#u3J3Q@+ z7p_Sv0*Taac7d;_PeZ8&q12F7M-`c%`EPex48eYF-0p0QsDd;BR$z6A zs{sr?K^c>+x^Ffu7@f85lnC6fuO?)!1w0mUB`qNs+ctQspzZkcJ`I;SL9DDBos$oFv#OeLK5ioqS zOja{VRVC^J<>_q7AASCKWiwe@q+FdmQVBD8${HG&L&!=B9hYAe?w^xKpG%T7F|IXe z3YnV$|A9F9%B&@XjxBkTi%+f}HVM}*8tcV;EogHnl-^_4p*-8CYAbd7md5tF6c+jo z*J8UX&lqR1tm02j6K48!h7*0O2z7;Xzn=-shvH1`*NM2C+90c^vL*@AWK6dbKRmF9 z;$L~5qseo;ZjJR~BPCd|0-7HFYxGjhKoW~`Eib-XIP?9qT0yz3ffsA^Sy;*`$ZJM6 zPx;&h_1Ol}+XBP=P*$^s*OLO&0~Q!kyYQ{>UAQK&9YoVH96ZltmcwHCC&Ls{Tsd(3 zCJ*S^dHiGCN4o>WcLdIWxS)3zpXk2*S*g$U<^xltRiA&x?QXHa_}&S*ZU?h|-3dyC zxskBXZLm~9kajt1p9Hy{ny;mIuib5g>dKgm&yTGQdt&;{$u3Z6SKvq34w3IF?XY~X{7Y#chnSD+ zgy!R98}}EM!A7!kIkiDoICx7^o0&Uug)@J*s}Gda7kD7*CFW_OOS-k0RWn!1U;e}o zwf*`5ray2J#KDo3q=5fC9sjzqehn+?a{wfQENTOlF`rfU4n>M1)hc_P!Ew3R?rfi< zXQpe-MVunj-S(4|0(8Hu9R@-CVBlH&`Nj5@)(Zj?6zEu>-3$%e{#Y&m+mEL zSl%w;7HwK=t*3-LHAd3WcNS>ZiZ9JLA4`B)Le*{r#j zlO*5_<0<#=Z}06KifeEZLL#+KfG!Zq}YXrb9X7NIw zU_^Asd88<Ao2@NHC&jt97AqvD{tN^P@ICy6$PCrk-`AKLlrf@{*~u-)@253`+?ZI-iDS zmf?p{hwHk1SfduW$1T)ibH}q_#6ySEgN4 z2>Z=_iK2L45hd9fx_(5FOwGSq%O8F7oVGiTRg1jqslXGKXcy#tog97eT;+c;In%61F}@;pG8~s z2)~@Utf@S+{+So#p}8D(97vDCHnZSk7FuNXam8Gr$`c-AN{R5xteG5*xbWUxt`qUwd%g#T_4+mL zuPV-1pH?^TgLa#`P*dfQwZpG)SPHlT))S8MN^^zlq0WPa4-dz|wX0%1?c0*1du3YB z(olLCVDA1BeJ*Qna#FY+lAmt($DVoEKg$B9956huW%zMW?qGUvMBUd(l`q!w0dwDAn{ajNG(ztkJSB*8;dHq4O?|Ee zLt=U0@tSskwO%|3!f)2hUfO*qt^t7lWnZItipTlPm*{wpr>}RbPhPnheTfwzu@Z0x z9%rd4h43HY$w;)p}NjxGKOSHMjt2hk)yG?Dspx+TnAoDx_BfKCZ!8iTF*X zWvNFNy0=O)xo*w(TdfYVY5+e$c|pUn>?Tu%>+f&5QPh)voUc{y-#QokJvP1m#OwCb zMLU_|YC;`r0Ykr$;m1MgC2`Hjlm*Re_DW{HMmnKVgzndMzoz3$V{(mSsYXawI2)nQ zQ)6Pd+K?Cu{2ukvvw6HHXa3os~IAy&_( zaM%nO#!a%4GI!M|a#A^P{C15qGhK=kxF4ISms>l!(LYnYKtHjs>3z$|gVCo%Z5=!{ zw@Q|5YZ9vW>z0rh4x9}2BE2d-PWNtD_V?Yl#YUR%Ut~5;ZUwSh10TS8N?i;4O64Jr zr*-KHOaAL|+|vdU+XBOLNydEnrGJ>Z)u^!ASzFyq;H92lJ4k5{oDk11^!ex|gvRsq zB*Ep>pZ4SR0MA+b8qK*V&%R%-EcCO$LMa13M_f^#w_^KcvC}!z=Zc6^>h`b;B z6J+cR%-I>D{U;EK+GKdzFstvyv46xmttZR-^J^6jwCNoFX8vIECofDBX7w~aKlk?! z6PkgO=vto8T}*McGd|rmvesnXx3m%HN}l-gPV43Bh|GlKT`|yZ{ z3N9bIDd)X@DlR_6B>?`)<9fD|!1kk|?=jnhTYV%dj@mdA0rxV5eK2t(l=TdM?=#NK9lz@`s~HI3d?HK*

+S7Uj$4g>S@A%;r| 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

^XQc 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 literal 0 HcmV?d00001 diff --git a/examples/ransomware_detection/models/ransomw-model-short-rf/config.pbtxt b/examples/ransomware_detection/models/ransomw-model-short-rf/config.pbtxt new file mode 100644 index 0000000000..4b9ccd2d75 --- /dev/null +++ b/examples/ransomware_detection/models/ransomw-model-short-rf/config.pbtxt @@ -0,0 +1,52 @@ +name: "ransomw-model-short-rf" +backend: "fil" +max_batch_size: 8192 +input [ + { + name: "input__0" + data_type: TYPE_FP32 + dims: [ 297 ] + } +] +output [ + { + name: "output__0" + data_type: TYPE_FP32 + dims: [ 2 ] + } +] +instance_group [{ kind: KIND_GPU }] +parameters [ + { + key: "model_type" + value: { string_value: "treelite_checkpoint" } + }, + { + key: "predict_proba" + value: { string_value: "true" } + }, + { + key: "output_class" + value: { string_value: "true" } + }, + { + key: "threshold" + value: { string_value: "0.5" } + }, + { + key: "algo" + value: { string_value: "ALGO_AUTO" } + }, + { + key: "storage_type" + value: { string_value: "AUTO" } + }, + { + key: "blocks_per_sm" + value: { string_value: "0" } + } +] + +dynamic_batching { + max_queue_delay_microseconds: 100 +} diff --git a/examples/ransomware_detection/run.py b/examples/ransomware_detection/run.py new file mode 100644 index 0000000000..723a7d10f0 --- /dev/null +++ b/examples/ransomware_detection/run.py @@ -0,0 +1,256 @@ +# Copyright (c) 2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import os +import typing + +import click +import yaml + +from morpheus.config import Config +from morpheus.config import CppConfig +from morpheus.config import PipelineModes +from morpheus.pipeline.linear_pipeline import LinearPipeline +from morpheus.stages.general.monitor_stage import MonitorStage +from morpheus.stages.inference.triton_inference_stage import TritonInferenceStage +from morpheus.stages.input.appshield_source_stage import AppShieldSourceStage +from morpheus.stages.output.write_to_file_stage import WriteToFileStage +from morpheus.stages.postprocess.add_scores_stage import AddScoresStage +from morpheus.stages.postprocess.serialize_stage import SerializeStage +from morpheus.utils.logging import configure_logging +from stages.create_features import CreateFeaturesRWStage +from stages.preprocessing import PreprocessingRWStage + + +@click.command() +@click.option('--debug', default=False) +@click.option('--use_cpp', default=False) +@click.option( + "--num_threads", + default=os.cpu_count(), + type=click.IntRange(min=1), + help="Number of internal pipeline threads to use", +) +@click.option( + "--n_dask_workers", + default=6, + type=click.IntRange(min=1), + help="Number of dask workers", +) +@click.option( + "--threads_per_dask_worker", + default=2, + type=click.IntRange(min=1), + help="Number of threads per each dask worker", +) +@click.option( + "--model_max_batch_size", + default=1024, + type=click.IntRange(min=1), + help="Max batch size to use for the model", +) +@click.option( + "--model_fea_length", + default=297, + type=click.IntRange(min=1), + help="Features length to use for the model", +) +@click.option( + "--conf_file", + type=click.STRING, + default="./config/ransomware_detection.yaml", + help="Ransomware detection configuration filepath", +) +@click.option( + "--model_name", + default="ransomw-model-short-rf", + help="The name of the model that is deployed on Tritonserver", +) +@click.option("--server_url", required=True, help="Tritonserver url") +@click.option( + "--sliding_window", + default=3, + type=click.IntRange(min=3), + help="Sliding window to be used for model input request", +) +@click.option( + '--input_glob', + type=str, + required=True, + help=("Input glob pattern to match files to read. For example, './input_dir/*/snapshot-*/*.json' would read all " + "files with the 'json' extension in the directory 'input_dir'.")) +@click.option('--watch_directory', + type=bool, + default=False, + help=("The watch directory option instructs this stage to not close down once all files have been read. " + "Instead it will read all files that match the 'input_glob' pattern, and then continue to watch " + "the directory for additional files. Any new files that are added that match the glob will then " + "be processed.")) +@click.option( + "--output_file", + type=click.STRING, + default="./ransomware_detection_output.jsonlines", + help="The path to the file where the inference output will be saved.", +) +def run_pipeline(debug, + use_cpp, + num_threads, + n_dask_workers, + threads_per_dask_worker, + model_max_batch_size, + model_fea_length, + conf_file, + model_name, + server_url, + sliding_window, + input_glob, + watch_directory, + output_file): + + if debug: + configure_logging(log_level=logging.DEBUG) + else: + configure_logging(log_level=logging.INFO) + + CppConfig.set_should_use_cpp(use_cpp) + + # Its necessary to get the global config object and configure it for FIL mode + config = Config() + config.mode = PipelineModes.FIL + + # Below properties are specified by the command line + config.num_threads = num_threads + config.model_max_batch_size = model_max_batch_size + config.feature_length = model_fea_length + config.class_labels = ["pred", "score"] + + # Create a linear pipeline object + pipeline = LinearPipeline(config) + + # Load ransomware detection configuration + rwd_conf = load_yaml(conf_file) + + # Exclude columns that are not required + cols_exclude = ["SHA256"] + + # Only intrested plugins files will be read from Appshield snapshots + interested_plugins = ['ldrmodules', 'threadlist', 'envars', 'vadinfo', 'handles'] + + # Columns from the above intrested plugins + cols_interested_plugins = rwd_conf['raw_columns'] + + # Feature columns used by the model + feature_columns = rwd_conf['model_features'] + + # File extensions + file_extns = rwd_conf['file_extensions'] + + # Set source stage + # This stage reads raw data from the required plugins and merge all the plugins data into a single dataframe + # for a given source. + pipeline.set_source( + AppShieldSourceStage( + config, + input_glob, + interested_plugins, + cols_interested_plugins, + cols_exclude=cols_exclude, + watch_directory=watch_directory, + )) + + # Add a monitor stage + pipeline.add_stage(MonitorStage(config, description="FromFile rate")) + + # Add create features stage + # This stage generates model feature values from the raw data + pipeline.add_stage( + CreateFeaturesRWStage(config, + interested_plugins, + feature_columns, + file_extns, + n_workers=n_dask_workers, + threads_per_worker=threads_per_dask_worker)) + + # Add a monitor stage + pipeline.add_stage(MonitorStage(config, description="CreateFeatures rate")) + + # Add preprocessing stage. + # This stage generates snapshot sequences using sliding window for each pid_process + pipeline.add_stage(PreprocessingRWStage(config, feature_columns=feature_columns[:-1], + sliding_window=sliding_window)) + + # Add a monitor stage + pipeline.add_stage(MonitorStage(config, description="PreProcessing rate")) + + # Add a inference stage + pipeline.add_stage( + TritonInferenceStage( + config, + model_name=model_name, + server_url=server_url, + force_convert_inputs=True, + )) + # # Add a monitor stage + pipeline.add_stage(MonitorStage(config, description="Inference rate")) + + # Add a scores stage + pipeline.add_stage(AddScoresStage(config, labels=["score"])) + + # Add a monitor stage + pipeline.add_stage(MonitorStage(config, description="AddScore rate")) + + # Convert the probabilities to serialized JSON strings using the custom serialization stage + pipeline.add_stage(SerializeStage(config, exclude=[r'^ID$', r'^_ts_', r'source_pid_process'])) + + # Add a monitor stage + pipeline.add_stage(MonitorStage(config, description="Serialize rate")) + + # Write the file to the output + pipeline.add_stage(WriteToFileStage(config, filename=output_file, overwrite=True)) + + # Add a monitor stage + pipeline.add_stage(MonitorStage(config, description="ToFile rate")) + + # Build pipeline + pipeline.build() + + # Run the pipeline + pipeline.run() + + +def load_yaml(filepath: str) -> typing.Dict[object, object]: + """ + This function loads yaml configuration to a dictionary + + Parameters + ---------- + filepath : str + A file's path + + Returns + ------- + typing.Dict[object, object] + Configuration as a dictionary + """ + with open(filepath, 'r', encoding='utf8') as f: + conf_dct = yaml.safe_load(f) + f.close() + + return conf_dct + + +# Execution starts here +if __name__ == "__main__": + run_pipeline() diff --git a/examples/ransomware_detection/stages/create_features.py b/examples/ransomware_detection/stages/create_features.py new file mode 100644 index 0000000000..4c52ba22ab --- /dev/null +++ b/examples/ransomware_detection/stages/create_features.py @@ -0,0 +1,169 @@ +# Copyright (c) 2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import typing + +import srf +from common.data_models import FeatureConfig +from common.feature_extractor import FeatureExtractor +from srf.core import operators as ops + +from dask.distributed import Client + +from morpheus._lib.messages import MessageMeta +from morpheus.config import Config +from morpheus.messages import MultiMessage +from morpheus.pipeline.multi_message_stage import MultiMessageStage +from morpheus.pipeline.stream_pair import StreamPair +from morpheus.stages.input.appshield_source_stage import AppShieldMessageMeta + + +class CreateFeaturesRWStage(MultiMessageStage): + """ + This class extends MultiMessageStage to deal with scenario specific features from Appshiled plugins data. + + Parameters + ---------- + c : morpheus.config.Config + Pipeline configuration instance + interested_plugins : typing.List[str] + Only intrested plugins files will be read from Appshield snapshots + feature_columns : typing.List[str] + List of features needed to be extracted. + file_extns : typing.List[str] + File extensions. + n_workers: int, default = 2 + Number of dask workers. + threads_per_worker: int, default = 2 + Number of threads for each dask worker. + """ + + def __init__( + self, + c: Config, + interested_plugins: typing.List[str], + feature_columns: typing.List[str], + file_extns: typing.List[str], + n_workers: int = 2, + threads_per_worker: int = 2, + ): + self._client = Client(threads_per_worker=threads_per_worker, n_workers=n_workers) + + self._feature_config = FeatureConfig(file_extns, + interested_plugins, + features_with_zeros=dict.fromkeys(feature_columns, 0)) + # FeatureExtractor instance to extract features from the snapshots. + self._fe = FeatureExtractor(self._feature_config) + + super().__init__(c) + + @property + def name(self) -> str: + return "create-features-rw" + + def accepted_types(self) -> typing.Tuple: + """ + Returns accepted input types for this stage. + """ + return (AppShieldMessageMeta, ) + + def supports_cpp_node(self): + return False + + def _build_single(self, builder: srf.Builder, input_stream: StreamPair) -> StreamPair: + + stream = input_stream[0] + + def node_fn(input: srf.Observable, output: srf.Subscriber): + + def on_next(x: AppShieldMessageMeta): + + snapshot_fea_dfs = [] + + df = x.df + + # Type cast CommitCharge. + df["CommitCharge"] = df["CommitCharge"].astype("float").astype("Int32") + df["Name"] = df["Name"].str.lower() + + # Create PID_Process feature. + df['PID_Process'] = df.PID + '_' + df.Process + + snapshot_ids = df.snapshot_id.unique() + + if len(snapshot_ids) > 1: + # Group snapshot rows using snapshot id. + all_dfs = [df[df.snapshot_id == snapshot_id] for snapshot_id in snapshot_ids] + else: + all_dfs = [df] + + extract_func = self._fe.extract_features + combine_func = FeatureExtractor.combine_features + + # Schedule dask task `extract_features` per snapshot. + snapshot_fea_dfs = self._client.map(extract_func, all_dfs, config=self._feature_config) + + # Combined `extract_features` results. + features_df = self._client.submit(combine_func, snapshot_fea_dfs) + + # Gather features from all the snapshots. + features_df = features_df.result() + + # Snapshot sequence will be generated using `source_pid_process`. + # Determines which source generated the snapshot messages. + # There's a chance of receiving the same snapshots names from multiple sources(hosts) + features_df['source_pid_process'] = x.source + '_' + features_df.pid_process + + # Sort entries by pid_process and snapshot_id + features_df = features_df.sort_values(by=["pid_process", "snapshot_id"]).reset_index(drop=True) + + # Create AppShieldMessageMeta with extracted features information. + meta = AppShieldMessageMeta(features_df, x.source) + + return meta + + def create_multi_messages(x: MessageMeta) -> typing.List[MultiMessage]: + + multi_messages = [] + + df = x.df + + pid_processes = df.pid_process.unique() + + # Create multi messaage per pid_process + for pid_process in pid_processes: + + pid_process_index = df[df.pid_process == pid_process].index + + start = pid_process_index.min() + stop = pid_process_index.max() + 1 + mess_count = stop - start + + multi_message = MultiMessage(meta=x, mess_offset=start, mess_count=mess_count) + multi_messages.append(multi_message) + + return multi_messages + + def on_completed(): + # Close dask client when pipeline initiates shutdown + self._client.close() + + input.pipe(ops.map(on_next), ops.map(create_multi_messages), ops.on_completed(on_completed), + ops.flatten()).subscribe(output) + + node = builder.make_node_full(self.unique_name, node_fn) + builder.make_edge(stream, node) + stream = node + + return stream, MultiMessage diff --git a/examples/ransomware_detection/stages/preprocessing.py b/examples/ransomware_detection/stages/preprocessing.py new file mode 100644 index 0000000000..d6e21cc134 --- /dev/null +++ b/examples/ransomware_detection/stages/preprocessing.py @@ -0,0 +1,193 @@ +# Copyright (c) 2022, NVIDIA CORPORATION. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import typing + +import cupy as cp +import pandas as pd +import srf +from common.data_models import SnapshotData + +from morpheus.config import Config +from morpheus.messages import InferenceMemoryFIL +from morpheus.messages import MultiInferenceFILMessage +from morpheus.messages import MultiInferenceMessage +from morpheus.messages import MultiMessage +from morpheus.stages.preprocess.preprocess_base_stage import PreprocessBaseStage + + +class PreprocessingRWStage(PreprocessBaseStage): + """ + This class extends PreprocessBaseStage and process the features that aree derived from Appshield data. + It also arranges the snapshots of Appshield data in a sequential order using provided sliding window. + + Parameters + ---------- + c : morpheus.config.Config + Pipeline configuration instance + feature_columns : typing.List[str] + List of features needed to be extracted. + sliding_window: int, default = 3 + Window size to arrange the sanpshots in seequential order. + """ + + def __init__(self, c: Config, feature_columns: typing.List[str], sliding_window: int = 3): + + super().__init__(c) + + self._feature_columns = feature_columns + self._sliding_window = sliding_window + self._features_len = len(self._feature_columns) + + # Stateful member to hold unprocessed snapshots. + self._snapshot_dict: typing.Dict[str, typing.List[SnapshotData]] = {} + + # Padding data to map inference response with input messages. + self._padding_data = [0 for i in range(self._features_len * sliding_window)] + + @property + def name(self) -> str: + return "preprocess-rw" + + def supports_cpp_node(self): + return False + + def _sliding_window_offsets(self, ids: typing.List[int], ids_len: int, + window: int) -> typing.List[typing.List[int]]: + """ + Create snapshot_id's sliding sequence for a given window + """ + + sliding_window_offsets = [] + + for start in range(ids_len - (window - 1)): + stop = start + window + sequence = ids[start:stop] + consecutive = sorted(sequence) == list(range(min(sequence), max(sequence) + 1)) + if consecutive: + sliding_window_offsets.append((start, stop)) + + return sliding_window_offsets + + def _rollover_pending_snapshots(self, + snapshot_ids: typing.List[int], + source_pid_process: str, + snapshot_df: pd.DataFrame): + """ + Store the unprocessed snapshots from current run to a stateful member to process them in the next run. + """ + + pending_snapshots = [] + + for snapshot_id in snapshot_ids[1 - self._sliding_window:]: + pending_snapshot_data = snapshot_df[snapshot_df.index == snapshot_id].values[0] + pending_snapshot = SnapshotData(snapshot_id, pending_snapshot_data) + pending_snapshots.append(pending_snapshot) + + if pending_snapshots: + self._snapshot_dict[source_pid_process] = pending_snapshots + + def _merge_curr_and_prev_snapshots(self, snapshot_df: pd.DataFrame, source_pid_process: str) -> pd.DataFrame: + """ + Merge current run snapshots with previous unprocessed snapshots. + """ + + prev_pending_snapshots = self._snapshot_dict[source_pid_process] + + # If previous pending snapshots that exists in the memory. Just get them to process in this run. + for prev_pending_snapshot in prev_pending_snapshots: + snapshot_df.loc[prev_pending_snapshot.snapshot_id] = prev_pending_snapshot.data + + # Keep snapshot_ids in order to generate sequence. + snapshot_df = snapshot_df.sort_index() + + return snapshot_df + + def _pre_process_batch(self, x: MultiMessage) -> MultiInferenceFILMessage: + """ + This function is invoked for every source_pid_process. + It looks for any pending snapshots related to the source and pid process in the memory. + If there are any unprocessed snapshots in the memory, they are merged with existing snapshots, + and a series of snapshot features generatd based on the specified sliding window, + followed by the creation of an inference memory message. + Current run's unprocessed snapshots will be rolled over to the next. + """ + + snapshot_df = x.get_meta() + + curr_snapshots_size = len(snapshot_df) + + # Set snapshot_id as index this is used to get ordered snapshots based on sliding window. + snapshot_df.index = snapshot_df.snapshot_id + + # Get source_pid_process. + source_pid_process = snapshot_df.source_pid_process.iloc[0] + + # Get only feature columns from the dataframe + snapshot_df = snapshot_df[self._feature_columns] + + # Get if there are any previous pending snapshots. + if source_pid_process in self._snapshot_dict: + snapshot_df = self._merge_curr_and_prev_snapshots(snapshot_df, source_pid_process) + + snapshot_ids = snapshot_df.index.values + + curr_and_prev_snapshots_size = len(snapshot_df) + + # Make a dummy set of data and a dummy sequence. + # When the number of snapshots received for the pid process is less than the sliding window supplied, + # this is used. For each input message, this is used to construct inference output. + data = [self._padding_data] * curr_snapshots_size + sequence = ["dummy"] * curr_snapshots_size + + if curr_and_prev_snapshots_size >= self._sliding_window: + # Rollover and current snapshots are used to generate sliding window offsets + offsets = self._sliding_window_offsets(snapshot_ids, + curr_and_prev_snapshots_size, + window=self._sliding_window) + + # Generate data from the sliding window offsets. + for start, stop in offsets: + data[start] = list(snapshot_df[start:stop].values.ravel()) + sequence[start] = str(snapshot_df.index[start]) + "-" + str(snapshot_df.index[stop - 1]) + + # Rollover pending snapshots + self._rollover_pending_snapshots(snapshot_ids, source_pid_process, snapshot_df) + + # This column is used to identify whether sequence is genuine or dummy + x.set_meta('sequence', sequence) + + # Convert data to cupy array + data = cp.asarray(data) + + seg_ids = cp.zeros((curr_snapshots_size, 3), dtype=cp.uint32) + seg_ids[:, 0] = cp.arange(0, curr_snapshots_size, dtype=cp.uint32) + seg_ids[:, 2] = self._features_len * 3 + + memory = InferenceMemoryFIL(count=curr_snapshots_size, input__0=data, seq_ids=seg_ids) + + infer_message = MultiInferenceFILMessage(meta=x.meta, + mess_offset=x.mess_offset, + mess_count=x.mess_count, + memory=memory, + offset=0, + count=curr_snapshots_size) + return infer_message + + def _get_preprocess_fn(self) -> typing.Callable[[MultiMessage], MultiInferenceMessage]: + pre_process_batch_fn = self._pre_process_batch + return pre_process_batch_fn + + def _get_preprocess_node(self, builder: srf.Builder): + raise NotImplementedError("No C++ node supported") From 8a407302a17266180b11de07749c0c6e75cc66b7 Mon Sep 17 00:00:00 2001 From: Michael Demoret <42954918+mdemoret-nv@users.noreply.github.com> Date: Mon, 27 Jun 2022 19:37:06 -0600 Subject: [PATCH 58/73] Use git version 2.35.3 in release build (#224) Forces the docker build to use git version 2.35.3. Otherwise conda build breaks during release container builds. Fixes #223 Authors: - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - https://github.com/bsuryadevara URL: https://github.com/nv-morpheus/Morpheus/pull/224 --- docker/Dockerfile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 9d951165f1..fe771296ed 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -42,7 +42,7 @@ ARG TENSORRT_VERSION=8.2.1.3 # Capture argument used for FROM ARG CUDA_VER -# Install dependencies to build vcpkg dependencies +# Install dependencies to build RUN apt-get update &&\ apt-get upgrade -y &&\ curl -sL https://deb.nodesource.com/setup_12.x | bash - &&\ @@ -60,7 +60,8 @@ WORKDIR /workspace RUN conda config --set ssl_verify false &&\ conda config --add pkgs_dirs /opt/conda/pkgs &&\ conda config --env --add channels conda-forge &&\ - /opt/conda/bin/conda install -y -n base -c conda-forge "mamba >=0.22" "boa >=0.10" python=${PYTHON_VER} + # Install mamba, boa and git here. Conda build breaks with other git installs + /opt/conda/bin/conda install -y -n base -c conda-forge "mamba >=0.22" "boa >=0.10" "git >=2.35.3" python=${PYTHON_VER} # conda clean -afy # ============ Stage: conda_env ============ @@ -120,7 +121,8 @@ COPY . ./ RUN --mount=type=cache,id=workspace_cache,target=/workspace/.cache,sharing=locked \ --mount=type=cache,id=conda_pkgs,target=/opt/conda/pkgs,sharing=locked \ source activate base &&\ - # Temp add CONDA_CHANNEL_ALIAS to get around conda-build 404 errors + # Need to get around recent versions of git locking paths until they are deemed safe + git config --global --add safe.directory "*" &&\ MORPHEUS_ROOT=/workspace MORPHEUS_BUILD_PYTHON_STUBS=OFF CONDA_BLD_PATH=/opt/conda/conda-bld CONDA_ARGS="--no-test" ./ci/conda/recipes/run_conda_build.sh morpheus # ============ Stage: runtime ============ From 30f275e60ba5e5b7940a6da52ed6fa7b69664f48 Mon Sep 17 00:00:00 2001 From: raykallen Date: Tue, 28 Jun 2022 11:29:26 -0400 Subject: [PATCH 59/73] ransomware ds requirements (#196) added training data and notebook. updated model info and readme. closes https://github.com/nv-morpheus/Morpheus/issues/195 Authors: - https://github.com/raykallen Approvers: - Tad ZeMicheal (https://github.com/tzemicheal) - https://github.com/bsuryadevara URL: https://github.com/nv-morpheus/Morpheus/pull/196 --- models/README.md | 17 + .../ransomware-training-data.csv | 3 + models/model-information.csv | 3 +- .../ransomw-model-short-rf-20220126.sav | Bin 0 -> 1933697 bytes .../ransomware-appshield-training.ipynb | 2044 +++++++++++++++++ 5 files changed, 2066 insertions(+), 1 deletion(-) create mode 100644 models/datasets/training-data/ransomware-training-data.csv create mode 100644 models/ransomware-models/ransomw-model-short-rf-20220126.sav create mode 100644 models/training-tuning-scripts/ransomware-models/ransomware-appshield-training.ipynb diff --git a/models/README.md b/models/README.md index 13af809486..1e25eaa3e7 100644 --- a/models/README.md +++ b/models/README.md @@ -148,3 +148,20 @@ An anomalous score of transactions indicates a probability score of being a frau - https://stellargraph.readthedocs.io/en/stable/hinsage.html?highlight=hinsage - https://github.com/rapidsai/clx/blob/branch-0.20/examples/forest_inference/xgboost_training.ipynb - Rafaël Van Belle, Charles Van Damme, Hendrik Tytgat, Jochen De Weerdt,Inductive Graph Representation Learning for fraud detection (https://www.sciencedirect.com/science/article/abs/pii/S0957417421017449) + +## Ransomware Detection via AppShield +### Model Overview +This model shows an application of DOCA AppShield to use data from volatile memory to classify processes as ransomware or bengin. This model uses a sliding window over time and feeds derived data into a random forest classifiers of various lengths depending on the amount of data collected. +### Model Architecture +The model uses input from Volatility plugins in DOCA AppShield to aggregate and derive features over snapshots in time. The features are used as input into three random forest binary classifiers. +### Training +Training data consists of 87968 labeled AppShield processes from 32 snapshots collected from 256 unique benign and ransomware activities. +### How To Use This Model +Combined with host data from DOCA AppShield, this model can be used to detect ransomware. A training notebook is also included so that users can update the model as more labeled data is collected. +#### Input +Snapshots collected from DOCA AppShield +#### Output +For each process_id and snapshot there is a probablity score between 1 and 0, where 1 is ransomware and 0 is benign. +### References +- Cohen, A,. & Nissim, N. (2018). Trusted detection of ransomware in a private cloud using machine learning methods leveraging meta-features from volatile memory. In Expert Systems With Applications. (https://www.sciencedirect.com/science/article/abs/pii/S0957417418301283) +- https://developer.nvidia.com/networking/doca diff --git a/models/datasets/training-data/ransomware-training-data.csv b/models/datasets/training-data/ransomware-training-data.csv new file mode 100644 index 0000000000..bb11b6b8c9 --- /dev/null +++ b/models/datasets/training-data/ransomware-training-data.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61243c983ea9ee0b07da25c1ba72db08d2ef73a2f7553624193817de1b8a613c +size 346662095 diff --git a/models/model-information.csv b/models/model-information.csv index a14ba4eb62..2a4815c29b 100644 --- a/models/model-information.csv +++ b/models/model-information.csv @@ -4,4 +4,5 @@ phishing-bert-20211006.onnx,phishing-detection,Gorkem Batmaz,0.1.0,Phishing emai sid-minibert-20211021.onnx,sensitive-information-detection,Rachel Allen,0.2.0,"SID is a classifier, designed to detect sensitive information (e.g., AWS credentials, GitHub credentials) in unencrypted data. This example model classifies text containing these 10 categories of sensitive information- address, bank account, credit card number, email address, government id number, full name, password, phone number, secret keys, and usernames.",Compact BERT-mini transformer model,Training consisted of fine-tuning the original pretrained [model from google](https://huggingface.co/google/bert_uncased_L-4_H-256_A-4). The labeled training dataset is 2 million synthetic pcap payloads generated using the [faker package](https://github.com/joke2k/faker) to mimic sensitive and benign data found in nested jsons from web APIs and environmental variables.,This model is an example of customized transformer-based sensitive information detection. It can be further fine-tuned for specific detection needs or retrained for alternative categorizations using the fine-tuning scripts in the repo.,English text from PCAP payloads,Multi-label sequence classification for 10 sensitive information categories,This model version is designed for english language text data. It may not perform well on other languages.,N/A,"Well-Read Students Learn Better: On the Importance of Pre-training Compact Models, 2019, https://arxiv.org/abs/1908.08962",1,32,V100,0.96,0.96,0.9875,43MB,N/A,bert-base-uncased,256,64,TRUE,FALSE,11,1.8,3.8.10,18.04.5 LTS,4.5 hammah-user123-20211017.pkl and hammah-role-g-20211017.pkl,digital-fingerprinting/ humans-as-machines,Gorkem Batmaz,0.1.0,This model is one example of an Autoencoder trained from a baseline for benign activity from synthetic `user-123` and `role-g`. This model combined with validation data from Morpheus examples can be used to test the HAMMAH Morpheus pipeline. It has little utility outside of testing.,"The model is an ensemble of an Autoencoder and a fast Fourier transform reconstruction. The reconstruction loss of new log data through the trained Autoencoder is used as an anomaly score. Concurrently, the timestamps of user/entity activity are used for a time series analysis to flag activity with poor reconstruction after a fast Fourier transform.",,This model is one example of an Autoencoder trained from a baseline for benign activity from synthetic `user-123` and `role-g`. This model combined with validation data from Morpheus examples can be used to test the HAMMAH Morpheus pipeline. It has little utility outside of testing.,aws-cloudtrail logs,"Anomalous score of Autoencoder, Binary classification of time series anomaly detection",This particular model is an example based on a synthetic users baseline behavior. Use on other datasets will require retraining.,N/A,https://github.com/AlliedToasters/dfencoder/blob/master/dfencoder/autoencoder.py https://github.com/rapidsai/clx/blob/branch-22.04/notebooks/anomaly_detection/FFT_Outlier_Detection.ipynb Rasheed Peng Alhajj Rokne Jon: Fourier Transform Based Spatial Outlier Mining 2009 - https://link.springer.com/chapter/10.1007/978-3-642-04394-9_39,25,,V100,1,1,1,3MB and 9MB,"ae=4, ts=4",N/A,N/A,N/A,N/A,N/A,11,1.7.1,3.8.10,18.04.5 LTS,N/A hinsage-model.pt and xgb.pth,fraud-detection,Tad Zemicheal,0.1.0,"This model shows an application of a graph neural network for fraud detection in a credit card transaction graph. A transaction dataset that includes three types of nodes, transaction, client, and merchant nodes is used for modeling. A combination of `GraphSAGE` along `XGBoost` is used to identify frauds in the transaction networks.","It uses a bipartite heterogeneous graph representation as input for `GraphSAGE` for feature learning and `XGBoost` as a classifier. Since the input graph is heterogenous, a heterogeneous implementation of `GraphSAGE` (HinSAGE) is used for feature embedding.",This model is an example of a fraud detection pipeline using a graph neural network and gradient boosting trees. This can be further retrained or fine-tuned to be used for similar types of transaction networks with similar graph structures.,This model is an example of a fraud detection pipeline using a graph neural network and gradient boosting trees. This can be further retrained or fine-tuned to be used for similar types of transaction networks with similar graph structures.,"Transaction data with nodes including transaction, client, and merchant.",An anomalous score of transactions indicates a probability score of being a fraud.,These particular model files are based on a synthetic transaction graph. Use with other datasets will require retraining.,N/A," https://stellargraph.readthedocs.io/en/stable/hinsage.html?highlight=hinsage https://github.com/rapidsai/clx/blob/branch-0.20/examples/forest_inference/xgboost_training.ipynb [Rafal Van Belle, Charles Van Damme, Hendrik Tytgat, Jochen De Weerdt,Inductive Graph Representation Learning for fraud detection] (https:/www.sciencedirect.com/science/article/abs/pii/S0957417421017449)",30,5,V100, NA,0.96, NA, 756KB,N/A and 0.5,N/A,N/A,N/A,N/A,N/A,11.0/11.4,1.9.1,3.8.10,18.04.5 LTS,N/A -log-parsing-20220418.onnx,log-parsing,Rachel Allen,0.1.0,"This model is an example of using Named Entity Recognition (NER) for log parsing, specifically apache web logs.",bert-base-cased transformer model,Training consisted of fine-tuning the original pretrained [model from google](https://huggingface.co/bert-base-cased). The labeled training dataset is 1000 parsed apache web logs from a public dataset [logpai](https://github.com/logpai/loghub),This model is one example of a BERT-model trained to parse raw logs. It can be used to parse apache web logs or retrained to parse other types of logs as well. The model file has a corresponding config.json file with the names of the fields it parses.,raw apache web logs,parsed apache web log as jsonlines,This model version is designed for english language text data. It may not perform well on other languages.,N/A,[1](https://arxiv.org/abs/1810.04805) [2](https://medium.com/rapids-ai/cybert-28b35a4c81c4) [3](https://www.splunk.com/en_us/blog/it/how-splunk-is-parsing-machine-logs-with-machine-learning-on-nvidia-s-triton-and-morpheus.html),2,32,V100,0.99,0.99,0.999,431MB,N/A,bert-base-cased,256,64,FALSE,FALSE,11,1.9.1,3.8.10,18.04.5 LTS,4.18 \ No newline at end of file +log-parsing-20220418.onnx,log-parsing,Rachel Allen,0.1.0,"This model is an example of using Named Entity Recognition (NER) for log parsing, specifically apache web logs.",bert-base-cased transformer model,Training consisted of fine-tuning the original pretrained [model from google](https://huggingface.co/bert-base-cased). The labeled training dataset is 1000 parsed apache web logs from a public dataset [logpai](https://github.com/logpai/loghub),This model is one example of a BERT-model trained to parse raw logs. It can be used to parse apache web logs or retrained to parse other types of logs as well. The model file has a corresponding config.json file with the names of the fields it parses.,raw apache web logs,parsed apache web log as jsonlines,This model version is designed for english language text data. It may not perform well on other languages.,N/A,[1](https://arxiv.org/abs/1810.04805) [2](https://medium.com/rapids-ai/cybert-28b35a4c81c4) [3](https://www.splunk.com/en_us/blog/it/how-splunk-is-parsing-machine-logs-with-machine-learning-on-nvidia-s-triton-and-morpheus.html),2,32,V100,0.99,0.99,0.999,431MB,N/A,bert-base-cased,256,64,FALSE,FALSE,11,1.9.1,3.8.10,18.04.5 LTS,4.18 +ransomw-model-short-rf-20220126.sav,ransomware-detection,Haim Elisha,0.1.0,This model detects ransomware from host volitile memory features collected from DOCA AppShield,Binary random forest classifier ,Training data consists of 87968 labeled AppShield processes from 32 snapshots collected from 256 unique benign and ransomware activities.,"Combined with host data from DOCA AppShield, this model can be used to detect ransomware. A training notebook is also included so that users can update the model as more labeled data is collected.",Snapshots collected from DOCA AppShield,"For each process_id and snapshot there is a probablity score between 1 and 0, where 1 is ransomware and 0 is benign.",This model was trained in the lab on windows machines,N/A,"ohen, A,. & Nissim, N. (2018). Trusted detection of ransomware in a private cloud using machine learning methods leveraging meta-features from volatile memory. In Expert Systems With Applications. (https://www.sciencedirect.com/science/article/abs/pii/S0957417418301283)",,,V100,recall= 0.9,,,946KB,N/A,,,,,,,,,, \ No newline at end of file diff --git a/models/ransomware-models/ransomw-model-short-rf-20220126.sav b/models/ransomware-models/ransomw-model-short-rf-20220126.sav new file mode 100644 index 0000000000000000000000000000000000000000..3a85e16ea4d95bd85484e715c19c01848c08297f GIT binary patch literal 1933697 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

mZMqhsBj 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

    LpKfI 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 T92*4i6Ywl#oz`K$aNa~c`5 literal 0 HcmV?d00001 diff --git a/models/training-tuning-scripts/ransomware-models/ransomware-appshield-training.ipynb b/models/training-tuning-scripts/ransomware-models/ransomware-appshield-training.ipynb new file mode 100644 index 0000000000..0a2c4b5e7b --- /dev/null +++ b/models/training-tuning-scripts/ransomware-models/ransomware-appshield-training.ipynb @@ -0,0 +1,2044 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Ransomware detection model- Windows OS" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Table of Contents\n", + "* Introduction\n", + "* Dataset & Volatility Plugins\n", + "* Data Preprocessing\n", + "* Model Training\n", + "* Model Evaluation\n", + "* Conclusions\n", + "* References" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introduction\n", + "\n", + "Ransomware attacks are growing in volume and sophistication. Many attackers evade detection from traditional file scanning techniques. Here we use data sampled from volatile memory (RAM) to detect the presence of ransomware in Windows OS. We engineer several features from a dataset containing artifacts from running both benign and ransomware processses and train a random forest classifier. We can create multiple models based on the number of samples or snapshots available." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Dataset" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We ran hundreds of ransomwares in our lab environment and have recorded the generated process features using the [Volatility framework](https://github.com/volatilityfoundation/volatility3) to create a labeled dataset.\n", + "\n", + "The csv file contains 530 columns- a combination of features from 5 different Volatility Plugins. This data collection is part of [DOCA AppShield](https://developer.nvidia.com/networking/doca)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Volatility Plugin Features\n", + "\n", + "#### Envars Plugin\n", + "Displays a process's environment variables. Typically this will show the number of CPUs installed and the hardware architecture, the process's current directory, temporary directory, session name, computer name, user name, and various other interesting artifacts.\n", + "\n", + "#### Threadlist Plugin\n", + "Displays the threads that are used by a process.\n", + "\n", + "#### VadInfo Plugin\n", + "Displays extended information about a process's VAD nodes.\n", + "- The address of the MMVAD structure in kernel memory\n", + "- The starting and ending virtual addresses in process memory that the MMVAD structure pertains to\n", + "- The VAD Tag\n", + "- The VAD flags, control flags, etc\n", + "- The name of the memory mapped file (if one exists)\n", + "- The memory protection constant (permissions)\n", + "\n", + "#### Handles Plugin\n", + "Displays the open handles in a process, use the handles command. This applies to files, registry keys, mutexes, named pipes, events, window stations, desktops, threads, and all other types of securable executive objects\n", + "\n", + "#### LdrModules Plugin\n", + "Displays a process's loaded DLLs. LdrModules detects a dll-hiding or injection kind of activities in a process memory." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import pickle\n", + "import random\n", + "\n", + "from sklearn.ensemble import RandomForestClassifier" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preprocessing" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "TRAINING_DATA_PATH = \"../../datasets/training-data/ransomware-training-data.csv\"\n", + "\n", + "# Read CSV of Data from Plugins with Ransomware labels\n", + "ransom_df = pd.read_csv(TRAINING_DATA_PATH)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Sorting the dataframe by ransomware_name, PID_Process and snapshot to make the dataframe for time series\n", + "sortby_cols = ['ransomware_name', 'PID_Process', 'snapshot']\n", + "ransom_df = ransom_df.sort_values(by=sortby_cols)\n", + "ransom_df = ransom_df.reset_index(drop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Using only 99 of the 530 features based on prior experimentation \n", + "# In the prior experiment that we did, we select the best 99 features of Random-Forest model based on single snapshot\n", + "\n", + "# Information and defenitions about the important features:\n", + "# Defenitions:\n", + " # Commit charged - the total amount of virtual memory of all processes that must be backed by either physical memory or the page file\n", + " # vad - virtual address descriptor\n", + " # vads - virtual address descriptor short\n", + " # private memory - this field refers to committed regions that cannot be shared with other processes.\n", + "# In the features engineering stage we are using several memory plugins as raw data:\n", + "# Environment variables plugin feature engineering:\n", + " # Check if the extended PATHEXT environment variable is exists\n", + " # Claculating the amount of environment variables for each process\n", + "# Threadlist plugin feature engineering:\n", + " # Count amount of unique states and wait reasons and thread with staten - '2'-'Running' and wait reason - '9'-'WrPageIn', '13'-'WrUserRequest', '31'-'WrDispatchInt'\n", + " # Calculate the amount of unique states\n", + " # Calculate the amount of unique wait reasons\n", + "# Vadinfo plugin feature engineering:\n", + " # Calculate the amount of vad, vads and private memory\n", + " # Calculate the ratio of vad, vads and private memory in vadinfo df\n", + " # Calculate the mean, max, sum and len of commit charged\n", + " # Calculate the mean, max, sum of vad commit charged\n", + " # Calculate the min of vads commit charged\n", + " # Calculate for each page protection: 'PAGE_EXECUTE_READWRITE ','PAGE_EXECUTE_WRITECOPY ','PAGE_NOACCESS ' min commit charged\n", + " # Calculate min commit charged for vad with 'PAGE_NOACCESS' protection\n", + " # Calculate for each page protection: 'PAGE_EXECUTE_READWRITE ','PAGE_NOACCESS ','PAGE_READONLY ' mean commit charged\n", + " # Calculate mean commit charged for vad with 'PAGE_NOACCESS' protection\n", + " # Calculate for each page protection: 'PAGE_EXECUTE_READWRITE ','PAGE_NOACCESS ' max commit charged\n", + " # Calculate for each page protection: 'PAGE_EXECUTE_READWRITE ','PAGE_NOACCESS ','PAGE_EXECUTE_WRITECOPY ' sum commit charged\n", + " # Calculate the std of commit charge with 'PAGE_EXECUTE_READWRITE' protection\n", + " # Calculate the amount of entire memory commit charged of vads\n", + " # Count the amount and ratio of each page protection: 'PAGE_READONLY ','PAGE_NOACCESS ','PAGE_EXECUTE_READWRITE ','PAGE_EXECUTE_WRITECOPY '\n", + " # Count the amount and ratio of vads with each page protection: 'PAGE_READONLY ','PAGE_NOACCESS ','PAGE_EXECUTE_READWRITE ','PAGE_READWRITE ','PAGE_EXECUTE_READWRITE '\n", + " # Count the amount and ratio of vad with each page protection: 'PAGE_READONLY ','PAGE_NOACCESS ','PAGE_EXECUTE_WRITECOPY ','PAGE_READWRITE '\n", + " # Count vadinfo unique paths\n", + " # Calculate the ratio between vads amount and amount pages with PAGE_EXECUTE_WRITECOPY access + 1\n", + " # Count amount of unique extensions\n", + "# Handles plugin feature engineering:\n", + " # Count double extensions file handles\n", + " # Count amount of files with common file extension\n", + " # Count amount of directories with personal user directory\n", + " # Count amount of directories with windows directory\n", + " # Count amount of unique directories\n", + " # Count unique file extension\n", + " # Count amount of handles\n", + " # Count amount and ration of unique handles names\n", + " # Count amount and ration of unique handles type\n", + " # Count amount and ratio of handles type\n", + "# LdrModules plugin feature engineering:\n", + " # Extract process size and path\n", + "REQ_FEATURES = ['envirs_pathext', 'count_double_extension_count_handles', 'page_readonly_vads_count', 'double_extension_len_handles', 'get_commit_charge_max_vad', 'count_entire_commit_charge_vads', 'get_commit_charge_min_vad_page_noaccess', 'check_doc_file_handle_count', 'envars_df_count', 'page_noaccess_vad_count', 'get_commit_charge_min_vads', 'get_commit_charge_mean_vad_page_noaccess', 'page_noaccess_vad_ratio', 'handles_df_directory_count', 'threadlist_df_wait_reason_9', 'page_noaccess_count', 'get_commit_charge_mean_page_noaccess', 'ldrmodules_df_size_int', 'get_commit_charge_max_page_execute_readwrite', 'ratio_private_memory', 'get_commit_charge_max_page_noaccess', 'page_readwrite_ratio', 'get_commit_charge_mean_page_execute_readwrite', 'handles_df_section_ratio', 'vad_ratio', 'page_noaccess_ratio', 'page_execute_writecopy_vad_ratio', 'handles_df_section_count', 'handles_df_tpworkerfactory_count', 'page_readonly_count', 'handles_df_waitcompletionpacket_count', 'get_commit_charge_mean_page_readonly', 'page_readonly_vad_ratio', 'handles_df_event_ratio', 'handles_df_semaphore_ratio', 'get_commit_charge_sum_page_execute_readwrite', 'threadlist_df_state_2', 'handles_df_iocompletionreserve_count', 'handles_df_directory_ratio', 'handles_df_iocompletionreserve_ratio', 'get_commit_charge_mean_vad', 'get_commit_charge_sum_page_execute_writecopy', 'page_execute_readwrite_ratio', 'get_commit_charge_min_page_execute_readwrite', 'threadlist_df_wait_reason_31', 'get_commit_charge_sum_page_noaccess', 'page_readwrite_vads_ratio', 'handles_df_mutant_ratio', 'get_commit_charge_sum_vad', 'get_commit_charge_max', 'handles_df_type_unique', 'handles_df_iocompletion_ratio', 'handles_df_waitcompletionpacket_ratio', 'handles_df_tpworkerfactory_ratio', 'vadinfo_df_path_unique', 'vad_count', 'page_readonly_ratio', 'count_private_memory', 'page_execute_readwrite_vads_ratio', 'vads_page_execute_writecopy_ratio', 'handles_df_file_ratio', 'handles_df_etwregistration_ratio', 'handles_df_key_ratio', 'get_commit_charge_min_page_noaccess', 'page_readonly_vads_ratio', 'handles_df_thread_ratio', 'handles_df_file_count', 'handles_df_thread_count', 'threadlist_df_count', 'get_commit_charge_len', 'get_commit_charge_min_page_execute_writecopy', 'handles_df_alpc port_ratio', 'file_users_exists', 'file_windows_count', 'handles_df_key_count', 'threadlist_df_wait_reason_13', 'threadlist_df_wait_reason_unique', 'handles_df_semaphore_count', 'handles_df_name_unique_ratio', 'threadlist_df_state_unique', 'get_count_unique_extensions', 'handles_df_name_unique', 'page_noaccess_vads_ratio', 'handles_df_event_count', 'page_readwrite_vad_ratio', 'handles_df_alpc port_count', 'get_commit_charge_std_page_execute_readwrite', 'count_directories_handles_uniques', 'count_extension_handles_uniques', 'page_readwrite_vad_count', 'get_commit_charge_sum', 'get_commit_charge_mean', 'handles_df_desktop_ratio', 'handles_df_count', 'handles_df_mutant_count', 'handles_df_windowstation_ratio', 'page_execute_readwrite_vads_count', 'handles_df_type_unique_ratio', 'page_execute_readwrite_count']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Split Dataset Into Training and Validation" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Spliting into training and validation sets by ransomware name\n", + "files = ransom_df.ransomware_name.unique()\n", + "files_count = len(files)\n", + "\n", + "# We randomize the files to remove biases related to recording process\n", + "random.shuffle(files)\n", + "\n", + "train_files = files[:int(files_count*0.8)]\n", + "test_files = files[int(files_count*0.8):]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "train_df = ransom_df[ransom_df.ransomware_name.isin(train_files)]\n", + "val_df = ransom_df[ransom_df.ransomware_name.isin(test_files)]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "class FeaturesData():\n", + " \n", + " def __init__(self, df, labels, rw_names, pid_processes, snapshot_ids):\n", + " self._df = df\n", + " self._labels = labels\n", + " self._rw_names = rw_names\n", + " self._pid_processes = pid_processes\n", + " self._snapshot_ids = snapshot_ids\n", + " \n", + " @property\n", + " def df(self):\n", + " return self._df\n", + " \n", + " @property\n", + " def labels(self):\n", + " return self._labels\n", + " \n", + " @property\n", + " def rw_names(self):\n", + " return self._rw_names\n", + " \n", + " @property\n", + " def pid_processes(self):\n", + " return self._pid_processes\n", + " \n", + " @property\n", + " def snapshot_ids(self):\n", + " return self._snapshot_ids" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def sort_entries(df, columns):\n", + " df = df.sort_values(by=columns).reset_index(drop=True)\n", + " return df\n", + "\n", + "\n", + "def sliding_window_offsets(ids, window):\n", + " \"\"\"\n", + " Create snapshot_id's sliding sequence for a given window\n", + " \"\"\"\n", + " ids_len = len(ids)\n", + "\n", + " sliding_window_offsets = []\n", + "\n", + " for start in range(ids_len - (window - 1)):\n", + " stop = start + window\n", + " sequence = ids[start:stop]\n", + " consecutive = sorted(sequence) == list(range(min(sequence), max(sequence) + 1))\n", + " if consecutive:\n", + " sliding_window_offsets.append((start, stop))\n", + "\n", + " return sliding_window_offsets\n", + "\n", + "\n", + "def generate_sequences(df, window=3):\n", + " \"\"\"\n", + " Generate time series sequences.\n", + " \"\"\"\n", + " features_data = []\n", + " labels = []\n", + " snapshots = []\n", + " rw_names = []\n", + " pid_processes = []\n", + " \n", + " pid_processes_unique = list(df.PID_Process.unique())\n", + "\n", + " for pid_process in pid_processes_unique:\n", + "\n", + " pid_process_df = df[df.PID_Process==pid_process]\n", + " pid_process_df.index = pid_process_df.snapshot\n", + " pid_process_df = pid_process_df[~pid_process_df.index.duplicated(keep='last')]\n", + " pid_process_labels = pid_process_df.label.values\n", + " pid_process_rwname = pid_process_df.ransomware_name.values\n", + " pid_process_df = pid_process_df[REQ_FEATURES]\n", + " \n", + " if len(pid_process_df) >= window:\n", + " snapshot_ids = pid_process_df.index.values\n", + " offsets = sliding_window_offsets(snapshot_ids, window)\n", + " for start, stop in offsets:\n", + " features_data.append(list(pid_process_df[start:stop].values.ravel()))\n", + " labels.append(pid_process_labels[start])\n", + " snapshots.append(snapshot_ids[start])\n", + " rw_names.append(pid_process_rwname[start])\n", + " pid_processes.append(pid_process)\n", + "\n", + " features_df = pd.DataFrame(np.array(features_data))\n", + " \n", + " sd = FeaturesData(features_df, labels, rw_names, pid_processes, snapshots)\n", + " \n", + " return sd\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "columns = [\"PID_Process\", \"snapshot\", \"ransomware_name\"]\n", + "# sort the entries by [\"PID_Process\", \"snapshot\", \"ransomware_name\"] to create time series data.\n", + "train_df = sort_entries(train_df, columns)\n", + "val_df = sort_entries(val_df, columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "train_data = generate_sequences(train_df)\n", + "val_data = generate_sequences(val_df)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model Training" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "X_df_train = train_data.df\n", + "Y_train = train_data.labels" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "RandomForestClassifier(max_depth=10, min_samples_split=10, n_estimators=250)" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# RandomForest model parameters\n", + "MAX_DEPTH=10\n", + "MIN_SAMPLES_SPLIT=10\n", + "N_ESTIMATORS=250\n", + "\n", + "# For our model we select RandomForest to avoid overfitting\n", + "model = RandomForestClassifier(max_depth=MAX_DEPTH, \n", + " min_samples_split=MIN_SAMPLES_SPLIT, \n", + " n_estimators=N_ESTIMATORS)\n", + "model.fit(X_df_train, Y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# Save model\n", + "def save_model(model, output_file='ransomware_model_new.sav'):\n", + " pickle.dump(model, open(output_file, 'wb'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model Evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "# Evaluate model\n", + "def model_eval(model, val_data):\n", + " df_val = val_data.df\n", + " Y_pred = model.predict_proba(df_val)\n", + " df_val['pred'] = Y_pred[:, 1]\n", + "\n", + " Pre = []\n", + " Rec = []\n", + " \n", + " df_val['label'] = val_data.labels\n", + " df_val['PID_Process'] = val_data.pid_processes\n", + " df_val['ransomware_name'] = val_data.rw_names\n", + " \n", + " x = df_val[df_val.label == 0]\n", + " y = df_val[df_val.label == 1]\n", + " \n", + " tp_fn_len = len(x)\n", + " \n", + " # Changing the threshold to calculate precision and recall and plot them\n", + " for thr in np.arange(0, 1, 0.01):\n", + " print(f\"thr: {thr}\")\n", + "\n", + " fp_df = x[x.pred > thr]\n", + " tp_df = y[y.pred > thr]\n", + " fn_df = y[y.pred < thr]\n", + "\n", + " tp_len = len(tp_df)\n", + " fp_len = len(fp_df)\n", + "\n", + " # Calculating the Recall = TP/(TP+FN)\n", + " recall_val = tp_len / tp_fn_len\n", + " # Calculating the precision = TP/(TP+FP)\n", + " precision_val = tp_len / (tp_len + fp_len)\n", + "\n", + " Rec.append(recall_val)\n", + " Pre.append(precision_val)\n", + "\n", + " print(f\"Recall val: \\n{recall_val}\")\n", + " print(f\"Precision val: \\n{precision_val}\")\n", + "\n", + " include_cols = ['ransomware_name', 'PID_Process']\n", + "\n", + " # Printing the TPs, FNs and FPs by name recording to see which ransomware we detected or missed and which\n", + " # legitimate software we detected as ransomware (FP)\n", + " if precision_val > 0.85:\n", + " print(f\"TPs: \\n{tp_df[include_cols].value_counts()}\")\n", + " print(f\"FNs: \\n{fn_df[include_cols].value_counts()}\")\n", + " print(f\"FPs: \\n{fp_df[include_cols].value_counts()}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "thr: 0.0\n", + "Recall val: \n", + "0.03128321943811693\n", + "Precision val: \n", + "0.030334265940214992\n", + "thr: 0.01\n", + "Recall val: \n", + "0.03128321943811693\n", + "Precision val: \n", + "0.2881118881118881\n", + "thr: 0.02\n", + "Recall val: \n", + "0.03128321943811693\n", + "Precision val: \n", + "0.3249211356466877\n", + "thr: 0.03\n", + "Recall val: \n", + "0.03128321943811693\n", + "Precision val: \n", + "0.34563758389261745\n", + "thr: 0.04\n", + "Recall val: \n", + "0.03128321943811693\n", + "Precision val: \n", + "0.36589698046181174\n", + "thr: 0.05\n", + "Recall val: \n", + "0.03128321943811693\n", + "Precision val: \n", + "0.37522768670309653\n", + "thr: 0.06\n", + "Recall val: \n", + "0.03128321943811693\n", + "Precision val: \n", + "0.3850467289719626\n", + "thr: 0.07\n", + "Recall val: \n", + "0.03128321943811693\n", + "Precision val: \n", + "0.39768339768339767\n", + "thr: 0.08\n", + "Recall val: \n", + "0.03128321943811693\n", + "Precision val: \n", + "0.40234375\n", + "thr: 0.09\n", + "Recall val: \n", + "0.03128321943811693\n", + "Precision val: \n", + "0.41282565130260523\n", + "thr: 0.1\n", + "Recall val: \n", + "0.03128321943811693\n", + "Precision val: \n", + "0.4256198347107438\n", + "thr: 0.11\n", + "Recall val: \n", + "0.03128321943811693\n", + "Precision val: \n", + "0.4345991561181435\n", + "thr: 0.12\n", + "Recall val: \n", + "0.03128321943811693\n", + "Precision val: \n", + "0.4355179704016913\n", + "thr: 0.13\n", + "Recall val: \n", + "0.03128321943811693\n", + "Precision val: \n", + "0.43736730360934184\n", + "thr: 0.14\n", + "Recall val: \n", + "0.03128321943811693\n", + "Precision val: \n", + "0.43829787234042555\n", + "thr: 0.15\n", + "Recall val: \n", + "0.03128321943811693\n", + "Precision val: \n", + "0.43829787234042555\n", + "thr: 0.16\n", + "Recall val: \n", + "0.03128321943811693\n", + "Precision val: \n", + "0.4458874458874459\n", + "thr: 0.17\n", + "Recall val: \n", + "0.03128321943811693\n", + "Precision val: \n", + "0.44782608695652176\n", + "thr: 0.18\n", + "Recall val: \n", + "0.03128321943811693\n", + "Precision val: \n", + "0.45374449339207046\n", + "thr: 0.19\n", + "Recall val: \n", + "0.03128321943811693\n", + "Precision val: \n", + "0.45374449339207046\n", + "thr: 0.2\n", + "Recall val: \n", + "0.03128321943811693\n", + "Precision val: \n", + "0.4577777777777778\n", + "thr: 0.21\n", + "Recall val: \n", + "0.031131359149582385\n", + "Precision val: \n", + "0.47344110854503463\n", + "thr: 0.22\n", + "Recall val: \n", + "0.031131359149582385\n", + "Precision val: \n", + "0.5049261083743842\n", + "thr: 0.23\n", + "Recall val: \n", + "0.031131359149582385\n", + "Precision val: \n", + "0.5256410256410257\n", + "thr: 0.24\n", + "Recall val: \n", + "0.030827638572513288\n", + "Precision val: \n", + "0.5328083989501312\n", + "thr: 0.25\n", + "Recall val: \n", + "0.03067577828397874\n", + "Precision val: \n", + "0.5358090185676393\n", + "thr: 0.26\n", + "Recall val: \n", + "0.03067577828397874\n", + "Precision val: \n", + "0.5386666666666666\n", + "thr: 0.27\n", + "Recall val: \n", + "0.03052391799544419\n", + "Precision val: \n", + "0.5374331550802139\n", + "thr: 0.28\n", + "Recall val: \n", + "0.030372057706909643\n", + "Precision val: \n", + "0.5449591280653951\n", + "thr: 0.29\n", + "Recall val: \n", + "0.030220197418375096\n", + "Precision val: \n", + "0.5497237569060773\n", + "thr: 0.3\n", + "Recall val: \n", + "0.030220197418375096\n", + "Precision val: \n", + "0.5558659217877095\n", + "thr: 0.31\n", + "Recall val: \n", + "0.030220197418375096\n", + "Precision val: \n", + "0.5574229691876751\n", + "thr: 0.32\n", + "Recall val: \n", + "0.030220197418375096\n", + "Precision val: \n", + "0.5835777126099707\n", + "thr: 0.33\n", + "Recall val: \n", + "0.030220197418375096\n", + "Precision val: \n", + "0.5852941176470589\n", + "thr: 0.34\n", + "Recall val: \n", + "0.030068337129840545\n", + "Precision val: \n", + "0.5875370919881305\n", + "thr: 0.35000000000000003\n", + "Recall val: \n", + "0.02976461655277145\n", + "Precision val: \n", + "0.6125\n", + "thr: 0.36\n", + "Recall val: \n", + "0.029612756264236904\n", + "Precision val: \n", + "0.6587837837837838\n", + "thr: 0.37\n", + "Recall val: \n", + "0.029612756264236904\n", + "Precision val: \n", + "0.6610169491525424\n", + "thr: 0.38\n", + "Recall val: \n", + "0.029460895975702353\n", + "Precision val: \n", + "0.6736111111111112\n", + "thr: 0.39\n", + "Recall val: \n", + "0.029460895975702353\n", + "Precision val: \n", + "0.6736111111111112\n", + "thr: 0.4\n", + "Recall val: \n", + "0.029460895975702353\n", + "Precision val: \n", + "0.6736111111111112\n", + "thr: 0.41000000000000003\n", + "Recall val: \n", + "0.029460895975702353\n", + "Precision val: \n", + "0.6736111111111112\n", + "thr: 0.42\n", + "Recall val: \n", + "0.029460895975702353\n", + "Precision val: \n", + "0.6736111111111112\n", + "thr: 0.43\n", + "Recall val: \n", + "0.029460895975702353\n", + "Precision val: \n", + "0.6736111111111112\n", + "thr: 0.44\n", + "Recall val: \n", + "0.029460895975702353\n", + "Precision val: \n", + "0.6736111111111112\n", + "thr: 0.45\n", + "Recall val: \n", + "0.029460895975702353\n", + "Precision val: \n", + "0.6736111111111112\n", + "thr: 0.46\n", + "Recall val: \n", + "0.029460895975702353\n", + "Precision val: \n", + "0.6736111111111112\n", + "thr: 0.47000000000000003\n", + "Recall val: \n", + "0.029460895975702353\n", + "Precision val: \n", + "0.6736111111111112\n", + "thr: 0.48\n", + "Recall val: \n", + "0.029460895975702353\n", + "Precision val: \n", + "0.6736111111111112\n", + "thr: 0.49\n", + "Recall val: \n", + "0.029460895975702353\n", + "Precision val: \n", + "0.6830985915492958\n", + "thr: 0.5\n", + "Recall val: \n", + "0.029460895975702353\n", + "Precision val: \n", + "0.6879432624113475\n", + "thr: 0.51\n", + "Recall val: \n", + "0.029460895975702353\n", + "Precision val: \n", + "0.6928571428571428\n", + "thr: 0.52\n", + "Recall val: \n", + "0.029460895975702353\n", + "Precision val: \n", + "0.6928571428571428\n", + "thr: 0.53\n", + "Recall val: \n", + "0.029460895975702353\n", + "Precision val: \n", + "0.6928571428571428\n", + "thr: 0.54\n", + "Recall val: \n", + "0.028549734244495063\n", + "Precision val: \n", + "0.6861313868613139\n", + "thr: 0.55\n", + "Recall val: \n", + "0.028549734244495063\n", + "Precision val: \n", + "0.6861313868613139\n", + "thr: 0.56\n", + "Recall val: \n", + "0.028549734244495063\n", + "Precision val: \n", + "0.6861313868613139\n", + "thr: 0.5700000000000001\n", + "Recall val: \n", + "0.028549734244495063\n", + "Precision val: \n", + "0.6861313868613139\n", + "thr: 0.58\n", + "Recall val: \n", + "0.028549734244495063\n", + "Precision val: \n", + "0.6861313868613139\n", + "thr: 0.59\n", + "Recall val: \n", + "0.028397873955960516\n", + "Precision val: \n", + "0.684981684981685\n", + "thr: 0.6\n", + "Recall val: \n", + "0.028397873955960516\n", + "Precision val: \n", + "0.700374531835206\n", + "thr: 0.61\n", + "Recall val: \n", + "0.028397873955960516\n", + "Precision val: \n", + "0.7540322580645161\n", + "thr: 0.62\n", + "Recall val: \n", + "0.028397873955960516\n", + "Precision val: \n", + "0.7601626016260162\n", + "thr: 0.63\n", + "Recall val: \n", + "0.02824601366742597\n", + "Precision val: \n", + "0.768595041322314\n", + "thr: 0.64\n", + "Recall val: \n", + "0.02794229309035687\n", + "Precision val: \n", + "0.7829787234042553\n", + "thr: 0.65\n", + "Recall val: \n", + "0.027790432801822324\n", + "Precision val: \n", + "0.7956521739130434\n", + "thr: 0.66\n", + "Recall val: \n", + "0.027790432801822324\n", + "Precision val: \n", + "0.7991266375545851\n", + "thr: 0.67\n", + "Recall val: \n", + "0.027790432801822324\n", + "Precision val: \n", + "0.8026315789473685\n", + "thr: 0.68\n", + "Recall val: \n", + "0.027790432801822324\n", + "Precision val: \n", + "0.8026315789473685\n", + "thr: 0.6900000000000001\n", + "Recall val: \n", + "0.02733485193621868\n", + "Precision val: \n", + "0.8\n", + "thr: 0.7000000000000001\n", + "Recall val: \n", + "0.02733485193621868\n", + "Precision val: \n", + "0.8\n", + "thr: 0.71\n", + "Recall val: \n", + "0.02703113135914958\n", + "Precision val: \n", + "0.8240740740740741\n", + "thr: 0.72\n", + "Recall val: \n", + "0.02703113135914958\n", + "Precision val: \n", + "0.8557692307692307\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "Beaf 1088_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "Nread 5852_sample.exe 12\n", + "WastedLocker 1680_Property 12\n", + "Kitty 5060_sample.exe 12\n", + "SunCrypt 1816_sample.exe 11\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "DearCry 1084_sample.exe 10\n", + "Medusa_long 6052_sample.exe 8\n", + "Sodinokibi_long 6020_sample.exe 7\n", + "Prilux 1696_sample.exe 6\n", + "Ransom6_long 3320_sample.exe 5\n", + "CMD_Ransom 2884_sample.exe 4\n", + "Trash 3996_sample.exe 4\n", + "Ragnar 3532_sample.exe 3\n", + "Ku_long 5876_sample.exe 1\n", + "Btcware 5436_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 14\n", + "Exedat_long 2400_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Atten_long 5064_sample.exe 2\n", + "dtype: int64\n", + "FPs: \n", + "ransomware_name PID_Process \n", + "Avemaria_Rat_Trojan_Stealer 4776_images.exe 18\n", + "benign_dap10 4200_sample.exe 6\n", + "benign_setup_x86_x64_install 6088_odbcconf.exe 4\n", + "Avemaria_Rat_Trojan_Stealer 6132_sample.exe 2\n", + "dtype: int64\n", + "thr: 0.73\n", + "Recall val: \n", + "0.02703113135914958\n", + "Precision val: \n", + "0.8640776699029126\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "Beaf 1088_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "Nread 5852_sample.exe 12\n", + "WastedLocker 1680_Property 12\n", + "Kitty 5060_sample.exe 12\n", + "SunCrypt 1816_sample.exe 11\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "DearCry 1084_sample.exe 10\n", + "Medusa_long 6052_sample.exe 8\n", + "Sodinokibi_long 6020_sample.exe 7\n", + "Prilux 1696_sample.exe 6\n", + "Ransom6_long 3320_sample.exe 5\n", + "CMD_Ransom 2884_sample.exe 4\n", + "Trash 3996_sample.exe 4\n", + "Ragnar 3532_sample.exe 3\n", + "Ku_long 5876_sample.exe 1\n", + "Btcware 5436_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 14\n", + "Exedat_long 2400_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Atten_long 5064_sample.exe 2\n", + "dtype: int64\n", + "FPs: \n", + "ransomware_name PID_Process \n", + "Avemaria_Rat_Trojan_Stealer 4776_images.exe 18\n", + "benign_dap10 4200_sample.exe 6\n", + "Avemaria_Rat_Trojan_Stealer 6132_sample.exe 2\n", + "benign_setup_x86_x64_install 6088_odbcconf.exe 2\n", + "dtype: int64\n", + "thr: 0.74\n", + "Recall val: \n", + "0.026879271070615034\n", + "Precision val: \n", + "0.9267015706806283\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "Beaf 1088_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "Nread 5852_sample.exe 12\n", + "WastedLocker 1680_Property 12\n", + "Kitty 5060_sample.exe 12\n", + "SunCrypt 1816_sample.exe 11\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "DearCry 1084_sample.exe 10\n", + "Medusa_long 6052_sample.exe 8\n", + "Sodinokibi_long 6020_sample.exe 7\n", + "Prilux 1696_sample.exe 6\n", + "Ransom6_long 3320_sample.exe 5\n", + "CMD_Ransom 2884_sample.exe 4\n", + "Trash 3996_sample.exe 4\n", + "Ragnar 3532_sample.exe 2\n", + "Ku_long 5876_sample.exe 1\n", + "Btcware 5436_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 14\n", + "Exedat_long 2400_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Atten_long 5064_sample.exe 2\n", + "Ragnar 3532_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "ransomware_name PID_Process \n", + "benign_dap10 4200_sample.exe 6\n", + "Avemaria_Rat_Trojan_Stealer 4776_images.exe 4\n", + " 6132_sample.exe 2\n", + "benign_setup_x86_x64_install 6088_odbcconf.exe 2\n", + "dtype: int64\n", + "thr: 0.75\n", + "Recall val: \n", + "0.026727410782080487\n", + "Precision val: \n", + "0.9263157894736842\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "Beaf 1088_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "Nread 5852_sample.exe 12\n", + "WastedLocker 1680_Property 12\n", + "Kitty 5060_sample.exe 12\n", + "SunCrypt 1816_sample.exe 11\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "DearCry 1084_sample.exe 10\n", + "Medusa_long 6052_sample.exe 8\n", + "Sodinokibi_long 6020_sample.exe 7\n", + "Prilux 1696_sample.exe 6\n", + "Ransom6_long 3320_sample.exe 5\n", + "CMD_Ransom 2884_sample.exe 4\n", + "Trash 3996_sample.exe 3\n", + "Ragnar 3532_sample.exe 2\n", + "Ku_long 5876_sample.exe 1\n", + "Btcware 5436_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 15\n", + "Exedat_long 2400_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Atten_long 5064_sample.exe 2\n", + "Ragnar 3532_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "ransomware_name PID_Process \n", + "benign_dap10 4200_sample.exe 6\n", + "Avemaria_Rat_Trojan_Stealer 4776_images.exe 4\n", + " 6132_sample.exe 2\n", + "benign_setup_x86_x64_install 6088_odbcconf.exe 2\n", + "dtype: int64\n", + "thr: 0.76\n", + "Recall val: \n", + "0.026271829916476842\n", + "Precision val: \n", + "0.9611111111111111\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "Beaf 1088_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "Nread 5852_sample.exe 12\n", + "WastedLocker 1680_Property 12\n", + "Kitty 5060_sample.exe 12\n", + "SunCrypt 1816_sample.exe 11\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "DearCry 1084_sample.exe 9\n", + "Medusa_long 6052_sample.exe 8\n", + "Sodinokibi_long 6020_sample.exe 7\n", + "Ransom6_long 3320_sample.exe 5\n", + "Prilux 1696_sample.exe 5\n", + "CMD_Ransom 2884_sample.exe 4\n", + "Ragnar 3532_sample.exe 2\n", + "Trash 3996_sample.exe 2\n", + "Ku_long 5876_sample.exe 1\n", + "Btcware 5436_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 16\n", + "Exedat_long 2400_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Atten_long 5064_sample.exe 2\n", + "DearCry 1084_sample.exe 1\n", + "Prilux 1696_sample.exe 1\n", + "Ragnar 3532_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "ransomware_name PID_Process \n", + "Avemaria_Rat_Trojan_Stealer 4776_images.exe 3\n", + " 6132_sample.exe 2\n", + "benign_setup_x86_x64_install 6088_odbcconf.exe 2\n", + "dtype: int64\n", + "thr: 0.77\n", + "Recall val: \n", + "0.026271829916476842\n", + "Precision val: \n", + "0.9774011299435028\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "Beaf 1088_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "Nread 5852_sample.exe 12\n", + "WastedLocker 1680_Property 12\n", + "Kitty 5060_sample.exe 12\n", + "SunCrypt 1816_sample.exe 11\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "DearCry 1084_sample.exe 9\n", + "Medusa_long 6052_sample.exe 8\n", + "Sodinokibi_long 6020_sample.exe 7\n", + "Ransom6_long 3320_sample.exe 5\n", + "Prilux 1696_sample.exe 5\n", + "CMD_Ransom 2884_sample.exe 4\n", + "Ragnar 3532_sample.exe 2\n", + "Trash 3996_sample.exe 2\n", + "Ku_long 5876_sample.exe 1\n", + "Btcware 5436_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 16\n", + "Exedat_long 2400_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Atten_long 5064_sample.exe 2\n", + "DearCry 1084_sample.exe 1\n", + "Prilux 1696_sample.exe 1\n", + "Ragnar 3532_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "ransomware_name PID_Process \n", + "Avemaria_Rat_Trojan_Stealer 4776_images.exe 2\n", + " 6132_sample.exe 2\n", + "dtype: int64\n", + "thr: 0.78\n", + "Recall val: \n", + "0.025968109339407745\n", + "Precision val: \n", + "0.9941860465116279\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "Beaf 1088_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "Nread 5852_sample.exe 12\n", + "WastedLocker 1680_Property 12\n", + "Kitty 5060_sample.exe 12\n", + "SunCrypt 1816_sample.exe 11\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "Medusa_long 6052_sample.exe 8\n", + "DearCry 1084_sample.exe 8\n", + "Sodinokibi_long 6020_sample.exe 7\n", + "Ransom6_long 3320_sample.exe 5\n", + "CMD_Ransom 2884_sample.exe 4\n", + "Prilux 1696_sample.exe 4\n", + "Ragnar 3532_sample.exe 2\n", + "Trash 3996_sample.exe 2\n", + "Ku_long 5876_sample.exe 1\n", + "Btcware 5436_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 16\n", + "Exedat_long 2400_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Atten_long 5064_sample.exe 2\n", + "DearCry 1084_sample.exe 2\n", + "Prilux 1696_sample.exe 2\n", + "Ragnar 3532_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "ransomware_name PID_Process \n", + "Avemaria_Rat_Trojan_Stealer 4776_images.exe 1\n", + "dtype: int64\n", + "thr: 0.79\n", + "Recall val: \n", + "0.025208807896735005\n", + "Precision val: \n", + "1.0\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "WastedLocker 1680_Property 12\n", + "Nread 5852_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "Kitty 5060_sample.exe 12\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "SunCrypt 1816_sample.exe 11\n", + "Beaf 1088_sample.exe 9\n", + "Medusa_long 6052_sample.exe 8\n", + "DearCry 1084_sample.exe 8\n", + "Sodinokibi_long 6020_sample.exe 7\n", + "Ransom6_long 3320_sample.exe 5\n", + "CMD_Ransom 2884_sample.exe 4\n", + "Prilux 1696_sample.exe 4\n", + "Btcware 5436_sample.exe 1\n", + "Ragnar 3532_sample.exe 1\n", + "Ku_long 5876_sample.exe 1\n", + "Trash 3996_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 17\n", + "Exedat_long 2400_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Beaf 1088_sample.exe 3\n", + "Atten_long 5064_sample.exe 2\n", + "DearCry 1084_sample.exe 2\n", + "Prilux 1696_sample.exe 2\n", + "Ragnar 3532_sample.exe 2\n", + "dtype: int64\n", + "FPs: \n", + "Series([], dtype: int64)\n", + "thr: 0.8\n", + "Recall val: \n", + "0.024145785876993165\n", + "Precision val: \n", + "1.0\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "Nread 5852_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "WastedLocker 1680_Property 12\n", + "Kitty 5060_sample.exe 12\n", + "SunCrypt 1816_sample.exe 11\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "Medusa_long 6052_sample.exe 8\n", + "Sodinokibi_long 6020_sample.exe 7\n", + "DearCry 1084_sample.exe 6\n", + "Ransom6_long 3320_sample.exe 5\n", + "Beaf 1088_sample.exe 5\n", + "Prilux 1696_sample.exe 4\n", + "CMD_Ransom 2884_sample.exe 4\n", + "Ku_long 5876_sample.exe 1\n", + "Btcware 5436_sample.exe 1\n", + "Ragnar 3532_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 18\n", + "Beaf 1088_sample.exe 7\n", + "Exedat_long 2400_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "DearCry 1084_sample.exe 4\n", + "Atten_long 5064_sample.exe 2\n", + "Prilux 1696_sample.exe 2\n", + "Ragnar 3532_sample.exe 2\n", + "dtype: int64\n", + "FPs: \n", + "Series([], dtype: int64)\n", + "thr: 0.81\n", + "Recall val: \n", + "0.023386484434320426\n", + "Precision val: \n", + "1.0\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "Nread 5852_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "WastedLocker 1680_Property 12\n", + "Kitty 5060_sample.exe 12\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "SunCrypt 1816_sample.exe 10\n", + "Medusa_long 6052_sample.exe 8\n", + "Sodinokibi_long 6020_sample.exe 7\n", + "Ransom6_long 3320_sample.exe 5\n", + "Prilux 1696_sample.exe 4\n", + "DearCry 1084_sample.exe 4\n", + "CMD_Ransom 2884_sample.exe 4\n", + "Beaf 1088_sample.exe 3\n", + "Ku_long 5876_sample.exe 1\n", + "Btcware 5436_sample.exe 1\n", + "Ragnar 3532_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 18\n", + "Beaf 1088_sample.exe 9\n", + "DearCry 1084_sample.exe 6\n", + "Exedat_long 2400_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Atten_long 5064_sample.exe 2\n", + "Prilux 1696_sample.exe 2\n", + "Ragnar 3532_sample.exe 2\n", + "SunCrypt 1816_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "Series([], dtype: int64)\n", + "thr: 0.8200000000000001\n", + "Recall val: \n", + "0.02293090356871678\n", + "Precision val: \n", + "1.0\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "Nread 5852_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "WastedLocker 1680_Property 12\n", + "Kitty 5060_sample.exe 12\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "SunCrypt 1816_sample.exe 10\n", + "Medusa_long 6052_sample.exe 8\n", + "Sodinokibi_long 6020_sample.exe 7\n", + "Ransom6_long 3320_sample.exe 5\n", + "Prilux 1696_sample.exe 4\n", + "CMD_Ransom 2884_sample.exe 4\n", + "Beaf 1088_sample.exe 3\n", + "Ku_long 5876_sample.exe 1\n", + "Btcware 5436_sample.exe 1\n", + "Ragnar 3532_sample.exe 1\n", + "DearCry 1084_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 18\n", + "Beaf 1088_sample.exe 9\n", + "DearCry 1084_sample.exe 9\n", + "Exedat_long 2400_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Atten_long 5064_sample.exe 2\n", + "Prilux 1696_sample.exe 2\n", + "Ragnar 3532_sample.exe 2\n", + "SunCrypt 1816_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "Series([], dtype: int64)\n", + "thr: 0.8300000000000001\n", + "Recall val: \n", + "0.02217160212604404\n", + "Precision val: \n", + "1.0\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "WastedLocker 1680_Property 12\n", + "Kitty 5060_sample.exe 12\n", + "Nread 5852_sample.exe 12\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "SunCrypt 1816_sample.exe 10\n", + "SystemXTBL 3256_systems.exe 9\n", + "Medusa_long 6052_sample.exe 8\n", + "Sodinokibi_long 6020_sample.exe 7\n", + "Ransom6_long 3320_sample.exe 5\n", + "Prilux 1696_sample.exe 4\n", + "CMD_Ransom 2884_sample.exe 4\n", + "Beaf 1088_sample.exe 2\n", + "Ragnar 3532_sample.exe 1\n", + "Btcware 5436_sample.exe 1\n", + "Ku_long 5876_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 18\n", + "Beaf 1088_sample.exe 10\n", + "DearCry 1084_sample.exe 10\n", + "Exedat_long 2400_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "SystemXTBL 3256_systems.exe 3\n", + "Atten_long 5064_sample.exe 2\n", + "Prilux 1696_sample.exe 2\n", + "Ragnar 3532_sample.exe 2\n", + "SunCrypt 1816_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "Series([], dtype: int64)\n", + "thr: 0.84\n", + "Recall val: \n", + "0.02050113895216401\n", + "Precision val: \n", + "1.0\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "Kitty 5060_sample.exe 12\n", + "Nread 5852_sample.exe 12\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "SunCrypt 1816_sample.exe 10\n", + "Medusa_long 6052_sample.exe 8\n", + "WastedLocker 1680_Property 7\n", + "Sodinokibi_long 6020_sample.exe 7\n", + "SystemXTBL 3256_systems.exe 5\n", + "Ransom6_long 3320_sample.exe 5\n", + "Prilux 1696_sample.exe 4\n", + "CMD_Ransom 2884_sample.exe 4\n", + "Ragnar 3532_sample.exe 1\n", + "Ku_long 5876_sample.exe 1\n", + "Btcware 5436_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 18\n", + "Beaf 1088_sample.exe 12\n", + "DearCry 1084_sample.exe 10\n", + "SystemXTBL 3256_systems.exe 7\n", + "Exedat_long 2400_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "WastedLocker 1680_Property 5\n", + "Atten_long 5064_sample.exe 2\n", + "Prilux 1696_sample.exe 2\n", + "Ragnar 3532_sample.exe 2\n", + "SunCrypt 1816_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "Series([], dtype: int64)\n", + "thr: 0.85\n", + "Recall val: \n", + "0.019438116932422173\n", + "Precision val: \n", + "1.0\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "Kitty 5060_sample.exe 12\n", + "Nread 5852_sample.exe 12\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "SunCrypt 1816_sample.exe 9\n", + "Medusa_long 6052_sample.exe 8\n", + "Sodinokibi_long 6020_sample.exe 7\n", + "WastedLocker 1680_Property 6\n", + "Ransom6_long 3320_sample.exe 5\n", + "CMD_Ransom 2884_sample.exe 4\n", + "Prilux 1696_sample.exe 4\n", + "Ku_long 5876_sample.exe 1\n", + "Ragnar 3532_sample.exe 1\n", + "SystemXTBL 3256_systems.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 18\n", + "Beaf 1088_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 11\n", + "DearCry 1084_sample.exe 10\n", + "Exedat_long 2400_sample.exe 6\n", + "WastedLocker 1680_Property 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Atten_long 5064_sample.exe 2\n", + "Prilux 1696_sample.exe 2\n", + "Ragnar 3532_sample.exe 2\n", + "SunCrypt 1816_sample.exe 2\n", + "Btcware 5436_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "Series([], dtype: int64)\n", + "thr: 0.86\n", + "Recall val: \n", + "0.018830675778283977\n", + "Precision val: \n", + "1.0\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "Kitty 5060_sample.exe 12\n", + "Nread 5852_sample.exe 12\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "SunCrypt 1816_sample.exe 9\n", + "Medusa_long 6052_sample.exe 8\n", + "Sodinokibi_long 6020_sample.exe 7\n", + "Ransom6_long 3320_sample.exe 5\n", + "WastedLocker 1680_Property 5\n", + "CMD_Ransom 2884_sample.exe 4\n", + "Prilux 1696_sample.exe 2\n", + "Ku_long 5876_sample.exe 1\n", + "Ragnar 3532_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 18\n", + "Beaf 1088_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "DearCry 1084_sample.exe 10\n", + "WastedLocker 1680_Property 7\n", + "Exedat_long 2400_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Prilux 1696_sample.exe 4\n", + "Atten_long 5064_sample.exe 2\n", + "Ragnar 3532_sample.exe 2\n", + "SunCrypt 1816_sample.exe 2\n", + "Btcware 5436_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "Series([], dtype: int64)\n", + "thr: 0.87\n", + "Recall val: \n", + "0.017160212604403948\n", + "Precision val: \n", + "1.0\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "Kitty 5060_sample.exe 12\n", + "Nread 5852_sample.exe 12\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "Medusa_long 6052_sample.exe 7\n", + "Sodinokibi_long 6020_sample.exe 7\n", + "Ransom6_long 3320_sample.exe 5\n", + "CMD_Ransom 2884_sample.exe 4\n", + "SunCrypt 1816_sample.exe 4\n", + "Prilux 1696_sample.exe 2\n", + "Ku_long 5876_sample.exe 1\n", + "Ragnar 3532_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 18\n", + "Beaf 1088_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "WastedLocker 1680_Property 12\n", + "DearCry 1084_sample.exe 10\n", + "SunCrypt 1816_sample.exe 7\n", + "Exedat_long 2400_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Prilux 1696_sample.exe 4\n", + "Atten_long 5064_sample.exe 2\n", + "Ragnar 3532_sample.exe 2\n", + "Btcware 5436_sample.exe 1\n", + "Medusa_long 6052_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "Series([], dtype: int64)\n", + "thr: 0.88\n", + "Recall val: \n", + "0.016552771450265756\n", + "Precision val: \n", + "1.0\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "Kitty 5060_sample.exe 12\n", + "Nread 5852_sample.exe 12\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "Sodinokibi_long 6020_sample.exe 7\n", + "Medusa_long 6052_sample.exe 6\n", + "Ransom6_long 3320_sample.exe 5\n", + "CMD_Ransom 2884_sample.exe 4\n", + "SunCrypt 1816_sample.exe 3\n", + "Ku_long 5876_sample.exe 1\n", + "Prilux 1696_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 18\n", + "Beaf 1088_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "WastedLocker 1680_Property 12\n", + "DearCry 1084_sample.exe 10\n", + "SunCrypt 1816_sample.exe 8\n", + "Exedat_long 2400_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Prilux 1696_sample.exe 5\n", + "Ragnar 3532_sample.exe 3\n", + "Atten_long 5064_sample.exe 2\n", + "Medusa_long 6052_sample.exe 2\n", + "Btcware 5436_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "Series([], dtype: int64)\n", + "thr: 0.89\n", + "Recall val: \n", + "0.01624905087319666\n", + "Precision val: \n", + "1.0\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "Kitty 5060_sample.exe 12\n", + "Nread 5852_sample.exe 12\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "Medusa_long 6052_sample.exe 6\n", + "Sodinokibi_long 6020_sample.exe 6\n", + "Ransom6_long 3320_sample.exe 5\n", + "CMD_Ransom 2884_sample.exe 4\n", + "SunCrypt 1816_sample.exe 3\n", + "Ku_long 5876_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 18\n", + "Beaf 1088_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "WastedLocker 1680_Property 12\n", + "DearCry 1084_sample.exe 10\n", + "SunCrypt 1816_sample.exe 8\n", + "Exedat_long 2400_sample.exe 6\n", + "Prilux 1696_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Ragnar 3532_sample.exe 3\n", + "Atten_long 5064_sample.exe 2\n", + "Medusa_long 6052_sample.exe 2\n", + "Btcware 5436_sample.exe 1\n", + "Sodinokibi_long 6020_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "Series([], dtype: int64)\n", + "thr: 0.9\n", + "Recall val: \n", + "0.015641609719058466\n", + "Precision val: \n", + "1.0\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "Kitty 5060_sample.exe 11\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "Nread 5852_sample.exe 10\n", + "Sodinokibi_long 6020_sample.exe 6\n", + "Medusa_long 6052_sample.exe 5\n", + "Ransom6_long 3320_sample.exe 5\n", + "CMD_Ransom 2884_sample.exe 4\n", + "SunCrypt 1816_sample.exe 3\n", + "Ku_long 5876_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 18\n", + "Beaf 1088_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "WastedLocker 1680_Property 12\n", + "DearCry 1084_sample.exe 10\n", + "SunCrypt 1816_sample.exe 8\n", + "Exedat_long 2400_sample.exe 6\n", + "Prilux 1696_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Medusa_long 6052_sample.exe 3\n", + "Ragnar 3532_sample.exe 3\n", + "Atten_long 5064_sample.exe 2\n", + "Nread 5852_sample.exe 2\n", + "Btcware 5436_sample.exe 1\n", + "Kitty 5060_sample.exe 1\n", + "Sodinokibi_long 6020_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "Series([], dtype: int64)\n", + "thr: 0.91\n", + "Recall val: \n", + "0.015489749430523917\n", + "Precision val: \n", + "1.0\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "Kitty 5060_sample.exe 11\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "Nread 5852_sample.exe 10\n", + "Sodinokibi_long 6020_sample.exe 6\n", + "Medusa_long 6052_sample.exe 5\n", + "Ransom6_long 3320_sample.exe 5\n", + "CMD_Ransom 2884_sample.exe 4\n", + "SunCrypt 1816_sample.exe 2\n", + "Ku_long 5876_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 18\n", + "Beaf 1088_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "WastedLocker 1680_Property 12\n", + "DearCry 1084_sample.exe 10\n", + "SunCrypt 1816_sample.exe 9\n", + "Exedat_long 2400_sample.exe 6\n", + "Prilux 1696_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Medusa_long 6052_sample.exe 3\n", + "Ragnar 3532_sample.exe 3\n", + "Atten_long 5064_sample.exe 2\n", + "Nread 5852_sample.exe 2\n", + "Btcware 5436_sample.exe 1\n", + "Kitty 5060_sample.exe 1\n", + "Sodinokibi_long 6020_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "Series([], dtype: int64)\n", + "thr: 0.92\n", + "Recall val: \n", + "0.01457858769931663\n", + "Precision val: \n", + "1.0\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "Kitty 5060_sample.exe 11\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "Nread 5852_sample.exe 6\n", + "Sodinokibi_long 6020_sample.exe 6\n", + "Medusa_long 6052_sample.exe 5\n", + "Ransom6_long 3320_sample.exe 5\n", + "CMD_Ransom 2884_sample.exe 4\n", + "Ku_long 5876_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 18\n", + "Beaf 1088_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "WastedLocker 1680_Property 12\n", + "SunCrypt 1816_sample.exe 11\n", + "DearCry 1084_sample.exe 10\n", + "Exedat_long 2400_sample.exe 6\n", + "Nread 5852_sample.exe 6\n", + "Prilux 1696_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Medusa_long 6052_sample.exe 3\n", + "Ragnar 3532_sample.exe 3\n", + "Atten_long 5064_sample.exe 2\n", + "Btcware 5436_sample.exe 1\n", + "Kitty 5060_sample.exe 1\n", + "Sodinokibi_long 6020_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "Series([], dtype: int64)\n", + "thr: 0.93\n", + "Recall val: \n", + "0.013211845102505695\n", + "Precision val: \n", + "1.0\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "Kitty 5060_sample.exe 9\n", + "Sodinokibi_long 6020_sample.exe 6\n", + "CMD_Ransom 2884_sample.exe 4\n", + "Medusa_long 6052_sample.exe 4\n", + "Nread 5852_sample.exe 4\n", + "Ransom6_long 3320_sample.exe 2\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 18\n", + "WastedLocker 1680_Property 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "Beaf 1088_sample.exe 12\n", + "SunCrypt 1816_sample.exe 11\n", + "DearCry 1084_sample.exe 10\n", + "Nread 5852_sample.exe 8\n", + "Prilux 1696_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Exedat_long 2400_sample.exe 6\n", + "Medusa_long 6052_sample.exe 4\n", + "Ragnar 3532_sample.exe 3\n", + "Ransom6_long 3320_sample.exe 3\n", + "Kitty 5060_sample.exe 3\n", + "Atten_long 5064_sample.exe 2\n", + "Sodinokibi_long 6020_sample.exe 1\n", + "Ku_long 5876_sample.exe 1\n", + "Btcware 5436_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "Series([], dtype: int64)\n", + "thr: 0.9400000000000001\n", + "Recall val: \n", + "0.011996962794229309\n", + "Precision val: \n", + "1.0\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Minjal 6128_sample.exe 13\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "Sodinokibi_long 6020_sample.exe 6\n", + "CMD_Ransom 2884_sample.exe 4\n", + "Medusa_long 6052_sample.exe 4\n", + "Kitty 5060_sample.exe 3\n", + "Nread 5852_sample.exe 2\n", + "Ransom6_long 3320_sample.exe 2\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 18\n", + "Beaf 1088_sample.exe 12\n", + "WastedLocker 1680_Property 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "SunCrypt 1816_sample.exe 11\n", + "DearCry 1084_sample.exe 10\n", + "Nread 5852_sample.exe 10\n", + "Kitty 5060_sample.exe 9\n", + "Prilux 1696_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Exedat_long 2400_sample.exe 6\n", + "Medusa_long 6052_sample.exe 4\n", + "Ragnar 3532_sample.exe 3\n", + "Ransom6_long 3320_sample.exe 3\n", + "Atten_long 5064_sample.exe 2\n", + "Sodinokibi_long 6020_sample.exe 1\n", + "Ku_long 5876_sample.exe 1\n", + "Btcware 5436_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "Series([], dtype: int64)\n", + "thr: 0.9500000000000001\n", + "Recall val: \n", + "0.010174639331814731\n", + "Precision val: \n", + "1.0\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Green 5092_sample.exe 14\n", + "Minjal 6128_sample.exe 13\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 9\n", + "Sodinokibi_long 6020_sample.exe 6\n", + "CMD_Ransom 2884_sample.exe 4\n", + "Kitty 5060_sample.exe 1\n", + "Medusa_long 6052_sample.exe 1\n", + "Nread 5852_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 18\n", + "Beaf 1088_sample.exe 12\n", + "WastedLocker 1680_Property 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "Kitty 5060_sample.exe 11\n", + "SunCrypt 1816_sample.exe 11\n", + "Nread 5852_sample.exe 11\n", + "DearCry 1084_sample.exe 10\n", + "Medusa_long 6052_sample.exe 7\n", + "Prilux 1696_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Exedat_long 2400_sample.exe 6\n", + "Ransom6_long 3320_sample.exe 5\n", + "Ragnar 3532_sample.exe 3\n", + "Green 5092_sample.exe 2\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 2\n", + "Atten_long 5064_sample.exe 2\n", + "Sodinokibi_long 6020_sample.exe 1\n", + "Ku_long 5876_sample.exe 1\n", + "Btcware 5436_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "Series([], dtype: int64)\n", + "thr: 0.96\n", + "Recall val: \n", + "0.009111617312072893\n", + "Precision val: \n", + "1.0\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Minjal 6128_sample.exe 13\n", + "Green 5092_sample.exe 11\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 9\n", + "Sodinokibi_long 6020_sample.exe 5\n", + "CMD_Ransom 2884_sample.exe 4\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 18\n", + "Beaf 1088_sample.exe 12\n", + "WastedLocker 1680_Property 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "Kitty 5060_sample.exe 12\n", + "Nread 5852_sample.exe 12\n", + "SunCrypt 1816_sample.exe 11\n", + "DearCry 1084_sample.exe 10\n", + "Medusa_long 6052_sample.exe 8\n", + "Prilux 1696_sample.exe 6\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Exedat_long 2400_sample.exe 6\n", + "Ransom6_long 3320_sample.exe 5\n", + "Green 5092_sample.exe 5\n", + "Ragnar 3532_sample.exe 3\n", + "Sodinokibi_long 6020_sample.exe 2\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 2\n", + "Atten_long 5064_sample.exe 2\n", + "Ku_long 5876_sample.exe 1\n", + "Btcware 5436_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "Series([], dtype: int64)\n", + "thr: 0.97\n", + "Recall val: \n", + "0.006074411541381929\n", + "Precision val: \n", + "1.0\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Minjal 6128_sample.exe 11\n", + "CMD_Ransom 2884_sample.exe 4\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 4\n", + "Sodinokibi_long 6020_sample.exe 2\n", + "Green 5092_sample.exe 1\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 18\n", + "Green 5092_sample.exe 15\n", + "Nread 5852_sample.exe 12\n", + "WastedLocker 1680_Property 12\n", + "Kitty 5060_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "Beaf 1088_sample.exe 12\n", + "SunCrypt 1816_sample.exe 11\n", + "DearCry 1084_sample.exe 10\n", + "Medusa_long 6052_sample.exe 8\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 7\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Prilux 1696_sample.exe 6\n", + "Exedat_long 2400_sample.exe 6\n", + "Ransom6_long 3320_sample.exe 5\n", + "Sodinokibi_long 6020_sample.exe 5\n", + "Ragnar 3532_sample.exe 3\n", + "Minjal 6128_sample.exe 2\n", + "Atten_long 5064_sample.exe 2\n", + "Ku_long 5876_sample.exe 1\n", + "Btcware 5436_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "Series([], dtype: int64)\n", + "thr: 0.98\n", + "Recall val: \n", + "0.004555808656036446\n", + "Precision val: \n", + "1.0\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Minjal 6128_sample.exe 8\n", + "CMD_Ransom 2884_sample.exe 4\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Nread 5852_sample.exe 12\n", + "WastedLocker 1680_Property 12\n", + "Kitty 5060_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "Beaf 1088_sample.exe 12\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "SunCrypt 1816_sample.exe 11\n", + "DearCry 1084_sample.exe 10\n", + "Medusa_long 6052_sample.exe 8\n", + "Sodinokibi_long 6020_sample.exe 7\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Prilux 1696_sample.exe 6\n", + "Exedat_long 2400_sample.exe 6\n", + "Ransom6_long 3320_sample.exe 5\n", + "Minjal 6128_sample.exe 5\n", + "Ragnar 3532_sample.exe 3\n", + "Atten_long 5064_sample.exe 2\n", + "Ku_long 5876_sample.exe 1\n", + "Btcware 5436_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "Series([], dtype: int64)\n", + "thr: 0.99\n", + "Recall val: \n", + "0.003948367501898253\n", + "Precision val: \n", + "1.0\n", + "TPs: \n", + "ransomware_name PID_Process \n", + "Shacker 2212_sample.exe 18\n", + "Minjal 6128_sample.exe 5\n", + "CMD_Ransom 2884_sample.exe 3\n", + "dtype: int64\n", + "FNs: \n", + "ransomware_name PID_Process \n", + "Trash 3996_sample.exe 18\n", + "Green 5092_sample.exe 16\n", + "Nread 5852_sample.exe 12\n", + "WastedLocker 1680_Property 12\n", + "Kitty 5060_sample.exe 12\n", + "SystemXTBL 3256_systems.exe 12\n", + "Beaf 1088_sample.exe 12\n", + "Teslacrypt2 1744_uyavudaiwoyc.e 11\n", + "SunCrypt 1816_sample.exe 11\n", + "DearCry 1084_sample.exe 10\n", + "Medusa_long 6052_sample.exe 8\n", + "Minjal 6128_sample.exe 8\n", + "Sodinokibi_long 6020_sample.exe 7\n", + "WindowsUpdate 1272_sample.exe 6\n", + "Prilux 1696_sample.exe 6\n", + "Exedat_long 2400_sample.exe 6\n", + "Ransom6_long 3320_sample.exe 5\n", + "Ragnar 3532_sample.exe 3\n", + "Atten_long 5064_sample.exe 2\n", + "Ku_long 5876_sample.exe 1\n", + "CMD_Ransom 2884_sample.exe 1\n", + "Btcware 5436_sample.exe 1\n", + "dtype: int64\n", + "FPs: \n", + "Series([], dtype: int64)\n" + ] + } + ], + "source": [ + "model_eval(model, val_data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Save Model" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "save_model(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusions\n", + "Here we show an example of how to train a single-model for a time window of 3 snapshots. If we extened this training to create three cascading models with time windows of 3, 5, and 10 snapshots our precision is 90% and our recall is also 90%. Our model based on AppShield - BlueField which is an agentless system. By using AppShield we succeeded to detect ransomware without the ransomware is knowing that we are monitoring. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## References\n", + "##### https://github.com/volatilityfoundation/volatility3\n", + "##### https://developer.nvidia.com/networking/doca" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 010f0113a4d52004ade6e852085c9aeddc29f007 Mon Sep 17 00:00:00 2001 From: David Gardner <96306125+dagardner-nv@users.noreply.github.com> Date: Tue, 28 Jun 2022 11:54:13 -0700 Subject: [PATCH 60/73] Documentation fixes (#147) Documentation updates to: * Reflect Python module re-org, and config changes to Git LFS * Fixes from Adam Wood * Remove usage of third-party psutils lib (no longer in Conda env and not strictly needed) * Remove instructions for building patched cudf * Update pipeline images for examples Fixes #92 Authors: - David Gardner (https://github.com/dagardner-nv) - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - Michael Demoret (https://github.com/mdemoret-nv) - https://github.com/bsuryadevara - Devin Robison (https://github.com/drobison00) URL: https://github.com/nv-morpheus/Morpheus/pull/147 --- CONTRIBUTING.md | 114 +++++++++- README.md | 205 +++--------------- docs/source/basics/overview.rst | 1 + .../guides/1_simple_python_stage.md | 4 +- .../guides/2_real_world_phishing.md | 16 +- .../guides/3_simple_cpp_stage.md | 4 +- .../guides/4_source_cpp_stage.md | 7 +- docs/source/extra_info/troubleshooting.md | 2 +- docs/source/index.rst | 112 +--------- docs/source/morpheus_quickstart_guide.md | 79 ++++--- examples/abp_nvsmi_detection/README.md | 19 +- examples/abp_nvsmi_detection/pipeline.png | Bin 18630 -> 15682 bytes examples/abp_pcap_detection/README.md | 2 +- .../abp_pcap_preprocessing.py | 3 + .../img/abp_pcap_detection.png | Bin 14406 -> 19396 bytes examples/log_parsing/README.md | 13 +- examples/nlp_si_detection/README.md | 2 +- examples/nlp_si_detection/pipeline.png | Bin 22768 -> 17114 bytes morpheus.code-workspace | 8 +- scripts/validation/val-run-pipeline.sh | 10 +- 20 files changed, 254 insertions(+), 347 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 361996cdfb..38dfd1d488 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -134,7 +134,7 @@ This workflow utilizes a docker container to set up most dependencies ensuring a (morpheus) user@host:/workspace# conda list | grep python python 3.8.13 py3.8.13_dbg_morpheus local ``` - 1. Note: This does not build any Morpheus or Neo code and defers building the code until the entire repo can be mounted into a running container. This allows for faster incremental builds during development. + 1. Note: This does not build any Morpheus or SRF code and defers building the code until the entire repo can be mounted into a running container. This allows for faster incremental builds during development. 2. Run the development container ```bash ./docker/run_container_dev.sh @@ -148,6 +148,9 @@ This workflow utilizes a docker container to set up most dependencies ensuring a Then once the container is started you will need to install some extra packages to enable launching docker containers: ```bash ./docker/install_docker.sh + + # Install utils for checking output + apt install -y jq bc ``` 3. Compile Morpheus @@ -234,6 +237,115 @@ Note: These instructions assume the user is using `mamba` instead of `conda` sin ``` At this point, Morpheus can be fully used. Any changes to Python code will not require a rebuild. Changes to C++ code will require calling `./scripts/compile.sh`. Installing Morpheus is only required once per virtual environment. +### Quick Launch Kafka Cluster + +Launching a full production Kafka cluster is outside the scope of this project. However, if a quick cluster is needed for testing or development, one can be quickly launched via Docker Compose. The following commands outline that process. See [this](https://medium.com/big-data-engineering/hello-kafka-world-the-complete-guide-to-kafka-with-docker-and-python-f788e2588cfc) guide for more in-depth information: + +1. Install `docker-compose` if not already installed: + + ```bash + conda install -c conda-forge docker-compose + ``` +2. Clone the `kafka-docker` repo from the Morpheus repo root: + + ```bash + git clone https://github.com/wurstmeister/kafka-docker.git + ``` +3. Change directory to `kafka-docker`: + + ```bash + cd kafka-docker + ``` +4. Export the IP address of your Docker `bridge` network: + + ```bash + export KAFKA_ADVERTISED_HOST_NAME=$(docker network inspect bridge | jq -r '.[0].IPAM.Config[0].Gateway') + ``` +5. Update the `kafka-docker/docker-compose.yml` so the environment variable `KAFKA_ADVERTISED_HOST_NAME` matches the previous step. For example, the line should look like: + + ```yml + environment: + KAFKA_ADVERTISED_HOST_NAME: 172.17.0.1 + ``` + Which should match the value of `$KAFKA_ADVERTISED_HOST_NAME` from the previous step: + + ```bash + $ echo $KAFKA_ADVERTISED_HOST_NAME + "172.17.0.1" + ``` +6. Launch kafka with 3 instances: + + ```bash + docker-compose up -d --scale kafka=3 + ``` + In practice, 3 instances has been shown to work well. Use as many instances as required. Keep in mind each instance takes about 1 Gb of memory. +7. Create the topic: + + ```bash + ./start-kafka-shell.sh $KAFKA_ADVERTISED_HOST_NAME + $KAFKA_HOME/bin/kafka-topics.sh --create --topic=$MY_INPUT_TOPIC_NAME --bootstrap-server `broker-list.sh` + ``` + Replace `` with the input name of your choice. If you are using `to-kafka`, ensure your output topic is also created. + +8. Generate input messages + 1. In order for Morpheus to read from Kafka, messages need to be published to the cluster. For debugging/testing purposes, the following container can be used: + + ```bash + # Download from https://netq-shared.s3-us-west-2.amazonaws.com/kafka-producer.tar.gz + wget https://netq-shared.s3-us-west-2.amazonaws.com/kafka-producer.tar.gz + # Load container + docker load --input kafka-producer.tar.gz + # Run the producer container + docker run --rm -it -e KAFKA_BROKER_SERVERS=$(broker-list.sh) -e INPUT_FILE_NAME=$MY_INPUT_FILE -e TOPIC_NAME=$MY_INPUT_TOPIC_NAME --mount src="$PWD,target=/app/data/,type=bind" kafka-producer:1 + ``` + In order for this to work, your input file must be accessible from `$PWD`. + 2. You can view the messages with: + + ```bash + ./start-kafka-shell.sh $KAFKA_ADVERTISED_HOST_NAME + $KAFKA_HOME/bin/kafka-console-consumer.sh --topic=$MY_TOPIC --bootstrap-server `broker-list.sh` + ``` + +### Launching Triton Server + +Many of the validation tests and example workflows require a Triton server to function. To launch Triton server, use the following command: + +```bash +docker run --rm -ti --gpus=all -p8000:8000 -p8001:8001 -p8002:8002 -v $PWD/models:/models \ + nvcr.io/nvidia/tritonserver:21.12-py3 \ + tritonserver --model-repository=/models/triton-model-repo \ + --exit-on-error=false \ + --model-control-mode=explicit \ + --load-model abp-nvsmi-xgb \ + --load-model sid-minibert-onnx \ + --load-model phishing-bert-onnx +``` +This will launch Triton using port 8001 for the GRPC server. This needs to match the Morpheus configuration. + +### Pipeline Validation + +To verify that all pipelines are working correctly, validation scripts have been added at `${MORPHEUS_ROOT}/scripts/validation`. There are scripts for each of the main workflows: Anomalous Behavior Profiling (ABP), Humans-as-Machines-Machines-as-Humans (HAMMAH), Phishing Detection (Phishing), and Sensitive Information Detection (SID). + +To run all of the validation workflow scripts, use the following commands: + +```bash +# Run validation scripts +./scripts/validation/val-run-all.sh +``` + +At the end of each workflow, a section will print the different inference workloads that were run and the validation error percentage for each. For example: + +```bash +===ERRORS=== +PyTorch :3/314 (0.96 %) +Triton(ONNX):Skipped +Triton(TRT) :Skipped +TensorRT :Skipped +Complete! +``` + +This indicates that only 3 out of 314 rows did not match the validation dataset. If you see errors similar to `:/ ( %)` or very high percentages, then the workflow did not complete sucessfully. + ### Troubleshooting the Build Due to the large number of dependencies, it's common to run into build issues. The follow are some common issues, tips, and suggestions: diff --git a/README.md b/README.md index 9a4bdb00c4..23d51e68c7 100644 --- a/README.md +++ b/README.md @@ -7,18 +7,27 @@ NVIDIA Morpheus is an open AI application framework that provides cybersecurity ## Documentation Full documentation (including a quick start guide, a developer/user guide, and API documentation) is available online at [https://docs.nvidia.com/morpheus/](https://docs.nvidia.com/morpheus/). -## Getting Started with Morpheus -The instructions below provide guidelines on how to get started with the pre-built Docker container, build the Morpheus Docker container yourself, or build Morpheus from source. +## Getting Started with Morpheus +There are three ways to get started with Morpheus: +- Using pre-built Docker containers +- Building the Morpheus Docker container +- Building Morpheus from source + +The pre-built Docker containers are the easiest way to get started with the latest release of Morpheus. Instructions on how to download and run these containers, including the necessary data and models, can be found on NGC [here](https://catalog.ngc.nvidia.com/orgs/nvidia/teams/morpheus/collections/morpheus_). + +More advanced users, or those who are interested in using the latest pre-release features, will need to build the Morpheus container or build from source. Step-by-step instructions for these users can be found in the following section. ### Prerequisites +The following sections must be followed prior to building the Morpheus container or building Morpheus from source. +#### Requirements - Pascal architecture or better - NVIDIA driver `450.80.02` or higher - [Docker](https://docs.docker.com/get-docker/) - [The NVIDIA container toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker) - [Git LFS](https://git-lfs.github.com/) -#### Ensure Git LFS is Installed +#### Git LFS The large model and data files in this repo are stored using [Git Large File Storage (LFS)](https://git-lfs.github.com/). These files will be required for running the training/validation scripts and example pipelines for the Morpheus pre-trained models. @@ -27,7 +36,7 @@ If `Git LFS` is not installed before cloning the repository, the large files wil git lfs install ``` -### Clone the Repository +#### Clone the Repository ```bash MORPHEUS_ROOT=$(pwd)/morpheus @@ -41,170 +50,45 @@ cd $MORPHEUS_ROOT git lfs pull ``` -#### Using the Pre-built `runtime` Docker Image - -Pre-built Morpheus Docker images can be downloaded from NGC. See [here](docs/source/morpheus_quickstart_guide.md#set-up-ngc-api-key-and-install-ngc-registry-cli) for details on accessing NGC. The `runtime` image includes Morpheus pre-built and its dependencies: +### Build Morpheus Container -```bash -docker pull nvcr.io/nvidia/morpheus/morpheus:-runtime -``` -where `` refers to the build of Morpheus you want. For example, if you want release 22.04, use the command: - -```bash -docker pull nvcr.io/nvidia/morpheus/morpheus:22.04-runtime -``` - -You can then run the pre-built `runtime` container using the provided script: - -```bash -DOCKER_IMAGE_TAG=-runtime ./docker/run_container_release.sh -``` -Again replacing `` with the appropriate release number. For v22.04, it becomes: - -```bash -DOCKER_IMAGE_TAG=22.04-runtime ./docker/run_container_release.sh -``` - -#### Manually Build the `runtime` Docker Image - -The Morpheus `runtime` image can also be built manually. This allows you to use a Morpheus build from the development branch or another branch/tag. -To manually build the `runtime` image, run the following from the repo's root: - -#### Build Locally (Outside a Container) - -To build Morpheus outside a container, all the necessary dependencies will need to be installed locally or in a virtual environment. Due to the increased complexity of installing outside of a container, this section has been moved to [`CONTRIBUTING.md`](CONTRIBUTING.md). Please see the "Build in a Conda Environment" section for more information. - -Note: Once `morpheus` CLI is installed, shell command completion can be installed with: +To assist in building the Morpheus container, several scripts have been provided in the `./docker` directory. To build the "release" container, run the following: ```bash ./docker/build_container_release.sh ``` -This will create an image named `nvcr.io/nvidia/morpheus/morpheus:latest`. -Run the manually built `runtime` container: +This will create an image named `nvcr.io/nvidia/morpheus/morpheus:${MORPHEUS_VERSION}-runtime` where `$MORPHEUS_VERSION` is replaced by the output of `git describe --tags --abbrev=0`. + +To run the built "release" container, use the following: ```bash ./docker/run_container_release.sh ``` -You can specify the specific image version by passing the script the `DOCKER_IMAGE_TAG` variable: + +You can specify different Docker images and tags by passing the script the `DOCKER_IMAGE_TAG`, and `DOCKER_IMAGE_TAG` variables respectively. For example, to run version `v22.06.00a` use the following: ```bash -DOCKER_IMAGE_TAG= ./docker/run_container_release.sh +DOCKER_IMAGE_TAG="v22.06.00a-runtime" ./docker/run_container_release.sh ``` -#### Build from Source +### Build from Source -Build instructions for developers and contributors can be found in [CONTRIBUTING.md](./CONTRIBUTING.md). +It's possible to build from source outside of a container. However, due to the large number of dependencies, this can be complex and is only necessary for developers. Instructions for developers and contributors can be found in [CONTRIBUTING.md](./CONTRIBUTING.md). ## Running Morpheus -Depending on your configuration, it may be necessary to start additional services that Morpheus will interact with before launching the pipeline. See the following list of stages that require additional services: - - - `from-kafka`/`to-kafka` - - Requires a running Kafka cluster - - See the Quick Launch Kafka section. - - `inf-triton` - - Requires a running Triton server - - See the Launching Triton Server section. - -### Quick Launch Kafka Cluster - -Launching a full production Kafka cluster is outside the scope of this project. However, if a quick cluster is needed for testing or development, one can be quickly launched via Docker Compose. The following commands outline that process. See [this](https://medium.com/big-data-engineering/hello-kafka-world-the-complete-guide-to-kafka-with-docker-and-python-f788e2588cfc) guide for more in-depth information: - -1. Install `docker-compose` if not already installed: - - ```bash - conda install -c conda-forge docker-compose - ``` -2. Clone the `kafka-docker` repo from the Morpheus repo root: - - ```bash - git clone https://github.com/wurstmeister/kafka-docker.git - ``` -3. Change directory to `kafka-docker`: - - ```bash - cd kafka-docker - ``` -4. Export the IP address of your Docker `bridge` network: - - ```bash - export KAFKA_ADVERTISED_HOST_NAME=$(docker network inspect bridge | jq -r '.[0].IPAM.Config[0].Gateway') - ``` -5. Update the `kafka-docker/docker-compose.yml` so the environment variable `KAFKA_ADVERTISED_HOST_NAME` matches the previous step. For example, the line should look like: - - ```yml - environment: - KAFKA_ADVERTISED_HOST_NAME: 172.17.0.1 - ``` - Which should match the value of `$KAFKA_ADVERTISED_HOST_NAME` from the previous step: - - ```bash - $ echo $KAFKA_ADVERTISED_HOST_NAME - "172.17.0.1" - ``` -6. Launch kafka with 3 instances: - - ```bash - docker-compose up -d --scale kafka=3 - ``` - In practice, 3 instances has been shown to work well. Use as many instances as required. Keep in mind each instance takes about 1 Gb of memory. -7. Create the topic: - - ```bash - ./start-kafka-shell.sh $KAFKA_ADVERTISED_HOST_NAME - $KAFKA_HOME/bin/kafka-topics.sh --create --topic=$MY_INPUT_TOPIC_NAME --bootstrap-server `broker-list.sh` - ``` - Replace `` with the input name of your choice. If you are using `to-kafka`, ensure your output topic is also created. - -8. Generate input messages - 1. In order for Morpheus to read from Kafka, messages need to be published to the cluster. For debugging/testing purposes, the following container can be used: - - ```bash - # Download from https://netq-shared.s3-us-west-2.amazonaws.com/kafka-producer.tar.gz - wget https://netq-shared.s3-us-west-2.amazonaws.com/kafka-producer.tar.gz - # Load container - docker load --input kafka-producer.tar.gz - # Run the producer container - docker run --rm -it -e KAFKA_BROKER_SERVERS=$(broker-list.sh) -e INPUT_FILE_NAME=$MY_INPUT_FILE -e TOPIC_NAME=$MY_INPUT_TOPIC_NAME --mount src="$PWD,target=/app/data/,type=bind" kafka-producer:1 - ``` - In order for this to work, your input file must be accessible from `$PWD`. - 2. You can view the messages with: - - ```bash - ./start-kafka-shell.sh $KAFKA_ADVERTISED_HOST_NAME - $KAFKA_HOME/bin/kafka-console-consumer.sh --topic=$MY_TOPIC --bootstrap-server `broker-list.sh` - ``` - -### Launching Triton Server - -To launch Triton server, use the following command: - -```bash -docker run --rm -ti --gpus=all -p8000:8000 -p8001:8001 -p8002:8002 -v $PWD/models:/models \ - nvcr.io/nvidia/tritonserver:21.12-py3 \ - tritonserver --model-repository=/models/triton-model-repo \ - --exit-on-error=false \ - --model-control-mode=explicit \ - --load-model abp-nvsmi-xgb \ - --load-model sid-minibert-onnx \ - --load-model phishing-bert-onnx -``` -This will launch Triton using port 8001 for the GRPC server. This needs to match the Morpheus configuration. - -## Configuration +To run Morpheus, users will need to choose from the Morpheus Command Line Interface (CLI) or Python interface. Which interface to use depends on the user's needs, amount of customization, and operating environment. More information on each interface can be found below. -The Morpheus pipeline can be configured in two ways: -1. Manual configuration via Python script. -2. Using the provided CLI (i.e., `morpheus`). +### Morpheus Python Interface -### Starting the Pipeline (via Manual Python Config) +The Morpheus python interface allows users to configure their pipelines using a python script file. This is ideal for users who are working in a Jupyter notebook, users who need complex initialization logic or users who have customized stages. Documentation on using the Morpheus python interface can be found at [`docs/source/developer_guide/guides.rst`](./docs/source/developer_guide/guides.rst). -See the `./examples` directory for examples on how to configure a pipeline via Python. +For full example pipelines using the python interface, see the `./examples` directory. -### Starting the Pipeline (via CLI) +### Morpheus Command Line Interface (CLI) -The provided CLI (`morpheus`) is capable of running the included tools as well as any linear pipeline. Instructions for using the CLI can be queried with: +The CLI allows users to completely configure a Morpheus pipeline directly from a terminal. This is ideal for users who do not need customized stages and for users configuring a pipeline in Kubernetes. The Morpheus CLI can be invoked using the `morpheus` command and is capable of running linear pipelines as well as additional tools. Instructions for using the CLI can be queried directly in the terminal using `morpheus --help`: ```bash $ morpheus @@ -226,6 +110,7 @@ Commands: run Run one of the available pipelines tools Run a utility tool ``` + Each command in the CLI has its own help information. Use `morpheus [command] [...sub-command] --help` to get instructions for each command and sub command. For example: ```bash @@ -253,6 +138,8 @@ Options: False] ``` +Several examples on using the Morpheus CLI can be found at [`docs/source/basics/examples.rst`](./docs/source/basics/examples.rst). + #### CLI Stage Configuration When configuring a pipeline via the CLI, you start with the command `morpheus run pipeline` and then list the stages in order from start to finish. The order that the commands are placed in will be the order that data flows from start to end. The output of each stage will be linked to the input of the next. For example, to build a simple pipeline that reads from Kafka, deserializes messages, serializes them, and then writes to a file, use the following: @@ -392,33 +279,5 @@ Commands: ``` Note: The available commands for different types of pipelines are not the same. This means that the same stage, when used in different pipelines, may have different options. Please check the CLI help for the most up-to-date information during development. - -## Pipeline Validation - -To verify that all pipelines are working correctly, validation scripts have been added at `${MORPHEUS_ROOT}/scripts/validation`. There are scripts for each of the main workflows: Anomalous Behavior Profiling (ABP), Humans-as-Machines-Machines-as-Humans (HAMMAH), Phishing Detection (Phishing), and Sensitive Information Detection (SID). - -To run all of the validation workflow scripts, use the following commands: - -```bash -# Install utils for checking output -apt update && apt install -y jq bc - -# Run validation scripts -./scripts/validation/val-run-all.sh -``` - -At the end of each workflow, a section will print the different inference workloads that were run and the validation error percentage for each. For example: - -```bash -===ERRORS=== -PyTorch :3/314 (0.96 %) -Triton(ONNX):Skipped -Triton(TRT) :Skipped -TensorRT :Skipped -Complete! -``` - -This indicates that only 3 out of 314 rows did not match the validation dataset. If you see errors similar to `:/ ( %)` or very high percentages, then the workflow did not complete sucessfully. - ## Contributing Please see our [guide for contributing to Morpheus](./CONTRIBUTING.md). diff --git a/docs/source/basics/overview.rst b/docs/source/basics/overview.rst index 285918d8e1..2b37501030 100644 --- a/docs/source/basics/overview.rst +++ b/docs/source/basics/overview.rst @@ -74,6 +74,7 @@ installed. Morpheus comes with a tool to assist with this: $ morpheus tools autocomplete install bash completion installed in ~/.bash_completion + $ source ~/.bash_completion After autocomplete has been installed, ``[TAB]`` can be used to show all commands, options and arguments when building pipelines via the CLI: diff --git a/docs/source/developer_guide/guides/1_simple_python_stage.md b/docs/source/developer_guide/guides/1_simple_python_stage.md index 0eadb0f9dd..92e3385278 100644 --- a/docs/source/developer_guide/guides/1_simple_python_stage.md +++ b/docs/source/developer_guide/guides/1_simple_python_stage.md @@ -162,7 +162,7 @@ The output should look like this: ====Registering Pipeline Complete!==== ====Starting Pipeline==== ====Building Pipeline==== -Added source: +Added source: └─> morpheus.MessageMeta Added stage: └─ morpheus.MessageMeta -> morpheus.MessageMeta @@ -194,7 +194,7 @@ def run_pipeline(): configure_logging(log_level=logging.DEBUG) root_dir = os.environ['MORPHEUS_ROOT'] - input_file = os.path.join(root_dir, 'examples/data/email.jsonlines') + input_file = os.path.join(root_dir, 'examples/data/email_with_addresses.jsonlines') config = Config() diff --git a/docs/source/developer_guide/guides/2_real_world_phishing.md b/docs/source/developer_guide/guides/2_real_world_phishing.md index 194e5a6c23..06ddbe9fcd 100644 --- a/docs/source/developer_guide/guides/2_real_world_phishing.md +++ b/docs/source/developer_guide/guides/2_real_world_phishing.md @@ -176,6 +176,10 @@ Let's ask Triton for some information about the `phishing-bert-onnx` model which ```shell curl "localhost:8000/v2/models/phishing-bert-onnx/config" +``` + +Output: +``` {"name":"phishing-bert-onnx","versions":["1"],"platform":"onnxruntime_onnx","inputs":[{"name":"input_ids","datatype":"INT64","shape":[-1,128]},{"name":"attention_mask","datatype":"INT64","shape":[-1,128]}],"outputs":[{"name":"output","datatype":"FP32","shape":[-1,2]}]} ``` @@ -185,6 +189,8 @@ From this information, we can see that the expected shape of the model inputs is Let's set up the paths for our input and output files. For simplicity, we assume that the `MORPHEUS_ROOT` environment variable is set to the root of the Morpheus project repository. In a production deployment, it may be more prudent to replace our usage of environment variables with command-line flags or a dedicated configuration management library. ```python +import os + import morpheus root_dir = os.environ['MORPHEUS_ROOT'] @@ -203,14 +209,14 @@ To start, we will need to instantiate and set a few members of the `Config` clas config = Config() config.mode = PipelineModes.NLP -config.num_threads = psutil.cpu_count() +config.num_threads = os.cpu_count() config.feature_length = 128 with open(labels_file) as fh: config.class_labels = [x.strip() for x in fh] ``` -First we set our pipeline mode to NLP. Next, we use the third-party [psutils](https://psutil.readthedocs.io/en/stable/) library to set the `num_threads` property to match the number of cores in our system. +First we set our pipeline mode to NLP. Next, we set the `num_threads` property to match the number of cores in our system. The `feature_length` property needs to match the length of the model inputs, which we got from Triton in the previous section using the model's `/config` endpoint. @@ -284,8 +290,6 @@ To explicitly set the output format we could specify the `file_type` argument to import logging import os -import psutil - import morpheus from morpheus.config import Config from morpheus.config import PipelineModes @@ -300,7 +304,7 @@ from morpheus.stages.preprocess.deserialize_stage import DeserializeStage from morpheus.stages.preprocess.preprocess_nlp_stage import PreprocessNLPStage from morpheus.utils.logging import configure_logging -from recipient_feature_stage import RecipientFeaturesStage +from recipient_features_stage import RecipientFeaturesStage def run_pipeline(): # Enable the default logger @@ -321,7 +325,7 @@ def run_pipeline(): config.mode = PipelineModes.NLP # Set the thread count to match our cpu count - config.num_threads = psutil.cpu_count() + config.num_threads = os.cpu_count() config.feature_length = 128 with open(labels_file) as fh: diff --git a/docs/source/developer_guide/guides/3_simple_cpp_stage.md b/docs/source/developer_guide/guides/3_simple_cpp_stage.md index 2bca67a363..5d51483ea7 100644 --- a/docs/source/developer_guide/guides/3_simple_cpp_stage.md +++ b/docs/source/developer_guide/guides/3_simple_cpp_stage.md @@ -28,9 +28,9 @@ CppConfig.set_should_use_cpp(False) If a stage does not have a C++ implementation, Morpheus will fall back to the Python implementation without any additional configuration and operate in a hybrid execution mode. -In addition to C++ accelerated stage implementations, Morpheus also provides a C++ implementation for message primitives. When C++ execution is enabled, constructing one of the Python message classes defined in the `morpheus.pipeline.messages` module will return a Python object with bindings to the underlying C++ implementation. +In addition to C++ accelerated stage implementations, Morpheus also provides a C++ implementation for message primitives. When C++ execution is enabled, constructing one of the Python message classes defined under `morpheus.messages` will return a Python object with bindings to the underlying C++ implementation. -Since we are defining our pipelines in Python, it becomes the responsibility of the Python implementation to build a C++ accelerated node. This happens in the `_build_source` and `_build_single` methods. Ultimately it is the decision of a Python stage to build a Python node or a C++ node. It is perfectly acceptable to build a Python node when `morpheus.config.CppConfig.get_should_use_cpp()` is configured to `True`. It is not acceptable, however, to build a C++ node when `morpheus.config.CppConfig.get_should_use_cpp() == False`. The reason is the C++ implementations of Morpheus' messages can be consumed by Python and C++ stage implementations alike. However when `morpheus.config.CppConfig.get_should_use_cpp() == False`, the Python implementations will be used which cannot be consumed by the C++ implementations of stages. +Since we are defining our pipelines in Python, it becomes the responsibility of the Python implementation to build a C++ accelerated node. This happens in the `_build_source` and `_build_single` methods. Ultimately it is the decision of a Python stage to build a Python node or a C++ node. It is perfectly acceptable to build a Python node when `morpheus.config.CppConfig.get_should_use_cpp()` is configured to `True`. It is not acceptable, however, to build a C++ node when `morpheus.config.CppConfig.get_should_use_cpp() == False`. The reason is the C++ implementations of Morpheus' messages can be consumed by Python and C++ stage implementations alike. However when `morpheus.config.CppConfig.get_should_use_cpp() == False`, the Python implementations of each message type will be used which cannot be consumed by the C++ implementations of stages. Python stages which have a C++ implementation must advertise this functionality by overriding the `supports_cpp_node` method: diff --git a/docs/source/developer_guide/guides/4_source_cpp_stage.md b/docs/source/developer_guide/guides/4_source_cpp_stage.md index 7a2f55178f..aca1d0cafc 100644 --- a/docs/source/developer_guide/guides/4_source_cpp_stage.md +++ b/docs/source/developer_guide/guides/4_source_cpp_stage.md @@ -482,6 +482,11 @@ PYBIND11_MODULE(morpheus_rabbit, m) ## Python Changes +As in the previous example we need to add an import of the `CppConfig` object. +```python +from morpheus.config import CppConfig +``` + Previously, our stage connected to the RabbitMQ server in the constructor. This is no longer advantageous to us when C++ execution is enabled. Instead, we will record our constructor arguments and move the connection code to a new `connect` method. Our new constructor and `connect` methods are updated to: ```python @@ -526,7 +531,7 @@ def connect(self): ``` -Lastly, our `_build_source` method needs to be updated to build a C++ node when `morpheus.config.CppConfig` is configured to `True` by using the `self._build_cpp_node()` method. +Lastly, our `_build_source` method needs to be updated to build a C++ node when `morpheus.config.CppConfig.get_should_use_cpp()` is configured to `True` by using the `self._build_cpp_node()` method. ```python def _build_source(self, builder: srf.Builder) -> StreamPair: diff --git a/docs/source/extra_info/troubleshooting.md b/docs/source/extra_info/troubleshooting.md index bf142f5baf..e29d6330c6 100644 --- a/docs/source/extra_info/troubleshooting.md +++ b/docs/source/extra_info/troubleshooting.md @@ -31,7 +31,7 @@ rm -rf ${MORPHEUS_ROOT}/build ``` **Debugging Python Code** -To debug issues in python code, several launch Visual Studio Code launch configurations have been included in the repo. These launch configurations can be found in `${MORPHEUS_ROOT}/morpheus.code-workspace`. To launch the debugging environment, ensure that Visual Studio Code has opened the morpheus workspace file (File->Open Workspace from File...). Once the workspace has been loaded, the launch configurations should be available in the debugging tab. +To debug issues in python code, several Visual Studio Code launch configurations have been included in the repo. These launch configurations can be found in `${MORPHEUS_ROOT}/morpheus.code-workspace`. To launch the debugging environment, ensure that Visual Studio Code has opened the morpheus workspace file (File->Open Workspace from File...). Once the workspace has been loaded, the launch configurations should be available in the debugging tab. **Debugging C++ Code** diff --git a/docs/source/index.rst b/docs/source/index.rst index 030678af20..cbf14e51e1 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -41,7 +41,7 @@ Features * Real-Time Telemetry * Morpheus can receive rich, real-time network telemetry from every NVIDIA® BlueField® DPU-accelerated server in the data center without impacting performance. Integrating the framework into a third-party cybersecurity offering - brings the world’s best AI computing to communication networks. + brings the world's best AI computing to communication networks. * DPU-Connected * The NVIDIA BlueField Data Processing Unit (DPU) can be used as a telemetry agent for receiving critical data center communications into Morpheus. As an optional addition to Morpheus, BlueField DPU also extends static @@ -58,7 +58,7 @@ The best way to get started with Morpheus will vary depending on the goal of the Using NGC Container ^^^^^^^^^^^^^^^^^^^ -Accessing Morpheus by pulling the pre-built NGC container is best suited for users who do not need any customization and +Accessing Morpheus by pulling the pre-built `NGC container `_ is best suited for users who do not need any customization and are only interested in running Morpheus via the CLI. The pre-built container does not require checking out the source code and is best suited for users who are new to Morpheus and don't require any customization. @@ -77,7 +77,7 @@ Launch an interactive container to start using Morpheus: .. code-block:: console - $ ./docker/run_container_release.sh + $ docker run --rm -ti --net=host --gpus=all nvcr.io/nvidia/morpheus/morpheus:22.06-runtime bash (morpheus) root@958a683a8a26:/workspace# morpheus --help Usage: morpheus [OPTIONS] COMMAND [ARGS]...Options: --debug / --no-debug [default: False] @@ -100,112 +100,6 @@ Launch an interactive container to start using Morpheus: See :doc:`basics/overview` for more information on using the CLI. -Building Local Image -^^^^^^^^^^^^^^^^^^^^ - -Building the image locally is best suited for users who prefer working within a -Docker container, want to avoid installing many dependencies or have a moderate -amount of customization. This method requires pulling the source code and -manually building the container and does not require the user to setup a Conda -environment and install dependencies. Users can use either the CLI or Python -interface. - -Prerequisites -""""""""""""" - * `Docker `__ - * `The NVIDIA container toolkit `__ - -To get started, first clone the Morpheus repo: - -.. code-block:: bash - - # Make sure to recurse the submodules - git clone https://github.com/NVIDIA/Morpheus.git - # Change directory to the repo root - cd morpheus - -.. note:: - - Cloning the repo may take a while to download large data objects and models. - -To build the container: - -.. code-block:: bash - - ./docker/build_container_dev.sh - -To run the development container: - -.. code-block:: bash - - ./docker/run_container_dev.sh - -From this point, follow the previous getting started section for running the CLI. - -.. _outside-of-a-container: - -Outside of a Container -^^^^^^^^^^^^^^^^^^^^^^ - -.. warning:: - - This is not the preferred way to use Morpheus. Morpheus requires a large - amount of dependencies and this method should only be used by advanced and - experienced users only. - -Running Morpheus outside of a container requires the most setup, but offers the -most flexibility and customization. Users of this method will need the source -code and will be required to install several dependencies in a Conda virtual -environment. - -Prerequisites -""""""""""""" - * `Conda `__ - * `Mamba `__ - * Once ``conda`` is installed, ``mamba`` can be instaled with ``conda install -n base -c conda-forge mamba`` (Make sure to only install into the base environment) - * `CUDA `__ - * While CUDA can be installed with Conda, it requires installing the matching CUDA SDK outside of the Conda environment. - -To get started, first clone the Morpheus repo: - -.. code-block:: bash - - # Make sure to recurse the submodules - git clone https://github.com/NVIDIA/Morpheus.git - # Change directory to the repo root - cd morpheus - -.. note:: - - Cloning the repo may take a while to download large data objects and models. - -Next, create a Conda environment and install the necessary dependencies. - -.. code-block:: bash - - conda create -n morpheus -c conda-forge python=${PYTHON_VER} - conda activate morpheus - conda install -c conda-forge python=${PYTHON_VER} - - # Build and install the cuDF conda package - ./docker/build_conda_packages.sh libcudf cudf - mamba install -c file:///${MORPHEUS_ROOT}/.conda-bld -c nvidia -c rapidsai -c conda-forge libcudf cudf - - # Install the remaining Morpheus dependencies - mamba env update -n morpheus -f ./docker/conda/environments/cuda${CUDA_VER}_dev.yml - -Where ``$PYTHON_VER``, ``$CUDA_VER``, and ``$RAPIDS_VER`` represent the desired Python version, CUDA version and, RAPIDS -version, respectively. Finally, build Morpheus: - -.. code-block:: bash - - ./scripts/compile.sh - - pip install . - # Or for a debug/editable installation - pip install -e . - -See :doc:`basics/overview` for more information on using the CLI. .. toctree:: :maxdepth: 20 diff --git a/docs/source/morpheus_quickstart_guide.md b/docs/source/morpheus_quickstart_guide.md index 8d7e641a75..dbe891dc4c 100644 --- a/docs/source/morpheus_quickstart_guide.md +++ b/docs/source/morpheus_quickstart_guide.md @@ -1,3 +1,20 @@ + + # Morpheus Quickstart Guide ## Table of Contents @@ -13,8 +30,8 @@ - [Install Morpheus AI Engine](#install-morpheus-ai-engine) - [Install Morpheus SDK Client](#install-morpheus-sdk-client) - [Morpheus SDK Client in Sleep Mode](#morpheus-sdk-client-in-sleep-mode) - - [Models for MLFlow Plugin Deployment](#models-for-mlflow-plugin-deployment) - - [Install Morpheus MLFlow Triton Plugin](#install-morpheus-mlflow-triton-plugin) + - [Models for MLflow Plugin Deployment](#models-for-mlflow-plugin-deployment) + - [Install Morpheus MLflow Triton Plugin](#install-morpheus-mlflow-triton-plugin) - [Model Deployment](#model-deployment) - [Verify Model Deployment](#verify-model-deployment) - [Create Kafka Topics](#create-kafka-topics) @@ -71,8 +88,8 @@ This quick start guide provides the necessary instructions to set up the minimum - Set up of the NVIDIA Cloud Native Core Stack - Set up Morpheus AI Engine - Set up Morpheus SDK Client -- Models for MLFlow Triton Plugin Deployments -- Set up Morpheus MLFlow Triton Plugin +- Models for MLflow Triton Plugin Deployments +- Set up Morpheus MLflow Triton Plugin - Deploy models to Triton inference server - Create Kafka topics - Run example workloads @@ -85,7 +102,7 @@ Morpheus makes it easy to build and scale cybersecurity applications that harnes NVIDIA Morpheus enables organizations to attack the issue of cybersecurity head on. Rather than continuously chasing the cybersecurity problem, Morpheus provides the ability to propel you ahead of the breach and address the cybersecurity issue. With the world in a "discover and respond" state, where companies are finding breaches much too late, in a way that is way behind the curve, NVIDIA’s Morpheus cybersecurity AI framework enables any organization to warp to the present and begin to defend itself in real time. -The Morpheus Developer Kit allows developers to quickly and easily set up example pipelines to run inference on different sample models provided from NVIDIA and experiment with the features and capabilities available within the Morpheus framework to address their cybersecurity and information security use cases. +The Morpheus Developer Kit allows developers to quickly and easily set up example pipelines to run inference on different sample models provided by NVIDIA and experiment with the features and capabilities available within the Morpheus framework to address their cybersecurity and information security use cases. ### Features @@ -107,7 +124,7 @@ The Morpheus Developer Kit allows developers to quickly and easily set up exampl - **AI Cybersecurity Capabilities** - Deploy your own models using common deep learning frameworks. Or get a jump-start in building applications to identify leaked sensitive information, detect malware or fraud, do network mapping, flag user behavior changes, or and identify errors via logs by using one of NVIDIA’s pre-trained and tested models. + Deploy your own models using common deep learning frameworks. Or get a jump-start in building applications to identify leaked sensitive information, detect malware or fraud, do network mapping, flag user behavior changes, and identify errors via logs by using one of NVIDIA’s pre-trained and tested models. ## Setup @@ -115,7 +132,7 @@ The Morpheus Developer Kit allows developers to quickly and easily set up exampl 1. Refer to [Appendix A](#appendix-a) for Cloud (AWS) or On-Prem (Ubuntu) 2. Registration in the NGC Public Catalog -Continue with the setup steps below once the host system is installed and configured and satisfies all prerequisites. +Continue with the setup steps below once the host system is installed, configured, and satisfies all prerequisites. ### Set up NGC API Key and Install NGC Registry CLI @@ -134,8 +151,8 @@ Next, install and configure the NGC Registry CLI on your system using the linked Next, create a namespace and an environment variable for the namespace to organize the Kubernetes cluster deployed via the Cloud Native Core Stack and logically separate Morpheus related deployments from other projects using the following command: ```bash -$ kubectl create namespace $ export NAMESPACE="" +$ kubectl create namespace ${NAMESPACE} ``` ### Install Morpheus AI Engine @@ -157,7 +174,7 @@ $ helm install --set ngc.apiKey="$API_KEY" \ morpheus-ai-engine ``` -After the installation, You can verify that the Kubernetes pods are running successfully using the following command: +After the installation, you can verify that the Kubernetes pods are running successfully using the following command: ```bash $ kubectl -n $NAMESPACE get all @@ -193,16 +210,6 @@ Run the following command to pull the Morpheus SDK Client chart on to your insta $ helm fetch https://helm.ngc.nvidia.com/nvidia/morpheus/charts/morpheus-sdk-client-22.06.tgz --username='$oauthtoken' --password=$API_KEY --untar ``` -**Note**: For reference, the Morpheus SDK Client install pipeline command template is provided. Let's take a closer look at this when running [example workflows](#example-workflows), but for now, let's proceed to the next step. - -```bash -$ helm install --set ngc.apiKey="$API_KEY" \ - --set sdk.args="" \ - --namespace $NAMESPACE \ - \ - morpheus-sdk-client -``` - #### Morpheus SDK Client in Sleep Mode Install the Morpheus SDK client pod in sleep mode to copy its sample datasets and models from the container to a shared location that other pods can access. If no `sdk.args` is supplied, the default value `/bin/sleep infinity` from the chart is used in the following command. @@ -225,18 +232,17 @@ Output: pod/sdk-cli-helper 1/1 Running 0 41s ``` -### Models for MLFlow Plugin Deployment +### Models for MLflow Plugin Deployment -Connect to the **sdk-cli-helper** and copy models to `/common`, which is mapped to `/opt/morpheus/common` on the host and where MLFlow will have access to model files. +Connect to the **sdk-cli-helper** container and copy the models to `/common`, which is mapped to `/opt/morpheus/common` on the host and where MLflow will have access to model files. ```bash $ kubectl -n $NAMESPACE exec sdk-cli-helper -- cp -RL /workspace/models /common ``` -### Install Morpheus MLFlow Triton Plugin +### Install Morpheus MLflow Triton Plugin -The Morpheus MLFlow Triton Plugin is used to deploy, update, and remove models from the Morpheus AI Engine. MLFlow server UI can be accessed using NodePort 30500 -Follow the below steps to install Morpheus MlFLow Triton Plugin: +The Morpheus MLflow Triton Plugin is used to deploy, update, and remove models from the Morpheus AI Engine. The MLflow server UI can be accessed using NodePort 30500. Follow the below steps to install the Morpheus MLflow Triton Plugin: ```bash $ helm fetch https://helm.ngc.nvidia.com/nvidia/morpheus/charts/morpheus-mlflow-22.06.tgz --username='$oauthtoken' --password=$API_KEY --untar @@ -254,7 +260,7 @@ $ helm install --set ngc.apiKey="$API_KEY" \ Error: Service "mlflow" is invalid: spec.ports[0].nodePort: Invalid value: 30500: provided port is already allocated ``` -After the installation, you can verify that the MLFlow pod is running successfully using the following command: +After the installation, you can verify that the MLflow pod is running successfully using the following command: ```bash $ kubectl -n $NAMESPACE get all | grep pod/mlflow @@ -266,7 +272,7 @@ pod/mlflow-6d98 1/1 Running 0 39s ``` ### Model Deployment -Attach to the MLFLow pod to publish models to MLFlow server and then deploy it onto Morpheus AI Engine: +Attach to the MLfLow pod to publish models to the MLflow server and then deploy it onto Morpheus AI Engine: ```bash $ kubectl -n $NAMESPACE exec -it deploy/mlflow -- bash @@ -278,8 +284,8 @@ $ kubectl -n $NAMESPACE exec -it deploy/mlflow -- bash `Important`: When (mlflow) is present, commands are directly within the container. -Let's have a look at how to use the MLFlow Triton plugin before we start deploying models. -Publish models to MLFlow server: +First let's have a look at the syntax of the commands we will be using to communicate with the MLflow Triton plugin before we start deploying models. +Publish models to MLflow server looks like: ```bash (mlflow) root@mlflow-6d98:/mlflow# python publish_model_to_mlflow.py \ @@ -314,7 +320,7 @@ Delete deployed models from Morpheus AI Engine: --name / ``` -Now that we've figured out how to deploy models let's move on to the next step. Now it's time to deploy the relevant models, which have already been copied to `/opt/morpheus/common/models` which are bound to `/common/models` within the MLFlow pod. +Now that we've figured out how to deploy models let's move on to the next step. Now it's time to deploy the relevant models, which have already been copied to `/opt/morpheus/common/models` which are bound to `/common/models` within the MLflow pod. ```bash (mlflow) root@mlflow-6d98:/mlflow# ls -lrt /common/models @@ -469,6 +475,17 @@ Refer to the Using Morpheus SDK Client to Run Pipelines section of the Appendix - Replace **** with the name you want. +For reference, the Morpheus SDK Client install pipeline command template is provided. Let's take a closer look at this when running [example workflows](#example-workflows), but for now, let's proceed to the next step. + +```bash +$ helm install --set ngc.apiKey="$API_KEY" \ + --set sdk.args="" \ + --namespace $NAMESPACE \ + \ + morpheus-sdk-client +``` + + ### Run AutoEncoder Digital Fingerprinting Pipeline The following AutoEncoder pipeline example shows how to train and validate the AutoEncoder model and write the inference results to a specified location. Digital fingerprinting has also been referred to as **HAMMAH (Human as Machine <> Machine as Human)**. These use cases are currently implemented to detect user behavior changes that indicate a change from a human to a machine or a machine to a human. The model is an ensemble of an autoencoder and fast fourier transform reconstruction. @@ -652,7 +669,7 @@ $ helm install --set ngc.apiKey="$API_KEY" \ When the pipeline runs successfully, an output file *sid-minibert-onnx-output.jsonlines* will appear in the output directory. -Pipeline example to read messages from an input Kafka topic, run inference using a *sid-minibert-onnx* model, and write the results of the inference to an output Kafka topic: +Pipeline example to read messages from an input Kafka topic, run inference using a *sid-minibert-onnx* model, and write the results of the inference to an output Kafka topic: ```bash $ helm install --set ngc.apiKey="$API_KEY" \ @@ -1104,7 +1121,7 @@ This section lists solutions to problems you might encounter with Morpheus or fr #### Common Problems - Models Unloaded After Reboot - - When the pod is restarted, K8s will not automatically load the models. Since models are deployed to *ai-engine* in explicit mode using MLFlow, we'd have to manually deploy them again using the [Model Deployment](#model-deployment) process. + - When the pod is restarted, K8s will not automatically load the models. Since models are deployed to *ai-engine* in explicit mode using MLflow, we'd have to manually deploy them again using the [Model Deployment](#model-deployment) process. - AI Engine CPU Only Mode - After a server restart, the ai-engine pod on k8s can start up before the gpu operator infrastructure is available, making it "think" there is no driver installed (i.e., CPU -only mode). - Improve Pipeline Message Processing Rate diff --git a/examples/abp_nvsmi_detection/README.md b/examples/abp_nvsmi_detection/README.md index 9c590d867e..06277587e8 100644 --- a/examples/abp_nvsmi_detection/README.md +++ b/examples/abp_nvsmi_detection/README.md @@ -46,7 +46,7 @@ $ nvidia-smi dmon Each line in the output represents the GPU metrics at a single point in time. As the tool progresses the GPU begins to be utilized and you can see the SM% and Mem% increase as memory is loaded into the GPU and computations are performed. The model we will be using can ingest this information and determine whether or not the GPU is mining cryptocurriences without needing additional information from the host machine. -In this example we will be using the `examples/data/nvsmi.jsonlines` dataset that is known to contain mining behavior profiles. The dataset is in the `.jsonlines` format which means each new line represents an new JSON object. In order to parse this data, it must be ingested, split by lines into individual JSON objects, and parsed into cuDF dataframes. This will all be handled by Morpheus. +In this example we will be using the `examples/data/nvsmi.jsonlines` dataset that is known to contain mining behavior profiles. The dataset is in the `.jsonlines` format which means each new line represents a new JSON object. In order to parse this data, it must be ingested, split by lines into individual JSON objects, and parsed into cuDF dataframes. This will all be handled by Morpheus. ## Pipeline Architecture @@ -93,8 +93,9 @@ With the Morpheus CLI, an entire pipeline can be configured and run without writ The following command line is the entire command to build and launch the pipeline. Each new line represents a new stage. The comment above each stage gives information about why the stage was added and configured this way (you can copy/paste the entire command with comments). +From the Morpheus repo root directory run: ```bash -export MORPHEUS_ROOT=../.. +export MORPHEUS_ROOT=$(pwd) # Launch Morpheus printing debug messages morpheus --log_level=DEBUG \ `# Run a pipeline with 8 threads and a model batch size of 32 (Must be equal or less than Triton config)` \ @@ -102,13 +103,13 @@ morpheus --log_level=DEBUG \ `# Specify a NLP pipeline with 256 sequence length (Must match Triton config)` \ pipeline-fil \ `# 1st Stage: Read from file` \ - from-file --filename=$MORPHEUS_ROOT/examples/data/nvsmi.jsonlines \ + from-file --filename=examples/data/nvsmi.jsonlines \ `# 2nd Stage: Deserialize from JSON strings to objects` \ deserialize \ `# 3rd Stage: Preprocessing converts the input data into BERT tokens` \ preprocess \ `# 4th Stage: Send messages to Triton for inference. Specify the model loaded in Setup` \ - inf-triton --model_name=abp-nvsmi-xgb --server_url=localhost:8001 \ + inf-triton --model_name=abp-nvsmi-xgb --server_url=localhost:8000 \ `# 5th Stage: Monitor stage prints throughput information to the console` \ monitor --description "Inference Rate" --smoothing=0.001 --unit inf \ `# 6th Stage: Add results from inference to the messages` \ @@ -177,14 +178,15 @@ CPP Enabled: True ====Registering Pipeline==== ====Registering Pipeline Complete!==== ====Starting Pipeline==== +====Pipeline Started==== ====Building Pipeline==== -Added source: +Added source: └─> morpheus.MessageMeta Added stage: └─ morpheus.MessageMeta -> morpheus.MultiMessage Added stage: └─ morpheus.MultiMessage -> morpheus.MultiInferenceFILMessage -Added stage: +Added stage: └─ morpheus.MultiInferenceFILMessage -> morpheus.MultiResponseProbsMessage Added stage: └─ morpheus.MultiResponseProbsMessage -> morpheus.MultiResponseProbsMessage @@ -195,9 +197,8 @@ Added stage: └─ morpheus.MessageMeta -> morpheus.MessageMeta ====Building Pipeline Complete!==== -Starting! Time: 1650991285.1247575 -====Pipeline Started==== -Inference Rate[Complete]: 1242inf [00:00, 6823.28inf/s] +Starting! Time: 1656353254.9919598 +Inference Rate[Complete]: 1242inf [00:00, 1863.04inf/s] ====Pipeline Complete==== ``` diff --git a/examples/abp_nvsmi_detection/pipeline.png b/examples/abp_nvsmi_detection/pipeline.png index f612fd6d597b9eb302b62ad99e31df431544ca60..4a19fe83b3325322dea6ea4852616808a80534e5 100644 GIT binary patch literal 15682 zcmeHuc{r7A+pnevDTzvDN`=alc?zWvVug_TDRVL}WLPvPnTJA#MTnI-Gs{$xc@{D* znP-{DwbnlGp67kP_xrxRk7MsY_uj8M%DCM3b)DDm{0-;rcUMjE=;5=6DJUq8D&4-N zK|yi+BfK9*wIBX1zUUnU|NZe$Me!B|8Ts?R0{4c3;v9w2tsD2A#4QZDd1_5OlO5UQ z45gE!k~>a!x5Ix(_=;xTAxeX=D@mUB3vNfHsj$pFPm#r1*KYa$XI%x&%R2jj+v2jgO|wHc2O=9f=N`)+y+ zZw`tnrF6}}HT}n1=tVQE;eUJx?>()(jd(#m(}rLgPbV45b*#pUwT{bgj*E>1PJr!VFGt}?C*Yk2Ve zffS9jR=)iw0-N_=qB41fJ~$Rh;rFmPdTXt4AH946_W7H23cvGnR$|e#hT#U&+MKBP zz0U`Zplo5%KDywTDB=Dg_{>Wldl%IXfaM*`j)AOCZZ{(Y>_ zqyZkT0562uSiIhI0Bw<1$sIOxoir{tb*0~RI4O7SmeODi?!nhr+w!q2yfGd+KJFWb z_D}cww+EicsyOf6m8vSWGo2h@pNkGml)9wnasDBmEBeq~e}5tK`vrmTIcjF^)dX$3P_%;vgqD3?C-w)mmcmZ?^($BzfTT3TB2vE-k}ye$>ageR-p2s=+< zT}2If(+jk%I~n#r{a~xu7t@kzRN>CzKAl)R>~1ZIwXKs;(d#;VnVXwQ+ds@W1 znM-2h#T_16Fn-9D!R&nKnn_WKQjj(BSSW1CE`og+ur1^Dxr*6YLrW5a>^zg7$j@IL z+8%ty_uhlEDN{GUa|Uf_Xc!m4boMN*uDwMtC9)$GaA-|V-}DclV*aTHDuQm73)(>4D{J*80ZO*|dNMdu7X z)mgM;g-KnoMFOVCj!8nWdN}34C9Q9FBF$q5;bJV>;-x({&=0>*T%z`C$=q-oc}Ceevt|}$*n>kQ z95{CE7rY|rJ5EL`RNB=BZi7DKVmLl2Y4p=q+T8|}mxi{ss6}gB5R=%c^xGWiMMWE# z`K|bw)L56rLAULRC|4H;(w)%*CxQ<0%hNMI-7>{o4qvAb?#41bATYl=D7Z{*X{f8) zr=??fQqFRR@{E{G|C$|n!_IKaH36x(X>sf@zUTY*a?;LR$hDQ*oltX~Xm{a)x4H|f z8v}N}bblN(|elua5K;TK5L0)wMtO50~EnK6xWQ9ZI`U2HFV@uvk$g$e%bdr&F8FzZh~shf%e<3wmxO6r8fnmw{C5&{Q7zfM{0|; ztCX~WN=63>P#7%`jWvZsdlnFAkM?lSvGmcecLqdmW$3 zu#1R@Fy8I&g({RKcFCHZ5)~HS8=;il^7Y>GH5Y48@7God-|aFib7{d!ZH~V|v0i&( zucg(^?#t}B+9D>l!_eIn$t$(mEM#qM?XkIt84puzO^_vjc%$Zj<>D$$l~dHG7p<6$ z`M$J!kLG%^0#5PzH+Cf}hHOn8x)@}7SuL-I=gtLQk$elELAW^3eyc7V>Ec)F*-oM~nD8j8d2b6FzRJ!=aCn{N{KOyk^}47t?9Mhz<8 z6)OgRvR&^i;J+L1xza#a%_Y0t(BI#$%_iX(CtqaN6p3}|w^H8|N%wyz_O6DqU-`L; zJvHAK4so5PeyDtA+qIKv@rNm&c!VfWDc85+SLARChhBsWUE|>9@N!?CV4;BYY z<;CyntHy~7_*}K>{D2@vV&czuk40+sKsH&g(HcLMD88(moT`PQ0XZrmi`M4HdFCxK z$1f-xIV)^AT<#VtW@l9Cx&1-ujYisc7T3WJ%VLw-K(|ppt|Hr^o%#H>$f&3s{bD|> zT5or^mW~b^X04;`+UlK~H@}8+sL)EUwfp<~b0v7@bxbmFsRj19?Jd{sZY=E1pu8pX zt7p42HV5pgZoK$|_x`8%m6fDp-dkVa37Ej4S#K6`TkM;z#m8I z_nyG<@9ybAK08okqhIE-0B9~pg}SzUD|l89kG67lc9z5r7ugKFzwx56vC+tFB4Rq( zn>6JeFX{Y966-aahLfX$UKV29KgiKQoGEu(m7^kTx4Mej4wl#s;q`4xQ!+Cj_hjlu zC+8TH<{4Lc-Snl!%;(l6B`2Uel@3tSX2RDsF)r<;Vjd}@aXOC8SgB%h>hp}sw;lTT zl7>8NICT9(c^nQibT_vr-gL5yFqCEU{Bh29^Y9dZ zdQd7~*?iu-lU-3~jNy;hTs{}CMs{OLdcyH4oa?@9UM1+6PLmMnB7kw&?}p4si~Ao; z3@W#fx@$EI+;Enk95?oC>zG=wQ?cy}@(E1efB2sJS|4rhimqGRh277qo-f+?B+V_NHXnP{bZ6u61;yaN?X7S% zoL$M!S9H~-Q}MBCxMJHONz3;4jK-bGeudoXh9C2 zUn4J$nQK2;s@QbjT*MN$=y5Vq(}P{SvX$d9IpfowrVt!m zK=M}cu|NWG(N)ztZzkyM6i-t6{qiRcDq0)DBz5cX+>s;_o+OY^K&NQzc<(Yl^t#Iz3O18P4tYnlQ=IU{d=j96fSN(`ujHw z!xgyP?>^Zaaurfhli41ps|L;_q@obQYN)CCW;?g2NYv*O;M+VA+Svskd-z6+B^Tn( zx@ySjmI2!W`vlAeHG8H}g`~%7^H*d?`+F--$-Nd7ymC`lS2y{h)adIAa#VIzM3*&_ zj1YcCL$o^8&%M<)csrhO|vov)=EPhZ``}nwV=7uu~eZ{9S zhcIWw%L6;jF{*$D)}^6UpchSF)pf>+&v~aGj-AS{RNv5%ux#vz6|uzj=3l)amQ}7t z(G-(dzcU&-BRC}Hi*XW1IVN^FPvx%VQ4DDjDltN2K5lMqe*UGQGFNjYH@9tIg-PB^ zKXOd~Vk+F%{pAEq+TY(`_W>eh&Yzi`ZM$I)+hSc{3MEd~im`Hqgcxj7G@ zQovW|H5Lkcjcl$wsKa`wI3_TLdWNTrg{N%coyPYKJ!_s-j_$tgBBFioo)0;r*1Ryy zmdTJHYBQjbricI1@9s?f=~9>G3>v~9F7m*SO=h9f)Ar|EA9y!!Sdef$=pd%x03Wdg|Wph&*5dx`lfYgI;=^=_-K)T6A| zN)$s_)%yfXMF58_8$Lbwx+2?7!(VRSZ-rY2CYG8y2^2%Gz*3#GJD-_+(ZI~i%*JM6 zV_^W+B|oZacd?A!=gSMqy1oV=b|7vx!l%D*xWD$(eB}jOINf0al1&wNmDPK18P27$ zmUVNra7G_z@!dmn>0vro3b;}(krz7=4mw~{jJ2<(Chl(Lq^E;~dy$GtAdLp_yWFxG zGPz++OsO%~E}LLrIOO*(()QDS)})bZ>=%v0^_OabElw#*VvPzcI{;0uIgZx@O{jq4 zhF>hZ(-G3iB9s?4Zfz(WE~y{>2CtK2gs=l(s)&B!ZIIq6LM?S{+IiFH5A+Pa%>q*~0i27LlF)^8}hDF5z&Bdm+aLX3QE2%GWiH(N9uuGEg) z-F_%wz>-sOPHLcGfye`qu*OPBhAsq&4U2;@VGMs@(%2G1he+Kkm^O(=w+celqe(RIpD#`8h>CZ3Eo5NY8 zT&|I}#z3!*)dmIR`z{O=^XukaTperTuPO(E2MmM#=BpZ>ufQ###dm+~DE;}0X=BKh z0IXkLmiCO`IM#Kz!4nT(1nYp?g9w$(t6#+9(+*u2gy8m1UpBQAjlQYwbf7BS*(FH; zMw|Q(tqKcDRl>)*0Au*!!~lZ=AvXhhC3))UF`2D%yVup{$kWLo<~rZ}PjdJF?qYOu zOT!gH$6_dfr-2q`ohnyW#|d8m3GX6_m07M~kXpO6EFvt-jBdYyOYm}UUXMK*P_*~~ zW8_U-7lO{ZL?$gIFX}3W@|+3hxL`ha7I(GfQUCa=dEis9k$(B|m;b8%sGf|Ryz0mv=}7i`LHbzT?RqZG!}J0jM>py(gqZSQ z+xztuG`Q}^n+2#4R_P?B)Z-{BY8{`RvZ0E6q@>$dCYk_5D&Q!>UDyMpw*i5w++CCc z!alv(c{1`tYv}hg)Tr6ZnyJk2yMWtmRllT3=5Tu@e{pl7iM(N1cv_z7?K_K(_V!RB z&GEBZ^7?jH{Sr(KW%m0EoroKd-W(Ky+6(^S6jkN9tOQ(v^&m0=b?9?pqa_B*W;qx95to9E-F#WE9(h;{da_KW; z_tDDGc1DNw&mvoJlZs3vkg+CMsIJ7DzLQRGkxsMnCV^Sdv>r4;5(fwdNno44$Jl^j zZfJ{z=(f4Bav(~5vK7l@(Q-Z(Y$d9nFOJF7^PCa0HE?rt+mM761SQhCSMr~<5gZoX ze`+JBns}4qGoU^S3kyMXj|#P2>uPWR1R5K9UjeZ22CjtW-0cV*qcguL?Aln_Ql$qt zF|78V_aWE^;4Aw0hdrEMkjqkK;Z@)#_|SR%dcpR+x3>xotR_y41*{36a)R97dwPP; z2u%Wj4Z?jOuhb&a>qCcN&U6=fJAv%iKRuP;EtB8SnWB=Pk)(@~UcX26U}tS6n&USI za`bkurUtaG+#OoV)-Se&CR;^X&jB(IN>zQ4!vPx$AF^5{rsC#us=S~_fz-13ex>M&T5JND_xS2Cw@ibE zkEx&LJG9d=y%y2ZmL8OAaQUs7$pxie?a;-}sLHhz8orWq9u3ef>Ey(r4?H}T97`|} z%xE&zrg{Jhw=cF>FQ_G(0cWd^uUr@?Qb%-EeJK0tR2u=X4)iCcL!R;IS>fpxF+!l* zYjf-5G;^J%TpM6WfOIh%KA}ha&Ne-AUE;|di$1hAn~}2t4HZx=nnTKE{`A#9uS3Io zP`58oUwQVn6$i-A;NezQhnnLZIgkJ5ce}PB3cX^k0*6oc@D6=+Xidt_&c@^2q2s_I zeVqR{2iKuDY5mqQ|5d@+c^#HqKW=~dYO54%LvP?2Avr2&wl>XKYlT2IqDF!uResrq zkIe9OgaoYWNsx8gw!Jkkq3T#Y=0SM(SCj$;fwL#3#|M1mf>P^_xbk$9A;Oh`3HD|i z#_D#qx8K#(-Ck+puj?~NZ9)^6H(GvP<2!!vrT*-L2N*<%a!Y-Vl)3{KFS&6pf z4^q1i3UtA7rq!*4Dzj)yp=CD!=u|&z<_SE|zX&`PBAD_r4{KfnEA4^mW)fRmu4A)v zDOP2AJDpUu(#Q=fo{^T8mY#lA$h;XG+aZm#PVa5X!zihR0?U?vxL?fn*TL?jq-B26 zco`>rxCl-a^bt2O2$7$J@`UA42s(RmVZ4z$=MJt5LEo2*Mu=c62OA9dgzW6c@l9`uHDS#$X>A~b||W;A;8^ViR>z}_T4 zLh^h5q=~MQlz#O6qa}8tDJsEjG8)ikVW@0VppJPpmau0&|0B1;W3!ddZIRw(uoTxd z1BwXz6^HKb?ytVbs@8k-#}afDcV~5~+`(5dvwa#_bEI`IHY{6UISnIeHZQgMy6Xl* z!b%kf{SSdi9`JexUzRS{GR4L_<4ZX=6Mb15jf7^OyG+${2XC)Vp@4Xk_O=n)w-OVAy?PCw-Vr^QjLfK(<9;5P-ZoJJp;zrbcYpMM5 z>c|<#jXsN<`?=>^*+Gqh#S&AYp~{^#Q=JN2RtrVNvH%OW+v`p21(q>klw}=g#^G`; zKbghl$AiQ|%BO+Z4p{?=8m`?R;ze!rT*5#Vvhaosf1O}Bm1R^}G|URpS3961^%G*H z#Tun)+kI!Y2rD%LTp$iDdAWjpv^mp-v(g%uq46Um;yd3tab20L!GS?5#Asmu1=kGDVW|-LQoXj?iRKt!q z9@XO-H#)ToE=yBW6F+`B$z_RMO}c6A^_``nAp6a|NqfAhQ{vMDxNp%1^1vwR%eN5I zd(yxWCG38^CGjuuJF0Uxm^u&3t@dT5Y6dvcEL}CgDYn8MR-WBQyiHhO4mk@ds}BlZ zpm$E6nnCY?g)r<&z(8K5Bxct5cKVssczqao4MkqV$r980x*z^wL27yJhr&9q(Z+1O zCG&=T4tB5z;~5Wat`8uQU(xMsEO>l5#0XAGRUa79`PPq6_)oO6d_Y!w=n((y-CS9n z{~hxiau-*r+1;;Q;^vmx9)E-MUm#P$WqQ4*o0R9DnESeuiJKW284wixdN=19WNoN- z(OJo9+w#gYKSD%poRoS8rwp;qd#}z5@&_o^;CEXeatyDZfB&J>Q#j)DL6j@*_xjfF zoS$1`dgWQ-Da_(Lc+9^UA@;&vA>UtnMI5n)~pP!#j z*MUItrAv}{OR0U;WlVJVD30rkSrwKJ7!VFKl*8)^YK7Y7R&Bs zxw)YN*T{--5GwBgF`!LA7G%FOgR6qDs83(yY+InrBV$y4cU_=(ivRfP$IyXDUj0+N zdg$6S7DrgGZ6W3-u0J;XJ4NC_hAN-hxK%gj)2l(Ii*>K&eS<95{`@;0h};A%mgQ@` zp_`NjYlB(OFeXB@d0$gg^J8N(1T}KhoKL9N`)-y;eFCmqr;AG)G@LIwRrqvl^$e)T zr3bz&+Thyg>w643)WNyOIJ9!h=pLgp#Zcm&^1BjAn^niy=fS!#CeG>r|1?rp&n0;6 zBAE)4m~C^i5!0KQx7p#=J`5jy9218Q;8agK(cacX$Xw}CRPTGJ&y1g<19a}j? z13HXivJH~lfJXxuaf^QpQIrsNLV()S+e>g6uwnO!7P2TRL>7jI-4k}DjmJuOzz*CO zBzXkP2Lt!6u`wB3j0a%hfpg?O8Ev5_*$51mS?&omh5Tq5tx<+!?Zg!8Qqh=FH$52*KAR_2m7 zdAEZtFHpinoNRv4+@sKOq7jtf(f^>Oa6l1R3!+tax7W6?|3^F=31HzN(i=a3^TT13 zf>TCUjj$7^RdkcUTibA2&_{4{Q&NP!5{EIo^PFwzL?oOF-F$PignL~s$sKBstgXRZ z5lZmd9Uug6oT>UOfo?bUY$QkiV!9!CktU4Zzq}bf)>c@nh#G*(=hUZ^Rxp!1?!RF=^nFO+@hX-jqRl4>kS6E(?DWX_$$88?wnC7>lu3X zfzOK1SWM@NpK+2&>x@fKX*rqy^GQcXG&Qorvi3b)5m6x*Zy!ekdeg zPL4>9c7eDJC8&ZV^gzMyX=!B{mWg@{9HKd8+OrK2#2LAI($@!nXA=W@pS10E+5n+` z@{@PQ;dou)=2i?k+uf-iQ^A-#<0?_qSdZ)Q^L|^vPY1&Y=pAS)&B4!dyoqyI!=%Mg z#9Y(0z@Ai1ViC4%Uz_PN23Ft7caPd~hh8$d{P!D(cQ}hxTcZI3EO9oE6do4osON$o z@ufK&>KO-$%VVvyyVm6&A%?ADFmv<_Q=L_YzJDUx2{V>!QfHoH56&gH#!gV*(Hu6j zOl?>xu^3%evZoU_&?M0zddXU=204Zldbbue&&JnY6Sd&ERjp^)ab!uSWn|E>^BCfV z^T$)7j1IGZ@9s8>EI6^xL2t}+gYXE&rI)CV0W&wPBctcqSAk7j%ayGf#GhmXb_cHZ zK%uoxvudYc#%t44=p+p{x%%ZNbgH4*Sy>e$&uNepa^!7@d;>$r7=yo8nytbQ+`S|(C01qq{ZwefmM#H~zv`k#kp#N`mSy>h0 zU1F}7#Z(F`G>Ehy3$4boE(*o zF~(U%-|Wqd{Dl*eDrv&i)c5>LLt9No3erZK_gR^Kd432OMqj?EeneXhj`pkye~hWT z$_-ALEaR%mjz+*Gb{}9~ru>0kZVkWb;R49_SY3AfFv##09%Ot&RaJFu2}YD8cB|G9 ziLdcRuVMz0?xx1ZyaZpcB9ALFAD4Rqa2zXrSGaX$Yb?aVE)N1fx@teJ_;(qj-~cmm z(HHDqnu!ZK7kUSDDZ(O%&cZk`HJ%K{x{;*3f^I99o3kPJ}#e6VEj$jF-wPOk6maZ`o>9P z&2?TImk<7YH`XQR9OX!<4Zr|in9OcpTai_drk?q}x2Z7TGYHNn%aFV89;b}ivA1n; z5<)(|!0Vm-@z2spP<*Mq8*#=0>kO*@XZ1_otk9Mcj_bW$Kq<9*l}6q<;TLjfyKLMp z^!3!eGA9t~WDSxn{8A-Ild*Q7H_gfGGruYA(RMA4^tR#K$-motFj^+qYy%`*7n5$U zliA3nt4`O-$YZPo|A5^G@N&{PeLt(&WOFq1By^(xL39D++!K)P+Rk)A+oO{MPmva= zKjQL=4cgxXMo~AS=}um`a+xn9s=a{fkGr2JNWS$KL(&e zr2GUTPt1Kb+~<~8D#uUEMwY;6AdUXj_f#;RcMWV$W^S-bOn~t!GCS13z>7BsFVDR( zwzgbHhx44tkkJQ4&V!`M(8=+FO9Y)7uKVLL>SE375YLT-WL#J0VVLK+z*YExaFsNZ=(ahS+s2A8d6*$N0VBsLQEBcG9eOu%e{_vz%clvR(S zQZ>Up`hKG+kV7;Ah00eQD7uHV($P(BE+FRZH;=XaJ%^I-#SBw@%Js*F=mmwU+Ora2#JJf z#HY&`o2Q)`{+NwH{s$(N+P2QvRHc}*fT7@|S8*49mC6Rm%CJ>DMWX13k)>LBtnUln zK7o^8kea1L#Mo(-fot5^x%n z-f&`;JP2i@{@ne&+EZ5_RQn*ABOGiQh&*Ig!a_c1q#-;K23#J`jorgwh*0^JPE)Pm zjBG9uWb?~M4)MK}8=?gwmMJ~s({+P>>tSbtaa&nZBUs1eh$4as6S2Ycy-JmAS4wK=<){xy) zS7gx&B{uOqRXY(B3tq+)h`u;U=h?00u{Q8Q#hFfRQ?sMC(SwIOXPU_B?4)Pa#x9+! z7BGkE^LF%|(=K|NsbT)ci(v6VXbpfij28Uc@Z!Q?QX>;0OoS~350#;Jm7>=fLx0J5 zEJl42Fy;mv(=09fv2f|prN*s2n7g@YZFj!^7R<8lqi%CIUPO#BRk5K0Fu3Pmb`;Yj z@vkxZ+@TbtkEcl-qf~RMmvu)Na@97(vo%~Y>L1UWsjS?0FN<(?+2_w5(^>J~GoQI~ zM`8|a4UCgncO=R8(IB%HaMoPGeQdE6gx-Pj9A$t+W(1PLWR5b|B@!|ft3Ik*ic=&3j-Q$$%@6awb1tft$?CiBCzkujS!YQBrG6#00 zWtUnKF%CKv{N!#9u*c>j^DveHxcK!Yul+uyQ|B)1NGrVf+32t=@44I|&ug;-9#xfL+m;7Wr;{H|Fx|}HdG`0%7a|*g~UKDWJ>5!{nl(286 zedC(jr>vu7iupB>O((M&-F5_|7!3Zke20lM(32Pj>Z@<&o;=DaLvOcn;XknutXC^%%HfJo~=PlTSd z2KD||JstEPmWH8Fwkn`*VQiNh zF4}e@XXNnm*#YDV_$$^rgIT0N?^i5&ZI%Jm_hC?bUFCKMS_lmNLUxH{swIGoNM!>X zD}m9ve)k@L9#7bL+bZG)@N`jP!P7&0=Nk6kQf-Hv#Tgttm@&TO&dCPsPk&Q$eB%R5 z*|L#-vOxnZ2P+k>Vi6R3*2j+}+mo^SLs!kMX7dIa3p2JK@{lRpL)ZMFzG9%bjEsh1ED{7A;#hzmMtXjT zCiPApWT3cba@nBe8HJo*i4G9g%Mv4mFIfKq8|;=uc~&e{ArH)^J- zLdQ7gn8u-RwuAR&cur(<(ar&hKEcp|sa+I??wmwtDm%L>5MIyX8GO#z^`F)tUsu)WG3E z7kB{MN)9<|v%8)HBl>&(e8|#h1ZWNu3wOT@T%Zoj z=z{-;gxJpxP{unpUIumkxDf9JHw{iqB?waZF^Qi(42S`!E#_B~HnkT5qiSFZOtl78 z$+XYF{^WraMy5v)k{#TQM3=HRR;(08i**11Wg&+HAkx>;S_edR2lqL;s&*@dA9Goc z%hhBTW_Asp{Co*uQwO87Lts=U!)z<;%#VBvl=(~M*s0fv=3Ni|r>TaHp|e&2l2+To z_A5N-Ky!grXJGjSneUnMj6F#_9IAk1C*o1(ykZmDcso)(j@^C>t$G7Gom0Z@An-*z z+y}EY=Wo5q1jY$O;Rr2;5$E*ubg*SjgS#K0K6Lkpw-KkNXM_zOfHRA1E1&}mKDz$H zO%w?q+YCk`iayn|O8wG*v}1uVAQ1|b+b$Thj+v2hhzZhzwiM_`)q<_q13q`b*Nt`I z0lZCqihob@lzL(sKnlTa3JV)L00_%{$jX?aEL#3yn>gscFx%9OV2ra z_lk0MTfFT8$KwLExZXyG9;@^eK9{bjDhGeP&&%5|qYv>A3~rCWV7=t8&j(;m3*;W0 zG7q4hCyPiIfYROjP3d&T;h6~}n6|O80h)qvee3K}PSUyZJCu4FphRtZKU-;jOE{1R zg$k4-8S&Hgb6#`Oi$ofkrmY#%rnzRr1b`16{I+MUe76~O3fy6g0`>$81G0*2RF~d% zXXq^Dx5;E>yMX6{iWSYG`j_F>>tAdJOLC!=ICz=d>g<05Q%#Sd?`CLc&AtyuuaT^- zSZ$uZ?s_Vp;So>9u6@=%JgZ6TkPpz2-sCnlQQc$h>-9T}N~s5U!)Q{HAUG*rI3~Wo zz3`ix{l2Fz(}XH-3&wpEx0$hbDW+Fyq$%EBVyC4rjLoDx7i(~CyHT?2KRy0J5fr_3 zkb^QcjU9qq=)lkmmilz%!l41NHY`^cS!g?dtvG_6dy3VYQwE7yUDF zL!cp)9251UVGsjG=GyyGw(?C?J@sG$6Y}&Sc%mybSYq-WL;=polV19TkGc^f6nWBX zrCWHq9|=_cPoDF7b&T!z^ICsD=k>2ULm@}?@5e3wT9AJ~Rr>$eI!uud2;%QInO<6c Qirl!8yxOg7xj&!(5A|v|LI3~& literal 18630 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 diff --git a/examples/abp_pcap_detection/README.md b/examples/abp_pcap_detection/README.md index 4f43f77b0a..0d76950e3b 100644 --- a/examples/abp_pcap_detection/README.md +++ b/examples/abp_pcap_detection/README.md @@ -83,7 +83,7 @@ Options: --help Show this message and exit. ``` -To launch the configured Morpheus pipeline with the sample data that is provided at `/examples/data`, run the following: +To launch the configured Morpheus pipeline with the sample data that is provided at `/examples/data`, from the `examples/abp_pcap_detection` directory run the following: ```bash python run.py \ diff --git a/examples/abp_pcap_detection/abp_pcap_preprocessing.py b/examples/abp_pcap_detection/abp_pcap_preprocessing.py index 741ddb24c4..0194ede15d 100644 --- a/examples/abp_pcap_detection/abp_pcap_preprocessing.py +++ b/examples/abp_pcap_detection/abp_pcap_preprocessing.py @@ -59,6 +59,9 @@ def __init__(self, c: Config): def name(self) -> str: return "preprocess-anomaly" + def supports_cpp_node(self): + return False + @staticmethod def pre_process_batch(x: MultiMessage, fea_len: int, fea_cols: typing.List[str]) -> MultiInferenceFILMessage: flags_bin_series = cudf.Series(x.get_meta("flags").to_pandas().apply(lambda x: format(int(x), "05b"))) diff --git a/examples/abp_pcap_detection/img/abp_pcap_detection.png b/examples/abp_pcap_detection/img/abp_pcap_detection.png index 70f2cb9fd6665228737a4bc0a2bec476ddc21bac..9fae49950d7e3d1dc403ad7bdabee682e388db2d 100644 GIT binary patch literal 19396 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 literal 14406 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 Y--OuZ{XY&^A$x*RyLuu2+>Lwx10nMT!~g&Q diff --git a/examples/log_parsing/README.md b/examples/log_parsing/README.md index c22d7a4dae..61484e5158 100644 --- a/examples/log_parsing/README.md +++ b/examples/log_parsing/README.md @@ -36,9 +36,20 @@ cd ${MORPHEUS_ROOT}/models docker run --gpus=1 --rm -p8000:8000 -p8001:8001 -p8002:8002 -v $PWD:/models nvcr.io/nvidia/tritonserver:22.02-py3 tritonserver --model-repository=/models/triton-model-repo --model-control-mode=explicit --load-model log-parsing-onnx ``` +##### Verify Model Deployment +Once Triton server finishes starting up, it will display the status of all loaded models. Successful deployment of the model will show the following: + +``` ++------------------+---------+--------+ +| Model | Version | Status | ++------------------+---------+--------+ +| log-parsing-onnx | 1 | READY | ++------------------+---------+--------+ +``` + ### Run Log Parsing Pipeline -Run the following in your Morpheus container to start the log parsing pipeline: +Run the following from the root of the Morpheus repo to start the log parsing pipeline: ``` python ./examples/log_parsing/run.py \ diff --git a/examples/nlp_si_detection/README.md b/examples/nlp_si_detection/README.md index 294932319d..8fc7263e7c 100644 --- a/examples/nlp_si_detection/README.md +++ b/examples/nlp_si_detection/README.md @@ -57,7 +57,7 @@ The dataset that this workflow was designed to process is PCAP, or Packet Captur } ``` -In this example, we will be using a simulated PCAP dataset that is known to contain SI from each of the 10 categories the model was trained for. The dataset is located at `examples/data/pcap_dump.jsonlines`. The dataset is in the `.jsonlines` format which means each new line represents an new JSON object. In order to parse this data, it must be ingested, split by lines into individual JSON objects, and parsed. This will all be handled by Morpheus. +In this example, we will be using a simulated PCAP dataset that is known to contain SI from each of the 10 categories the model was trained for. The dataset is located at `examples/data/pcap_dump.jsonlines`. The dataset is in the `.jsonlines` format which means each new line represents a new JSON object. In order to parse this data, it must be ingested, split by lines into individual JSON objects, and parsed. This will all be handled by Morpheus. ## Pipeline Architecture diff --git a/examples/nlp_si_detection/pipeline.png b/examples/nlp_si_detection/pipeline.png index 0f9c44f9176185d61718d61ee279ec506c4ed445..6de012072084afb371d4cd5a573f4b321640d16f 100644 GIT binary patch literal 17114 zcmeIacT`kaw=as?D2O5oN+SZIWCa=!$)F%2S+Zow86;=WmY^UYh2)Gxg+ekENs%Bq z=hWm3l2cK2=eEx|_w;w}d*hD#-@EV7jBdK9u=iRs{K8zkeX1aJ@%;7k1Ox;ZrJp=f zCLo~Tho8fVPQ$;?4QVsMf6f}pN6gKx8>JH(3NdOI(dsDpRI z-Q~yReFxpY@3MswU-y!9Hy>brw?!6n>fw8gZ=bxK8LdcvuZYMv&*X;wQ}0j9eL2(E zWz}5^WhDwixTgQ~^-@RG$>m=k+cHYy{!h<=AK&wkN1pn}LoX9zvoHMP5rWyaM<)M# z~vCftX=-obiD)muc2t#v%`-!*_KfUB?I*8*bbfk2JLFdaB5*bA46I$$n7RRhKB0Xl<2>+{tEpzI|m;mm;tBmTzyCqS!{& zHmUH>ucYI$y1L_GK06;t#|fXF4;o0Opl@YSak!YW!WFPa8srj2nQTQM6S6=&*IFt2 z(zYX}x;0{#U_2q0lXRo}6sBmp?HjAYz|G!Q*k=EZ{>0i^RR{9Oz)N)Nf$TzB!WuR3 z>4XGMHj;~vg9h}&YnOVn=-mE#CCRUOwy}$bB2VlxSMg)?DJPM}FXNBw*EeOB%buKi zvMrqIRw2j5+AYKFh#@nz*Rj#fM2pT&Q>Aw%wYscB6`%vHz%#=&Oa*$ z!3Vnk&Dyo-bxHK#`Eve!n~}cZ{zJQvkdT}U&d$zxkyU^FNz&7RuG(rbR4;t(v|w}& z^Kw1*uH!;SNb4m!(W-Q|vk#JHwS<-j^7U)mFzty#d|CYq?eS%uqQ|OgY7L)j_eQMN zvL)U=E3s6=(Coo(GDSa~&&p9<-oWEFBnk(tl$j!B)KpciYftu?Xk5qY{7GiGZT}$f zbAvY(HdM}0O&0auoABJAwyWX_N^`L;%4KXG^O|+9`Lq5UhJ}726hpkpww(Alm$Gzx;j0(;ETxVuU}efpH> zI&oN5dt!slSYtw0u469WeoRrT-q8K9X#zI5z^G|nSLmgKTAQ&&L2F2w`Dm#Pe6Q38 zo$50AV2v*6^xhw*l9GJ5Yjx4}clh9wd zelPo`_8l6iQHKqjK1y&Q^RZ?ex|rhEdk%}KfdOPV?1EUnZsq;zFTMF>1X{gIx=veU zbXmrku8$Jv7;4&Cl03<)di~uuTHNq)t`Ej)+=PDIcW1>iesFwTJC@@~co4*Z^wVgBFdN!cp5wXZ41l z6d^jH2TiQQ6D7uX&OTsWk=fiFHcNJPxhmL_E*-&9b1)qc5J0ZLZ_t}5Pg4-g5;QHA zuAI|0r@M6i)S_Wac5tXlred;aqHZ{#>mN3h$$*qQYa|l@iNi=7ZgAvV(Ny zYPz8U4>~P&^(u;0r>4?7j`x4oNcP1YR<4z5Z%kB|!HqOWFpC||Mzr%)8aJb$H`sTj zJlxdh#4M&AT>2h(Nx%HXlpis)mwDef0nR#vj$(w~2Q2@yr(z0+-1 zy{kT-bw>j&ypZ7NGHen(QSFIbgG!cy_fkgmbQn^@+@y?}LPMg3j}|{}qL36^Vz-{C zI_#0<9Cz##Io?|ndhyp+qfmi)SaNw(eyWDLy55U#gh~`AqqQg69tK86Ghx2inGLT6 zA$Bw>qts@A;W$gX%r=qFZleAzdEf;qWi_>uK|N1h-;-TPjMlN^>4xAis5v7eBQ@T~ zNE^H)vePvcNJq=}!y+p&Dm{S4X%(uee1ZgnbmpW$C>w5x}1YO+`-i+d!y|4jdbP*YjMs*sh>WvMas}X&$B7DiQ2BT z?Ef^oQmX#>+0p6Gxw$t)y$;|beU8`4e7BmJZPfGMwsKUizPTOhHW#U3+8)=hr9C&3 zla+Ly-fJ^hKQ}M0U1$9)v|#Znl0dgrsB*dmhLU*PN$o)cCzD0ls?8M**5)NyH+SRa z&HIY-$EO*297n6Dn;j@(uW{;m^(jd;Y!0TgUeSAgh0gpOJx9HNIT_`2S4p#nCg+Mt zb#7oNlTAimab#)FHO$#q+e}3vK?5G|l-Wla#v{eh^W|5dZF@^vEs)h!xo-!3`KTiw z%gyNbhx2kDrJh@ALBVE+(8dLNxg=rtmJh7K*Vrx1&C8cEwQ)FKUBj@bA`|TWEg8LVv#&=Zr%%2|RXC=C5+1RWZg^85f&omw# z9SJzj`;jGiZ8hI*FM(#Xyu1v>-FA%M?dM-XK|zE1z9P8AN&Lwqd~!WYP?Gz6ELq(< zDjw9}eNXv9UqN3SmaJ~S7JtHPHIS=Qu?1x!J3Bju$4tRvqcw`1`j6*dzZiU{^;|7* z+kh}Q*c-Le*VK$v@pS1bD09n1-OyNy;j`1Tzw(IVL-_R0p=9Nr1EXfp`@7O?1GWCL_|NQ9_cYHyEJfp?v zK!@Fyb5S2#&DVenRNQcdyDNk6rElMGmELa!UCCjvdyPZqnYK1H-W?YI_TzU%^kdLH zHc_wzOze|}E48a{*&GY)n>CMF7H6`Q7Q}#J!hv&0=mmERL6Pw zZc`%}ta4X-ll@#rrR?9ax=~7Rdt*@k$G?SZ^e&D3fYdl{_ze=W>LV_r#Ubx1FgId3 zdfRundYKg+QhS{j3SL-9$`apy8lB$z){cVK=U{3Fb>Lc>G6MVg*SFXDK8JJJ8ANtPrNdUJlitJag)llX(d}Lp z1%V8Wd_72-V7x~iF|!{TQnZ|2g^36vLWUeU)s(j_0&2NdkMyLM=1+(j)8h359oUN=Xf9}(o1{6I@+idLXD_1C9#ch? z+N@!j^!a4-rb%*}Yg=xI33Df9Cm2)4l1F}I`Skho3iJxd9e{n8=lGNa*dt{wUca|E zWE6HXLx&$qkD-32V0K~Dn}1MTxadJepc{D;oi7%^Qf!4`lEGz0e(z?^u)6|D)z^vX zdYGEW1~~c{q%QMG>gwuR{p+SDX+C&EvN!E?w1?A8%tn>vjQgdRx%qSAZ6rnJG z**jV?UtVDt5*55Y{)FnA87-H<&*cZJAFzW0AT`j}myXwh_!oax>*GD|V%m{FC0;%g zD#Xo)l<#@ZcfMvB&2@l?;YD7DTW$Tld=g3&y3mj4{rGRs2&$^8-jgnbHo)ok6X0=! zug&(}Ty9avdHMthIY5)pm~3*~<67SRgg}QjxeIk}xX=XJlg*LrX#4G|_7T&3Y4mQ@ ze4Ldy(GneZPEHOn{XO^^_MBgnMeVJo7=>y1ZlO-fWu#n56|{_=-_;Zp)I_N=v5h^N zTfgScm=V9v{NatQ4^2x6M}$>s<$K!)$C+&+KiPK+{Ax$h%&VOLokucdVflXWRrtxdIREZXQ@|$2*2WclHYc9 z`$90wwig z>%flQ#kjnoZgM6s)Ej6;a=GaJE+PHOM_au0qY)Wxi#s+&iz61)RF2L9+`5_ZOGcTB zNweZvD;-8tK?LJ!P~&@j(b?IH-5;eUYrK19J$4og;KL3&&-k9w2E ziJ&;kx^zu7LW~0kz#~N==8sfgJPsKZgn_v zzz7$P=^E!emikR5*!8w_s39P`9Mw+^nLm6e+NHfx#{CdfU;#S?+#P`hiV?eow1U5i z?0tFIAQmg`aXC5w26B;`kLKLB=huolMWI-3ifus<=M`D);Hx(qse#7RaT`DBOcI&F zWH?%_k5z1ib7iugA?N$cQ)fK(Rx39cQ%6nk8klJH z8AfYo2RZluxI=jq!IAlr_+Yb%Zqlh&K9I&`=~OH~t-IZ~n3KU`LaDmQ9`mS39PX7oV^OS~~-nWlTM%{jC(DP?5bMRW@e;tS$x7S%nS_`7^$=;xK6kePAU;6Elx-5#u|Ie4P*iKOs-AyZYZNE zwH|f=Mj1lIlbM-m3M&vJ?7oFP-2NyoMju`Ja0JJ0K^;+Q(Njv2WwWTj+ND|G1CjtQ zooEx2Vv^2~w{vn)tiN1mU!o9z){(qb57hL9#ZudGk5QYlH7H)d;*opy-a-GN_^N?R>a32Qf)2=wx0eD3>Vc3~gUt zF!6JKjR#=V5sb4Hb}&^U&<7%VNf9U)gvfZ?)|s;xo>jTo6Qu%9AZJ$ag5Rp-sLtD$ z_^rxpZrQYAQKryl#Y{aE=vs+HgT`M)z<=$%f6PLci`qzu4 zKS?-Z04f8R*8`pgFar-f-WOORvSpyN%-3$pp}*g&h*B@Chzj#cOTWoQq5nKgcj92 zLGS^bhX_!MgZYz?=*J6U_==aF;gAhbkQ~n zPVxE}ar{!RsL5aih0Oz3&@Pf(Ml2Az0o`qLKHg3N+T}p5CVs{j8-^_#do-N*XDKh9 z>ZQUxn_r}lk<}eoR{+_BFa9JHt&E1P#4-B)^u=%B+m%gs7Q4R(Tx>PtM1VV>-Uf(E z+p%&ky+R0DC=EvSZ!ROn+;P`$Enz_~jpaOjTRb19bn`7ljw70iP!yHsjJ;=}97Zd` z-TDp)8U`bHGI;fl`nwwf4nP0;w!P4aWF3l8Hd7%nPA0>)=5YRQygW6aZ{TVmK_q#u zSAgc{PeQp4@=&$sz7O1EVXn`VKV<;fHFhlu{4T-(ZJ-rGbwNt;+DHlXk{TeUpk2fd z{{W4yOq@szw;4u#{rUtXKO%PweKCN7Aw!v+mq){AJJ!lsTLldGk{I?Us7IIRb=>D7 zH?#1&`uMB+-JCTCh8~fU!PiXgO9uZ34eXH}$+g*wGsf@0K9bO5|2il3tioXqK!7j) zcygn-SApISu(2@5PuK<08~iWeBOzCwNl1K0GJQ5&Y8~JQ^uuPWA^Rp;$?k9|T1{ z{0r8gG+*3;ujtG>9`5L>ogP_wKTsb;rmkTQommDka%g|DOu1N8g-3k*kYOx?&FILX z%_K(N@~ZxGi9k|s=*^%*;{gpPIuB^RK6l9n_~4aw!>Kxd==Dmn>ov#gWa1G~b_KhJ zA|5+#P(TZ#EecureosXAHGWy6os3*1?>_ATk0Tu)l#v}2)Xz&G1Qr%@H*2z#IO=-+ z5=AH^H(SRM?2YrE7yf=r=Ec#7tNT5H+W$&7(P&yBm(}e~u}MRf;^CMpwG>X<_BvX@ zuGjnf`_IvNy|8D40!n8MVZ&qAae*EI1jK_|>&kCP?4h?++PrZMvDZOS_8!(&as2qc z?R5hRE(s-v^(5xsVXcX`OGDey9`rW;+bcyKf}a6F?(Xg`F@lZ{+nQf69@kQkOOefp=-R2plZx%9*XklAe5nFR-d(TWoR2x?bm!UyA; znUgQjx5e?^aWojKorJuWW{XWv+#Zwd8|M4S4jhk!s^)ln!xXnCO*HlCGdif3WeqTH z@StvqWxxAEBA>(T54~y+Ku-#B_m3?#5&- z5bAR@PKY`x;)6Ya&odnm_Pi*xKJ<}AtIBPYKJbRJuC9n-{TsylIJ9>zw(~t6Mc(S@ zw7GoUUv0J2OV`OGN3&EW?q%883!0}n;G!Q9lfGk=<%(eRG(lI)$IVO8l=RJs{``6- zmT`vO+%>dn+6~eK?2XMXiA&y~o(#(dtdAs>HD9u$T+ zE3|aaJNf%p#j`(uwkon26|QX_Yv;!EI-G@w zHqqCo0nvBn_5hNbncK9g@~TT~?~PuW>xN`6y53CJ6QIsr)=t9Ps+8V22z(lM&?H9d zv6u>o$!daPI81!nm8FyXd|C{7WbIaDeu8}?mFu{(#^TGjEfczper}bXy7WoChgYYE zIhpAvGHrQH`IIW;3q^|tBX=RCm<7%QRs2ZW`YWS|Zm)nqM=Roy02O6zLVOY3`8XYs zE;Tt+Ewl$Ls3p5$o3;P}7{kU72RkotX~YMK#UUE_LPz4L@l>v6QJj;NCWD1pEN#Tn zcq#dM5|4LUVY~n7(5xUHv+ciiS3rI3I{cvD{kdPjh#RZ)mbs&a;(HoJSG=er%@&21 z^lfI01~CQ{f;NB9ke?FKH#-LX-RrihsMc;K;u_zu1VJMV1LT%dWTmvM0M6?{fCUf& z{GJ_tFS-_+(O^jYng?%N|7fmb#PgiIY6l+0^6izqS@>OJrMPfP{P9Kl9dMK0@pQOB zWQZNF7G0BFR>V}0E>8mTkRbBhsCKQ}LVv#%VfFM#X8Y{NJ0S)UEW^xcG|Mw#VrVql zc8ez?Z;5*W^Nwh0+lKFrzUF=Dc6haZZj>#49zNhi01@(z@ zlrFeDAiX1r4vnbnSzFAVVC94T8u%34$*~xaG~(9Qom+SOgZ+9|{bZlU&WoRFQfY`S z($v?Vgzk*gaK|Zl2M~v$_oJ*+e`~6fRJq*J{`!(=j7$ci*9DS6VkqbIojP}ejPo74 zX5nl-x#A6wa zv5Q^~5wo0pR?zj29vl}(fW>(PlR4|$u7X`5X}RS0^pax8xB8UKO$z!Q80S&aKLOa z<&-B{f3sb*uw&t}H~HV15|Gewc{YqKRY9}Z@0%hVW7*n%} zVV(^94Yn(TrVFMno04WrhPz?}Jcp-p~1`w{#U7{5Rw*Wvr4Mc zgqj29%wG^6<*BJtpvk~(>Hrr(@ch6YxBYZISslQ$@|e5A8awpjYHJqmTlA9!EQqIew#B*wczDTYw@x*JC4s0BOS)saSnAbcPyMrV@DfN z+ts$4l-e-Ks#sHbjn0FQ&!Q*Y&SyJ*Gg)ZSS9Nc_@MZb~O~)flg#+;>H%(F5;eSfG z(72OPyP{8ozIDEU$2$`Qwn1jKwzk#*Al4SkBSBPT+HP5-c3X3j%1;t`69LU+_2PwX z8=nR~OB3V7g~4X6+#x7|2(%i|w(|x6;5ue61r|oO(#HYN31_=x)`p)%XH{}oDd_WQ za6tds_3dcugD#}Xrlzaw-NKrM1?w5YP*&B@h(o{8))0y)m^eqxiaw|>UJSj#3M>?w zRL*sb**6^NTV~`<9HEm@Rf15|tMW!{zoHZRkBtqjg%)wBe{g1TTEuk5cLxPrSyf#<6lAlK>S8zc#@@N2+{h@!tOzg8a7qFt3dwHXL7fPyGl&ix|)=0ZnIhRVMP){H5?-kh4Ho4+FPbAxZcUL_=HG7xR4~46FIm zmIzl^Vx;r>`Ow6~WWI9ZzR)N*XtYjU4`btLKwI>%PDszUWe-S;YHXZo3hTW40@iM4 zx!-CW0Z1{GZvkuPi#D7^@bsBjF<&2# z=3jItmeWu>A$!b}+@t`E8$h#WM>|VkzQ`+!s#^{kP%;gs+>30z_&7Gy;Nt)@o0($s zywx0!x_pgol-8VkQTRA?&q?5-c3v}}HtZZs?AJsaM|#ojxOP>n*ZH|Yu)T?toQ~eu z_H(Inm&1wk40;A!)5kMU>IPq`jxRr)j|Y4^h!n>Bh6Dszp?`%ryy#8zQcQLGV7auO z95ZXL&K|u>U(chtRWC*Im zuN5Gm$4C%CFYeU&9bdcv_E>nuI@Iyg3-PzW)+v~U=lm_(sj^7Ia&x8H_yvaZM=9iULxF|}lXva>cDn#I)^BfQH zuN^KVBMNxA{S1t7C48yN%Xp^sHyZzeYj~8>dH@qsJ4Y+|l&NCU%G|gOulT#b7-=Mk zTBA9`@Np&#J*Hl>6({eV(|ZkH&Gxs_hH8qoi|Vv^z4-&Af3i9dkrMQJM)28VTI42| zN+2?Td3qrf!y?LoVUVEZ(UI$&B9?Dl)_q414y?mod0vg5fYvF0_OiV{aw9gA#uvN! zOEs!0Ic-6_v3cGBO=3@c=IL|BU19n`zAz;Y&U=p4X6Bo_zFXtG72)Qz(=bV?07{vP zqDUl1??dv)>dN0(Zl4_Q+ZD-Kgbv4>Z~ZE^_gjnkZ*_>)hhD+%i^_k}`pJxKKLN#x zsJW)$&dMoF(pLM?X$4i={o6;^dR?IZ)B7RxxM&vc>4x|a)P;x}T0cXnQ>Y;ZCUsrM z`@31mt{8`K8u4*KwZD6Nw^1kqA* zWE(nWQlG8lZHtHyc9{diRJ00vQ3c|xsP|F5-RYjQmuPQ@XXitl#T@RWr=_I&6h%GJtBG>-#~q#Nh>ML7R(EcK$u7n0o?PMuY<|Tn|^;- z_GM$O)V@}?C5a$H|6SF{m!U4-FY*Zk#me*6Qc}7szBpX8020eFBJeMN&PV6wwiT94 zJE?=&Xlri12%H$?N$%(k5cxLq-}?QQxb}1EJ4maIU=;p@F#;rViKgC5kP2+K@yu{a zFl&mO3^GJi59Vp_f2YI!e07f24S%waI97T!Fn98s6qauS5L1sbMAf zrP;;|%PAhFa=ZnuSN7%VnV=LHJ_L5vs+?lhnS`jXAg1h32Xl7B@ve~QABacQHN1@} zK6U2oJ+GR;E>WBegRl{*P$9`G_>j<(+r_1 zkOykdR@LwmQErj>7$aI3rA62Q^fE=|8hJv2!E-SG3t6WB{)phcq^6i6QAL$|+mgSj z(BlF5+2TqjzANogCwvobGcaM&7)Cc~%o(lY01R8_iuf~7EkX7^Ot2ifwZUfww0Eh|5%$&sl z?=+<=csh$E%^xRF}gU$u`5XjI8^zSmjMTrhA ztixsM314?jR^>ooK|moI>Wt1xFHQInGu1lcK2&yLsZ zd_5=J7v}T}o(Y8dkMUkuze7aX|t2E|LPUdy_Rag24#&j5SND0L4!c25FJ0J)i_qVn^Kw;IB>u z`<5T(`O2(^w?NRkc!U3s>Z-r4a(ociy@DcaQL@t20b?7{0Xltg+dKfypcI0#og|YH z*C}I@#(z1Y6m&Y4pq|?O8@QvA_=Ak+R;c~PwF#fSaD{)1+0sJ`gOdEW9m3mfh@A#v z+R_;;;u(P%Ly3-tg0DFp8fDa+n{dwP_a4)GTyTC(twjUL=qF&`>=UDzM z^htUjLF%0vE0D7OW;_vr3d!Cs^C&P#J?GnEVFbAW@%AUQ%D%#oIk$4A(cWslJ$X%x zZIPVg-_gd>LXMkjjSeiO?OS*>aOOiecl(ixmA$dFfLblocMwo3_xrJ$T~Nr zp7(CQ&{}aXOyOzkm;l%J-FNkMg+gREQp~Ei1uJlZFien3Lj{+!#np28Jx|G~vqdh0 zFGpkmqrpd0mwd}%00x)|PY3_)?b??=(B|VmW}73v>-$zPlmaSXl#TioPc$&;23$sh z2sGa~5G4MVaC(NjLu)X+Na=zr0*~JT1{#oY^UaV!=43Ba@8jvU1kf=-48e8cv7I}d znR4;>*FcoNYwb_+q>#X3bAuG9?g91WK_gG6aFO+JA#@`z*nGuukMQG&|AnR6f!zoN z8p&t7|2Keyd5-Y55@h^+xX6q-M{f^-kp?9n-*NzVM(p%j+;0A;*V?!(963n;(EWSq z%Pp#-tHwhy3+;~`VYt8o7l8&=ZwKTSm=yWIC;2%y^r<(IgWG;O&SNC)ARfciPu6Dg zJ}7|5$hd^-puG(C!s)I!2dW}w_mKG61}7AEy9u3P*~d@*-gUkp;Q*Fra+C%y!?)52 zW)Y0Vif7?qMJ!u%Zl_f6?Ugzop_M!Ohb^G7(n67Oy6s0c-4tC}~gsoHlFHKd7Tb#)V;sU;&gf!~`4d zHn^5YeTdty6@w9Ba9cM(%d@k#Mw~H4fw>QDblIfMf};q8&xcn6q8EdrLUmnbAXN#&=riBAlL}f28QMU`e!!!n74z}hRwQ{gbsBZ| z!5AUpD4Kzajc8wVtYaR!Qq9I^W4^Lc+-y+pqearg17+9sv1Ueke9+|SAm=c^M{Tj7FmpTv8yec zI%k|5O^$@=HE8z59U<4WL4}0i(9qD>2O)Y6V9HY0xO2i4vDXCmH1v%281n5Ss$vwB zGb>glR$WwiDUOKo$hbbJU&p{2$AD>pJd22^e?yNuxCy<7KRjL*s_1DZhYdU)AjG<; z!^lZq*#rjaIkX@P;L+ejRYNSIG0UHP4+4GpK?ytWd^2ORkKkUoOa{V0VR57*n2_;r zm>%4Ow&(>zkM&|Ju@Pw*FFB2xd~n;z`zwQ-NpCe?aMNJ&fW35hs|<%GVdE#U^Uz3e zy>OYxU_P{dcZL4*W&De%?mqw`rk zPY{sv`#W=06-8X$7WEA222}%ola4TaL1}- z%2^cVyZy&p{W``fU$43pHU&J6 zNhKnKi7NNz)-#Fge&h;6FqY0yF^fW`j%5pAhZz;$dtt(7Px@i~0cMtitgfM^=6%?z z?*m2>lUxj$YbjJs{Eg`5iQ$_6NB;~Ua}>vW6A+L43To>kjC5$3KYo+CJn{Pm87T4l>|Z! z;=?vj>Bhl|k7h2G+U3TrVAu!PIATF4b_7AZ5_Cak`M6>jvj-8j60Q%1zbn8I2VpN} zmf}NS#o3gbEt~G*qIR^79;s9%&Yfgpp`mH!pz(vu`vgQIXo$7|?w!;kHaOht5VK!i zJpug2cq`;Y*zSj!7!k`AURxcezeQs!n>XXr-?#67*80kfRiXfqX9>uJ5QuNC5Rq{5 z20{y{`6L9ozYRVn_Z$n!T+HsFS3_AzxHE!Mcg7q$<>T(b3{R=+#sre(Q2LU7Zn~+; zbUr3v`2g}gPz$6y0b6&DGGyeP-!fSpf^8Lr_Jtf{YL4fV&peaI+NASlWH+<0;#TLd z4v;QFN}VqYNuKKJ>U*F^Bc&RK2$6y3Y+V`ayE?`>i*}O+u4p)?Lhpy*NoN;HOnF*~ zBU@w~9IF7+cc@$F^m!8)Rf6C%if=%sFJP{blK$bWI2EfxvVO7EC6;o4l*s5%GpBH* zmTw^xja;pgWf-^FNQraW*{gi1V3GD~>%zJ2%JUBr=qetHD&AzC&^--D?pBTASd?y9 zF6YCf5CSI=;xmIWpM%4f9$3waS1iIXXcRu$k^qy%z{f$*MSA8O>FO#Q0fBA^*Ifc9 z_atV52eI6y=U$@a2hKdWOr%4=-ApK>FKMRnFNg71#D1L!E`APzIRIE#TpWxVfvW_F zPe*Tb4r_Hc0_jKkn@ z$1rSWHkhW})$t%HXdq-Uzoh}0b5%^97%m~e{F%1Pd@JDY?DYqfMlc;tu|NS>E|19b z)J^6j<_|&_NxE#{FeUj2UCJnGS8@gpQPF+PF%Q0LjN%So3)cpm}=CYl+Hcr$yAPc$u;#2oib! z`MUscSO0w;{{Q5!27JX^O@{vZLk4FL zwZja2-G3wa@~=Vk^}qZzg7|+e9@hW*X9oVSf0JvnQl4yafkb9VMoCL5JVJ{<|MPzU D^Zom% literal 22768 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 diff --git a/morpheus.code-workspace b/morpheus.code-workspace index a4ee3e30c2..11a0f9db2c 100644 --- a/morpheus.code-workspace +++ b/morpheus.code-workspace @@ -84,7 +84,7 @@ // "from-kafka", "deserialize", "preprocess", - "--vocab_hash_file=./data/bert-base-uncased-hash.txt", + "--vocab_hash_file=./morpheus/data/bert-base-uncased-hash.txt", "--truncation=True", "--do_lower_case=True", "--add_special_tokens=False", @@ -247,7 +247,7 @@ "--model_max_batch_size=32", // "--use_cpp=False", "pipeline-nlp", - "--labels_file=data/labels_phishing.txt", + "--labels_file=morpheus/data/labels_phishing.txt", "--model_seq_length=128", "from-file", "--filename=models/datasets/validation-data/phishing-email-validation-data.jsonlines", @@ -256,7 +256,7 @@ // "from-kafka", "deserialize", "preprocess", - "--vocab_hash_file=./data/bert-base-uncased-hash.txt", + "--vocab_hash_file=./morpheus/data/bert-base-uncased-hash.txt", "--truncation=True", // "--stride=", "--do_lower_case=True", @@ -353,7 +353,7 @@ // "from-kafka", "deserialize", "preprocess", - "--vocab_hash_file=./data/bert-base-uncased-hash.txt", + "--vocab_hash_file=./morpheus/data/bert-base-uncased-hash.txt", "--truncation=True", "--do_lower_case=True", "--add_special_tokens=False", diff --git a/scripts/validation/val-run-pipeline.sh b/scripts/validation/val-run-pipeline.sh index 38d53329a7..8849b847dc 100755 --- a/scripts/validation/val-run-pipeline.sh +++ b/scripts/validation/val-run-pipeline.sh @@ -1,5 +1,5 @@ #!/bin/bash -# SPDX-FileCopyrightText: Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-FileCopyrightText: Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -41,7 +41,7 @@ function run_pipeline_sid_minibert(){ pipeline-nlp --model_seq_length=256 \ from-file --filename=${INPUT_FILE} \ deserialize \ - preprocess --vocab_hash_file=${MORPHEUS_ROOT}/data/bert-base-uncased-hash.txt --truncation=True --do_lower_case=True --add_special_tokens=False \ + preprocess --vocab_hash_file=${MORPHEUS_ROOT}/morpheus/data/bert-base-uncased-hash.txt --truncation=True --do_lower_case=True --add_special_tokens=False \ ${INFERENCE_STAGE} \ monitor --description "Inference Rate" --smoothing=0.001 --unit inf \ add-class --prefix="si_" \ @@ -62,7 +62,7 @@ function run_pipeline_sid_bert(){ pipeline-nlp --model_seq_length=256 \ from-file --filename=${INPUT_FILE} \ deserialize \ - preprocess --vocab_hash_file=${MORPHEUS_ROOT}/data/bert-base-cased-hash.txt --truncation=True --do_lower_case=False --add_special_tokens=False \ + preprocess --vocab_hash_file=${MORPHEUS_ROOT}/morpheus/data/bert-base-cased-hash.txt --truncation=True --do_lower_case=False --add_special_tokens=False \ ${INFERENCE_STAGE} \ monitor --description "Inference Rate" --smoothing=0.001 --unit inf \ add-class --prefix="si_" \ @@ -101,10 +101,10 @@ function run_pipeline_phishing_email(){ VAL_OUTPUT=$5 morpheus --log_level=DEBUG run --num_threads=1 --pipeline_batch_size=1024 --model_max_batch_size=32 --use_cpp=${USE_CPP} \ - pipeline-nlp --model_seq_length=128 --labels_file=${MORPHEUS_ROOT}/data/labels_phishing.txt \ + pipeline-nlp --model_seq_length=128 --labels_file=${MORPHEUS_ROOT}/morpheus/data/labels_phishing.txt \ from-file --filename=${INPUT_FILE} \ deserialize \ - preprocess --vocab_hash_file=${MORPHEUS_ROOT}/data/bert-base-uncased-hash.txt --truncation=True --do_lower_case=True --add_special_tokens=False \ + preprocess --vocab_hash_file=${MORPHEUS_ROOT}/morpheus/data/bert-base-uncased-hash.txt --truncation=True --do_lower_case=True --add_special_tokens=False \ ${INFERENCE_STAGE} \ monitor --description "Inference Rate" --smoothing=0.001 --unit inf \ add-class --label=pred --threshold=0.7 \ From ec8afcd49840f2fb4ca404d4b80289823527f0ed Mon Sep 17 00:00:00 2001 From: David Gardner <96306125+dagardner-nv@users.noreply.github.com> Date: Tue, 28 Jun 2022 15:27:26 -0700 Subject: [PATCH 61/73] Fixes Pipeline.visualize (#203) Adds a busy-loop to block until pipeline build is completed. Fixes #188 Ideally https://github.com/nv-morpheus/SRF/issues/68 would provide a better way to do this. Authors: - David Gardner (https://github.com/dagardner-nv) - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/203 --- morpheus/cli.py | 9 ++-- morpheus/pipeline/pipeline.py | 8 ++++ tests/test_pipe_viz.py | 78 +++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 5 deletions(-) create mode 100755 tests/test_pipe_viz.py diff --git a/morpheus/cli.py b/morpheus/cli.py index 619a37f4ef..027f274f7c 100644 --- a/morpheus/cli.py +++ b/morpheus/cli.py @@ -548,15 +548,14 @@ def post_pipeline(ctx: click.Context, *args, **kwargs): pipeline = get_pipeline_from_ctx(ctx) - if ("viz_file" in kwargs and kwargs["viz_file"] is not None): - pipeline.build() + # Run the pipeline before generating visualization to ensure the pipeline has been started + pipeline.run() + # TODO(MDD): Move visualization before `pipeline.run()` once Issue #230 is fixed. + if ("viz_file" in kwargs and kwargs["viz_file"] is not None): pipeline.visualize(kwargs["viz_file"], rankdir="LR") click.secho("Pipeline visualization saved to {}".format(kwargs["viz_file"]), fg="yellow") - # Run the pipeline - pipeline.run() - @click.command(short_help="Load messages from a file", **command_kwargs) @click.option('--filename', type=click.Path(exists=True, dir_okay=False), help="Input filename") diff --git a/morpheus/pipeline/pipeline.py b/morpheus/pipeline/pipeline.py index 1af6dc69c0..300b7812ea 100644 --- a/morpheus/pipeline/pipeline.py +++ b/morpheus/pipeline/pipeline.py @@ -70,6 +70,7 @@ def __init__(self, c: Config): self._graph = networkx.DiGraph() self._is_built = False + self._is_build_complete = False self._is_started = False self._srf_executor: srf.Executor = None @@ -176,6 +177,7 @@ def inner_build(builder: srf.Builder): p.link() logger.info("====Building Pipeline Complete!====") + self._is_build_complete = True # Finally call _on_start self._on_start() @@ -283,6 +285,12 @@ def has_ports(n: StreamWrapper, is_input): else: return len(n.output_ports) > 0 + if not self._is_build_complete: + raise RuntimeError("Pipeline.visualize() requires that the Pipeline has been started before generating " + "the visualization. Please call Pipeline.start(), Pipeline.build_and_start() or " + "Pipeline.run() before calling Pipeline.visualize(). This is a known issue and will " + "be fixed in a future release.") + # Now build up the nodes for n, attrs in typing.cast(typing.Mapping[StreamWrapper, dict], self._graph.nodes).items(): node_attrs = attrs.copy() diff --git a/tests/test_pipe_viz.py b/tests/test_pipe_viz.py new file mode 100755 index 0000000000..58d31578d3 --- /dev/null +++ b/tests/test_pipe_viz.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import imghdr +import os + +import pytest + +from morpheus.pipeline import LinearPipeline +from morpheus.pipeline.pipeline import Pipeline +from morpheus.stages.input.file_source_stage import FileSourceStage +from morpheus.stages.output.write_to_file_stage import WriteToFileStage +from morpheus.stages.postprocess.add_classifications_stage import AddClassificationsStage +from morpheus.stages.postprocess.serialize_stage import SerializeStage +from morpheus.stages.preprocess.deserialize_stage import DeserializeStage +from utils import TEST_DIRS +from utils import ConvMsg + + +@pytest.fixture(scope="function") +def viz_pipeline(config, tmp_path): + """ + Creates a quick pipeline. + """ + + config.class_labels = ['frogs', 'lizards', 'toads', 'turtles'] + config.num_threads = 1 + + # Silly data with all false values + input_file = os.path.join(TEST_DIRS.tests_data_dir, "filter_probs.csv") + out_file = os.path.join(tmp_path, 'results.csv') + + pipe = LinearPipeline(config) + pipe.set_source(FileSourceStage(config, filename=input_file, iterative=False)) + pipe.add_stage(DeserializeStage(config)) + pipe.add_stage(ConvMsg(config, input_file)) + pipe.add_stage(AddClassificationsStage(config)) + pipe.add_stage(SerializeStage(config, include=["^{}$".format(c) for c in config.class_labels])) + pipe.add_stage(WriteToFileStage(config, filename=out_file, overwrite=False)) + + return pipe + + +def test_call_before_run(viz_pipeline: Pipeline, tmp_path): + + # Test is necessary to ensure run() is called first. See issue #230 + viz_file = os.path.join(tmp_path, 'pipeline.png') + + with pytest.raises(RuntimeError): + + viz_pipeline.visualize(viz_file, rankdir="LR") + + +def test_png(viz_pipeline: Pipeline, tmp_path): + + viz_file = os.path.join(tmp_path, 'pipeline.png') + + # Call pipeline run first + viz_pipeline.run() + + viz_pipeline.visualize(viz_file, rankdir="LR") + + # Verify that the output file exists and is a valid png file + assert os.path.exists(viz_file) + assert imghdr.what(viz_file) == 'png' From f468c0129bce588af13cfe23d580eff0802f1bf5 Mon Sep 17 00:00:00 2001 From: bsuryadevara Date: Tue, 28 Jun 2022 19:00:51 -0500 Subject: [PATCH 62/73] Revert ransomware feature config changes (#234) Reverted ransomware feature config changes as dask is overriding config values. Authors: - https://github.com/bsuryadevara - https://github.com/bsuryadev Approvers: - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/234 --- examples/ransomware_detection/common/data_models.py | 1 - .../ransomware_detection/common/feature_extractor.py | 9 +++++---- examples/ransomware_detection/stages/create_features.py | 7 +++---- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/examples/ransomware_detection/common/data_models.py b/examples/ransomware_detection/common/data_models.py index 559ee50622..f3216b8070 100644 --- a/examples/ransomware_detection/common/data_models.py +++ b/examples/ransomware_detection/common/data_models.py @@ -26,7 +26,6 @@ class FeatureConfig: file_extns: typing.List[str] interested_plugins: typing.List[str] - features_with_zeros: typing.Dict[str, int] @dataclasses.dataclass diff --git a/examples/ransomware_detection/common/feature_extractor.py b/examples/ransomware_detection/common/feature_extractor.py index a8a810a0c4..4eef05cd89 100644 --- a/examples/ransomware_detection/common/feature_extractor.py +++ b/examples/ransomware_detection/common/feature_extractor.py @@ -519,7 +519,7 @@ def _extract_ldrmodules(self, x: pd.DataFrame): else: self._features['ldrmodules_df_path'] = "" - def extract_features(self, x: pd.DataFrame) -> pd.DataFrame: + def extract_features(self, x: pd.DataFrame, feas_all_zeros: typing.Dict[str, int]) -> pd.DataFrame: """ This function extracts all different ransomware features. @@ -527,7 +527,8 @@ def extract_features(self, x: pd.DataFrame) -> pd.DataFrame: ---------- x : `pandas.DataFrame` Dataframe with appshield snapshot data. - + feas_all_zeros : typing.Dict[str, int] + Features with default value (0) Returns ------- pandas.DataFrame @@ -545,8 +546,8 @@ def extract_features(self, x: pd.DataFrame) -> pd.DataFrame: # Filter plugin per pid_process and create features for pid_process in pid_processes: - # Setting default values to features all keys. - self._features = self._config.features_with_zeros.copy() + # Setting default value '0' to all features. + self._features = feas_all_zeros.copy() fltr_plugin_dict = self._filter_by_pid_process(plugin_dict, pid_process) diff --git a/examples/ransomware_detection/stages/create_features.py b/examples/ransomware_detection/stages/create_features.py index 4c52ba22ab..92d1682573 100644 --- a/examples/ransomware_detection/stages/create_features.py +++ b/examples/ransomware_detection/stages/create_features.py @@ -59,10 +59,9 @@ def __init__( threads_per_worker: int = 2, ): self._client = Client(threads_per_worker=threads_per_worker, n_workers=n_workers) + self._feature_config = FeatureConfig(file_extns, interested_plugins) + self._feas_all_zeros = dict.fromkeys(feature_columns, 0) - self._feature_config = FeatureConfig(file_extns, - interested_plugins, - features_with_zeros=dict.fromkeys(feature_columns, 0)) # FeatureExtractor instance to extract features from the snapshots. self._fe = FeatureExtractor(self._feature_config) @@ -112,7 +111,7 @@ def on_next(x: AppShieldMessageMeta): combine_func = FeatureExtractor.combine_features # Schedule dask task `extract_features` per snapshot. - snapshot_fea_dfs = self._client.map(extract_func, all_dfs, config=self._feature_config) + snapshot_fea_dfs = self._client.map(extract_func, all_dfs, feas_all_zeros=self._feas_all_zeros) # Combined `extract_features` results. features_df = self._client.submit(combine_func, snapshot_fea_dfs) From 768490889d220f347af329799d0f128bebf0cf5d Mon Sep 17 00:00:00 2001 From: Michael Demoret <42954918+mdemoret-nv@users.noreply.github.com> Date: Tue, 28 Jun 2022 21:55:07 -0600 Subject: [PATCH 63/73] Add CLI Relative Path Fallback (#232) In PR #130 we moved the `data` directory into `morpheus/data` and installed it with the python package. This required changing some of the default CLI arguments from relative paths like `data/labels_nlp.txt` to absolute paths like `morpheus.DATA_DIR/labels_nlp.txt`. To make it easy for the user to see how to change the labels file, we respecified the default argument value in documentation (i.e. `--labels_file=data/labels_nlp.txt`). Now that this needs to be an absolute path, the command in the documentation does not work. Adding absolute paths in the documentation is not feasible since this would require very long paths that would change from machine to machine. Instead, if the user specifies a data file with a relative path, we first check to see if a file exists relative to the current working directory. If it doesnt exist, then we check for a relative file to the current morpheus install. This allows commands from the documentation like: `morpheus run pipeline-nlp --labels_file=data/labels_nlp.txt` to find the correct path. We only choose the fallback value when no other file is found. Related to PR #200 Authors: - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - David Gardner (https://github.com/dagardner-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/232 --- morpheus/cli.py | 76 +++++++++++++++++++---- tests/test_cli.py | 151 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 216 insertions(+), 11 deletions(-) diff --git a/morpheus/cli.py b/morpheus/cli.py index 027f274f7c..9ead0d6d4c 100644 --- a/morpheus/cli.py +++ b/morpheus/cli.py @@ -14,6 +14,7 @@ import logging import os +import typing import warnings from functools import update_wrapper @@ -73,6 +74,48 @@ def get_command(self, ctx, cmd_name): return super().get_command(ctx, cmd_name) +class MorpheusRelativePath(click.Path): + """ + A specialization of the `click.Path` class that falls back to using package relative paths if the file cannot be + found. Takes the exact same parameters as `click.Path` + """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Append "data" to the name so it can be different than normal click.Path + self.name = "data " + self.name + + def convert(self, + value: typing.Any, + param: typing.Optional["click.Parameter"], + ctx: typing.Optional["click.Context"]) -> typing.Any: + + # First check if the path is relative + if (not os.path.isabs(value)): + + # See if the file exists. + does_exist = os.path.exists(value) + + if (not does_exist): + # If it doesnt exist, then try to make it relative to the morpheus library root + morpheus_root = os.path.dirname(morpheus.__file__) + + value_abs_to_root = os.path.join(morpheus_root, value) + + # If the file relative to our package exists, use that instead + if (os.path.exists(value_abs_to_root)): + logger.debug(("Parameter, '%s', with relative path, '%s', does not exist. " + "Using package relative location: '%s'"), + param.name, + value, + value_abs_to_root) + + return super().convert(value_abs_to_root, param, ctx) + + return super().convert(value, param, ctx) + + def _without_empty_args(passed_args): return {k: v for k, v in passed_args.items() if v is not None} @@ -312,6 +355,17 @@ def run(ctx: click.Context, **kwargs): pass +def validate_rolls(ctx, param, value): + if isinstance(value, tuple): + return value + + try: + rolls, _, dice = value.partition("d") + return int(dice), int(rolls) + except ValueError: + raise click.BadParameter("format must be 'NdM'") + + @click.group(chain=True, short_help="Run the inference pipeline with a NLP model", no_args_is_help=True, @@ -325,8 +379,8 @@ def run(ctx: click.Context, **kwargs): "do_truncate == False, there will be multiple returned sequences containing the " "overflowing token-ids. Default value is 256")) @click.option('--labels_file', - default=os.path.join(morpheus.DATA_DIR, "labels_nlp.txt"), - type=click.Path(dir_okay=False, exists=True, file_okay=True), + default="data/labels_nlp.txt", + type=MorpheusRelativePath(dir_okay=False, exists=True, file_okay=True, resolve_path=True), help=("Specifies a file to read labels from in order to convert class IDs into labels. " "A label file is a simple text file where each line corresponds to a label")) @click.option('--viz_file', @@ -382,13 +436,13 @@ def pipeline_nlp(ctx: click.Context, **kwargs): help="Number of features trained in the model") @click.option('--labels_file', default=None, - type=click.Path(dir_okay=False, exists=True, file_okay=True), + type=MorpheusRelativePath(dir_okay=False, exists=True, file_okay=True, resolve_path=True), help=("Specifies a file to read labels from in order to convert class IDs into labels. " "A label file is a simple text file where each line corresponds to a label. " "If unspecified, only a single output label is created for FIL")) @click.option('--columns_file', - default=os.path.join(morpheus.DATA_DIR, "columns_fil.txt"), - type=click.Path(dir_okay=False, exists=True, file_okay=True), + default="data/columns_fil.txt", + type=MorpheusRelativePath(dir_okay=False, exists=True, file_okay=True, resolve_path=True), help=("Specifies a file to read column features.")) @click.option('--viz_file', default=None, @@ -450,12 +504,12 @@ def pipeline_fil(ctx: click.Context, **kwargs): cls=AliasedGroup, **command_kwargs) @click.option('--columns_file', - default=os.path.join(morpheus.DATA_DIR, "columns_ae.txt"), - type=click.Path(dir_okay=False, exists=True, file_okay=True), + default="data/columns_ae.txt", + type=MorpheusRelativePath(dir_okay=False, exists=True, file_okay=True, resolve_path=True), help=("")) @click.option('--labels_file', default=None, - type=click.Path(dir_okay=False, exists=True, file_okay=True), + type=MorpheusRelativePath(dir_okay=False, exists=True, file_okay=True, resolve_path=True), help=("Specifies a file to read labels from in order to convert class IDs into labels. " "A label file is a simple text file where each line corresponds to a label. " "If unspecified, only a single output label is created for FIL")) @@ -840,11 +894,11 @@ def train_ae(ctx: click.Context, **kwargs): @click.command(name="preprocess", short_help="Convert messages to tokens", **command_kwargs) @click.option('--vocab_hash_file', - default=os.path.join(morpheus.DATA_DIR, "bert-base-cased-hash.txt"), - type=click.Path(exists=True, dir_okay=False), + default="data/bert-base-cased-hash.txt", + type=MorpheusRelativePath(exists=True, dir_okay=False, resolve_path=True), help=("Path to hash file containing vocabulary of words with token-ids. " "This can be created from the raw vocabulary using the cudf.utils.hash_vocab_utils.hash_vocab " - "function. Default value is 'data/bert-base-cased-hash.txt'")) + "function.")) @click.option('--truncation', default=False, type=bool, diff --git a/tests/test_cli.py b/tests/test_cli.py index 6545e4cd08..2873de6eb9 100755 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -15,6 +15,7 @@ # limitations under the License. import os +import shutil import click import mlflow @@ -22,7 +23,9 @@ from click.testing import CliRunner from mlflow.tracking import fluent +import morpheus from morpheus import cli +from morpheus.config import Config from morpheus.config import ConfigAutoEncoder from morpheus.config import CppConfig from morpheus.config import PipelineModes @@ -790,3 +793,151 @@ def test_pipeline_nlp_relative_paths(self, config, callback_values, tmp_path): [file_source, deserialize, process_nlp, triton_inf, monitor, add_class, validation, serialize, to_file] = stages assert process_nlp._vocab_hash_file == vocab_file_name + + @pytest.mark.usefixtures("chdir_tmpdir") + @pytest.mark.replace_callback('pipeline_nlp') + def test_pipeline_nlp_relative_path_precedence(self, config, callback_values, tmp_path): + """ + Ensure that relative paths are choosen over the morpheus data directory paths + """ + + morpheus_root = os.path.dirname(morpheus.__file__) + + vocab_file = "data/bert-base-cased-hash.txt" + labels_file = "data/labels_nlp.txt" + + vocab_file_local = os.path.join(tmp_path, vocab_file) + labels_file_local = os.path.join(tmp_path, labels_file) + + shutil.copytree(os.path.join(morpheus_root, "data"), os.path.join(tmp_path, "data"), dirs_exist_ok=True) + + # Use different labels + test_labels = ["label1", "label2", "label3"] + + # Overwrite the copied labels + with open(labels_file_local, mode="w") as f: + f.writelines("\n".join(test_labels)) + + args = (GENERAL_ARGS + ['pipeline-nlp', f"--labels_file={labels_file}"] + FILE_SRC_ARGS + + ['deserialize', 'preprocess', f"--vocab_hash_file={vocab_file}"] + INF_TRITON_ARGS + MONITOR_ARGS + + ['add-class'] + VALIDATE_ARGS + ['serialize'] + TO_FILE_ARGS) + + obj = {} + runner = CliRunner() + result = runner.invoke(cli.cli, args, obj=obj) + assert result.exit_code == 47, result.output + + # Ensure our config is populated correctly + config = obj["config"] + assert config.class_labels == test_labels + + stages = callback_values['stages'] + # Verify the stages are as we expect them, if there is a size-mismatch python will raise a Value error + [file_source, deserialize, process_nlp, triton_inf, monitor, add_class, validation, serialize, to_file] = stages + + assert process_nlp._vocab_hash_file == vocab_file_local + + @pytest.mark.usefixtures("chdir_tmpdir") + @pytest.mark.replace_callback('pipeline_fil') + def test_pipeline_fil_relative_path_precedence(self, config: Config, callback_values, tmp_path): + """ + Ensure that relative paths are choosen over the morpheus data directory paths + """ + + labels_file = "data/labels_fil.txt" + columns_file = "data/columns_fil.txt" + + labels_file_local = os.path.join(tmp_path, labels_file) + columns_file_local = os.path.join(tmp_path, columns_file) + + os.makedirs(os.path.join(tmp_path, "data"), exist_ok=True) + + # Use different labels + test_labels = ["label1"] + + # Overwrite the copied labels + with open(labels_file_local, mode="w") as f: + f.writelines("\n".join(test_labels)) + + # Use different labels + test_columns = [f"column{i}" for i in range(29)] + + # Overwrite the copied labels + with open(columns_file_local, mode="w") as f: + f.writelines("\n".join(test_columns)) + + args = (GENERAL_ARGS + ['pipeline-fil', f"--labels_file={labels_file}", f"--columns_file={columns_file}"] + + FILE_SRC_ARGS + ['deserialize', 'preprocess'] + INF_TRITON_ARGS + MONITOR_ARGS + ['add-class'] + + VALIDATE_ARGS + ['serialize'] + TO_FILE_ARGS) + + obj = {} + runner = CliRunner() + result = runner.invoke(cli.cli, args, obj=obj) + assert result.exit_code == 47, result.output + + # Ensure our config is populated correctly + config = obj["config"] + assert config.class_labels == test_labels + + assert config.fil.feature_columns == test_columns + + @pytest.mark.usefixtures("chdir_tmpdir") + @pytest.mark.replace_callback('pipeline_ae') + def test_pipeline_ae_relative_path_precedence(self, config: Config, callback_values, tmp_path): + """ + Ensure that relative paths are choosen over the morpheus data directory paths + """ + + labels_file = "data/labels_ae.txt" + columns_file = "data/columns_ae.txt" + + labels_file_local = os.path.join(tmp_path, labels_file) + columns_file_local = os.path.join(tmp_path, columns_file) + + os.makedirs(os.path.join(tmp_path, "data"), exist_ok=True) + + # Use different labels + test_labels = ["label1"] + + # Overwrite the copied labels + with open(labels_file_local, mode="w") as f: + f.writelines("\n".join(test_labels)) + + # Use different labels + test_columns = [f"column{i}" for i in range(33)] + + # Overwrite the copied labels + with open(columns_file_local, mode="w") as f: + f.writelines("\n".join(test_columns)) + + args = (GENERAL_ARGS + [ + 'pipeline-ae', + '--userid_filter=user321', + '--userid_column_name=user_col', + f"--labels_file={labels_file}", + f"--columns_file={columns_file}", + 'from-cloudtrail', + '--input_glob=input_glob*.csv', + 'train-ae', + '--train_data_glob=train_glob*.csv', + '--seed', + '47', + 'preprocess', + 'inf-pytorch', + 'add-scores', + 'timeseries', + '--resolution=1m', + '--zscore_threshold=8.0', + '--hot_start' + ] + MONITOR_ARGS + VALIDATE_ARGS + ['serialize'] + TO_FILE_ARGS) + + obj = {} + runner = CliRunner() + result = runner.invoke(cli.cli, args, obj=obj) + assert result.exit_code == 47, result.output + + # Ensure our config is populated correctly + config = obj["config"] + assert config.class_labels == test_labels + + assert config.ae.feature_columns == test_columns From 35f01d3fc4f7523c9a231963ce1ba46f1b82d0f4 Mon Sep 17 00:00:00 2001 From: bsuryadevara Date: Wed, 29 Jun 2022 11:45:48 -0500 Subject: [PATCH 64/73] Missing 'supports_cpp_node' impl function (#239) Added missing abstract implementation function to `log_parsing` example preproc and postproc stages. Authors: - https://github.com/bsuryadevara - https://github.com/bsuryadev Approvers: - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/239 --- examples/log_parsing/postprocessing.py | 3 +++ examples/log_parsing/preprocessing.py | 3 +++ 2 files changed, 6 insertions(+) diff --git a/examples/log_parsing/postprocessing.py b/examples/log_parsing/postprocessing.py index cc47a60942..7f7fb10cd1 100644 --- a/examples/log_parsing/postprocessing.py +++ b/examples/log_parsing/postprocessing.py @@ -50,6 +50,9 @@ def __init__(self, c: Config, vocab_path: str, model_config_path: str): def name(self) -> str: return "logparsing-postproc" + def supports_cpp_node(self): + return False + def accepted_types(self) -> typing.Tuple: return (MultiResponseLogParsingMessage, ) diff --git a/examples/log_parsing/preprocessing.py b/examples/log_parsing/preprocessing.py index 0b8f4af3b0..ec9908aa7f 100644 --- a/examples/log_parsing/preprocessing.py +++ b/examples/log_parsing/preprocessing.py @@ -83,6 +83,9 @@ def __init__(self, def name(self) -> str: return "preprocess-logparsing" + def supports_cpp_node(self): + return False + @staticmethod def pre_process_batch(x: MultiMessage, vocab_hash_file: str, From 4906d5efbcc467d8d031e1c8099958414b89f024 Mon Sep 17 00:00:00 2001 From: David Gardner <96306125+dagardner-nv@users.noreply.github.com> Date: Wed, 29 Jun 2022 22:08:08 -0700 Subject: [PATCH 65/73] Pin cuda-python to 11.7.0 (#246) Authors: - David Gardner (https://github.com/dagardner-nv) Approvers: - Michael Demoret (https://github.com/mdemoret-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/246 --- docker/conda/environments/cuda11.5_dev.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/conda/environments/cuda11.5_dev.yml b/docker/conda/environments/cuda11.5_dev.yml index f915c4f747..26ee4077fb 100644 --- a/docker/conda/environments/cuda11.5_dev.yml +++ b/docker/conda/environments/cuda11.5_dev.yml @@ -29,6 +29,7 @@ dependencies: - ccache>=3.7 - cmake=3.22 - cuda-nvml-dev=11.5 + - cuda-python<=11.7.0 # 11.7.1 Breaks the cuda bindings - cudatoolkit=11.5 - cudf 22.06 - cudf_kafka 22.06.* From ac015d08c1bc6a412d8c15ae91ce2b585311f660 Mon Sep 17 00:00:00 2001 From: Michael Demoret <42954918+mdemoret-nv@users.noreply.github.com> Date: Wed, 29 Jun 2022 23:31:04 -0600 Subject: [PATCH 66/73] Move Morpheus Data Files Out of LFS (#242) * Testing why LFS isnt working * Removing the morpheus/data files from git LFS * Removing tensorrt * Removing duplicate conda requriements * Adding git=2.35.2 and git-lfs to the ci dependencies to fix an issue with the build * Trying to use fetchinclude still * Trying to pin cuda-python to <=11.7.0 * Go back to exclude * Override exclude Co-authored-by: David Gardner --- .gitattributes | 1 - .lfsconfig | 2 +- ci/conda/recipes/morpheus/meta.yaml | 6 +- ci/scripts/jenkins/test.sh | 14 +- docker/Dockerfile | 4 +- docker/conda/environments/cuda11.5_ci.yml | 2 + docker/conda/environments/cuda11.5_dev.yml | 2 +- docker/run_container_dev.sh | 2 +- docker/run_container_release.sh | 2 +- morpheus/data/bert-base-cased-hash.txt | 36255 +++++++++++++++++- morpheus/data/bert-base-uncased-hash.txt | 38162 ++++++++++++++++++- morpheus/data/columns_ae.txt | 36 +- morpheus/data/columns_fil.txt | 32 +- morpheus/data/labels_ae.txt | 4 +- morpheus/data/labels_nlp.txt | 13 +- morpheus/data/labels_phishing.txt | 5 +- scripts/fetch_data.py | 2 +- 17 files changed, 74514 insertions(+), 30 deletions(-) diff --git a/.gitattributes b/.gitattributes index a84a297a6b..4d22373a5b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1,4 @@ examples/data/** filter=lfs diff=lfs merge=lfs -text morpheus/_version.py export-subst -morpheus/data/* filter=lfs diff=lfs merge=lfs -text tests/mock_triton_server/payloads/** filter=lfs diff=lfs merge=lfs -text tests/tests_data/** filter=lfs diff=lfs merge=lfs -text diff --git a/.lfsconfig b/.lfsconfig index 9fdb0464ae..2cf1bce1b1 100644 --- a/.lfsconfig +++ b/.lfsconfig @@ -1,2 +1,2 @@ [lfs] - fetchinclude = morpheus/data/* + fetchexclude = * diff --git a/ci/conda/recipes/morpheus/meta.yaml b/ci/conda/recipes/morpheus/meta.yaml index df763bdbb9..b870c7693f 100644 --- a/ci/conda/recipes/morpheus/meta.yaml +++ b/ci/conda/recipes/morpheus/meta.yaml @@ -86,15 +86,19 @@ outputs: - pytest-cov - pytest-benchmark source_files: + # - .git/* + - docker/conda/environments/* - pyproject.toml + - scripts/fetch_data.py - tests/* - - docker/conda/environments/* imports: - morpheus - morpheus._lib commands: # Install dependencies that are pip-only - mamba env update --prefix ${CONDA_PREFIX} --file docker/conda/environments/cuda{{ cuda_version }}_runtime.yml + # Ensure the test data is downloaded + - ./scripts/fetch_data.py fetch tests # Run pytest - pytest diff --git a/ci/scripts/jenkins/test.sh b/ci/scripts/jenkins/test.sh index d0647a58f5..a5fbdac5cd 100755 --- a/ci/scripts/jenkins/test.sh +++ b/ci/scripts/jenkins/test.sh @@ -19,14 +19,22 @@ set -e source ${WORKSPACE}/ci/scripts/jenkins/common.sh /usr/bin/nvidia-smi +# Restore the environment and then ensure we have the CI dependencies restore_conda_env + +gpuci_logger "Installing CI dependencies" +mamba env update -q -n morpheus -f ${MORPHEUS_ROOT}/docker/conda/environments/cuda${CUDA_VER}_ci.yml + +# Install the built Morpheus python package pip install ${MORPHEUS_ROOT}/build/wheel CPP_TESTS=($(find ${MORPHEUS_ROOT}/build/wheel -name "*.x")) gpuci_logger "Installing test dependencies" npm install --silent -g camouflage-server -mamba install -q -y -c conda-forge "git-lfs=3.1.4" + +# Before running any .git commands, set this as a safe directory +git config --global --add safe.directory ${MORPHEUS_ROOT} gpuci_logger "Pulling LFS assets" cd ${MORPHEUS_ROOT} @@ -34,6 +42,10 @@ cd ${MORPHEUS_ROOT} git lfs install ${MORPHEUS_ROOT}/scripts/fetch_data.py fetch tests validation +# List missing files +gpuci_logger "Listing missing files" +git lfs ls-files + REPORTS_DIR="${WORKSPACE_TMP}/reports" mkdir -p ${WORKSPACE_TMP}/reports diff --git a/docker/Dockerfile b/docker/Dockerfile index fe771296ed..474f3f0761 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -61,7 +61,9 @@ RUN conda config --set ssl_verify false &&\ conda config --add pkgs_dirs /opt/conda/pkgs &&\ conda config --env --add channels conda-forge &&\ # Install mamba, boa and git here. Conda build breaks with other git installs - /opt/conda/bin/conda install -y -n base -c conda-forge "mamba >=0.22" "boa >=0.10" "git >=2.35.3" python=${PYTHON_VER} + /opt/conda/bin/conda install -y -n base -c conda-forge "mamba >=0.22" "boa >=0.10" "git >=2.35.3" "git-lfs" "python=${PYTHON_VER}" &&\ + source activate base &&\ + git lfs install # conda clean -afy # ============ Stage: conda_env ============ diff --git a/docker/conda/environments/cuda11.5_ci.yml b/docker/conda/environments/cuda11.5_ci.yml index 4d33145954..4dede667c8 100644 --- a/docker/conda/environments/cuda11.5_ci.yml +++ b/docker/conda/environments/cuda11.5_ci.yml @@ -20,5 +20,7 @@ channels: dependencies: - bash=5.1.16 # bash >=4.4 is necessary for morpheus cli auto-complete tests to pass. - conda-pack=0.7 + - git-lfs=3.2 + - git>=2.35.3 # Needed for wildcards on safe.directory - pkg-config=0.29 - sccache=0.3 diff --git a/docker/conda/environments/cuda11.5_dev.yml b/docker/conda/environments/cuda11.5_dev.yml index 26ee4077fb..3a640f79c8 100644 --- a/docker/conda/environments/cuda11.5_dev.yml +++ b/docker/conda/environments/cuda11.5_dev.yml @@ -51,7 +51,6 @@ dependencies: - isort - mlflow>=1.23 - myst-parser==0.17 - - srf 22.06.* - ninja=1.10 - nodejs=17.4.0 - pandas=1.3 @@ -69,6 +68,7 @@ dependencies: - scikit-build=0.13 - sphinx - sphinx_rtd_theme + - srf 22.06.* - sysroot_linux-64=2.17 - tqdm - yapf=0.32.0 diff --git a/docker/run_container_dev.sh b/docker/run_container_dev.sh index d85d102d62..37c3deeed9 100755 --- a/docker/run_container_dev.sh +++ b/docker/run_container_dev.sh @@ -28,7 +28,7 @@ DOCKER_IMAGE_NAME=${DOCKER_IMAGE_NAME:-"morpheus"} DOCKER_IMAGE_TAG=${DOCKER_IMAGE_TAG:-"dev-$(date +'%y%m%d')"} DOCKER_EXTRA_ARGS=${DOCKER_EXTRA_ARGS:-""} -DOCKER_ARGS="--env WORKSPACE_VOLUME=${PWD} -v $PWD:/workspace --net=host --gpus=all" +DOCKER_ARGS="--env WORKSPACE_VOLUME=${PWD} -v $PWD:/workspace --net=host --gpus=all --cap-add=sys_nice" if [[ -z "${SSH_AUTH_SOCK}" ]]; then echo -e "${y}No ssh-agent auth socket found. Dependencies in private git repos may fail during build.${x}" diff --git a/docker/run_container_release.sh b/docker/run_container_release.sh index 28cfd47daf..064fcb4286 100755 --- a/docker/run_container_release.sh +++ b/docker/run_container_release.sh @@ -27,7 +27,7 @@ DOCKER_IMAGE_NAME=${DOCKER_IMAGE_NAME:-"nvcr.io/nvidia/morpheus/morpheus"} DOCKER_IMAGE_TAG=${DOCKER_IMAGE_TAG:-"$(git describe --tags --abbrev=0)-runtime"} DOCKER_EXTRA_ARGS=${DOCKER_EXTRA_ARGS:-""} -DOCKER_ARGS="--env WORKSPACE_VOLUME=${PWD} -v $PWD/models:/workspace/models --net=host --gpus=all ${DOCKER_EXTRA_ARGS}" +DOCKER_ARGS="--env WORKSPACE_VOLUME=${PWD} -v $PWD/models:/workspace/models --net=host --gpus=all --cap-add=sys_nice ${DOCKER_EXTRA_ARGS}" if [[ -z "${SSH_AUTH_SOCK}" ]]; then echo -e "${y}No ssh-agent auth socket found. Dependencies in private git repos may fail during build.${x}" diff --git a/morpheus/data/bert-base-cased-hash.txt b/morpheus/data/bert-base-cased-hash.txt index 0bf02a7116..74383ab02b 100644 --- a/morpheus/data/bert-base-cased-hash.txt +++ b/morpheus/data/bert-base-cased-hash.txt @@ -1,3 +1,36252 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa228593db3f947d342f85e234ff939b5c141b3c4a4956359697a14b40cba081 -size 755468 +26899 +27424 +7249 +6426333292330182147 0 +14159173388090933765 3 +11930146357005610500 8 +17023746484075123204 12 +1463383045292856836 16 +3747468227414883846 20 +10139212938083835394 26 +13550185356595693063 28 +6300358075292171779 35 +3184543689580575236 38 +8300629869194307076 42 +1955210460243431427 46 +5285084442155023875 49 +15214496033313438727 52 +17677075147439207428 59 +4718839199248433155 63 +14805043067287129090 66 +1911143973647033349 68 +7555414680266554886 73 +16276469895617144324 79 +17515572206025135621 83 +6385623011311864325 88 +16900348615123727876 93 +6095660061552222722 97 +3493786879443812355 99 +12771649685418296837 102 +906165374248866819 107 +5836092659990946310 110 +18377414507293993478 116 +9955482536503442434 122 +12461406033440066052 124 +10784672185103672326 128 +11098636715227170307 134 +4805485371630374919 137 +1041161126836283908 144 +8586489453051286533 148 +9311473995304820225 153 +1509104826072126979 154 +12777780900871815686 157 +12015445961309659139 163 +2757796965723158024 166 +1306609735592145926 174 +6456052939146142724 180 +3454504831122279941 184 +6878636367368452100 189 +18319457514850241029 193 +4667739140302370310 198 +10223828742920455174 204 +15821016971606518787 210 +9350991728109787651 213 +5750889974436263431 216 +10880288493154587141 223 +6506400408385810949 228 +13098284818894851588 233 +464934029404990467 237 +6274967961684005893 240 +15011134756846332932 245 +15551192014010130952 249 +8196030292452405249 257 +9753631919997264389 258 +12082811732716666882 263 +2611919275768019460 265 +17314043594640121859 269 +2826537824812305412 272 +16673619628986890760 276 +1764503029213581316 284 +5428257756289776134 288 +14778104774108937735 294 +10245194172482059785 301 +13048008945871032330 310 +10281460529617096709 320 +9780420726683594755 325 +12623699206798036483 328 +6494884332084276232 331 +15520112078772876290 339 +10647934407960542724 341 +5505071818768463878 345 +13990114873071304707 351 +2964301380772385284 354 +12897099874258713606 358 +17070907028245359619 364 +1210609262537690120 367 +705987002107928578 375 +16244378149451097606 377 +6026242492439952904 383 +11498214766485567492 391 +7273193173602153476 395 +10165914428321621505 399 +5618783471230949892 400 +13525621248005395970 404 +5738949464799352840 406 +15903624885097325577 414 +9033719318909386245 423 +4749708611770152963 428 +3023413202915201029 431 +6287327360031715842 436 +1597533570897886210 438 +3626123424978493443 440 +3408021931889651206 443 +483489606298950148 449 +3791567825149942275 453 +12587002978411059201 456 +4094031845512199685 457 +1306765856133109764 462 +1962660413435590146 466 +2428774506176537602 468 +13252953914496718853 470 +4121252682437242887 475 +1728603839892110852 482 +7155150492123212295 486 +14541308233332089857 493 +14846100822208407042 494 +17684310590225092612 496 +15323283140610710533 500 +5037976711863811075 505 +985341211181116421 508 +14603009533976473603 513 +16993128736078286340 516 +5783323743216932867 520 +1611670813010457610 523 +11343516496597481986 533 +6966731074369445894 535 +4524960165353430533 541 +2550987855877078018 546 +2506360895445367301 548 +14153142660757617667 553 +0 556 +17791036822935798788 556 +6925225014334580227 560 +10407961608267994626 563 +13633531931094874114 565 +16815245202181925380 567 +5258745380082766342 571 +12011291451617425926 577 +9636053199006681091 583 +727929247960777220 586 +7117727564329652741 590 +2737453532062755333 595 +0 600 +12376733448436544517 600 +7304029591763240451 605 +13788264033484188674 608 +15695117968923374597 610 +14916689018091111429 615 +17712421699819679750 620 +11244655462014542340 626 +558664455376558598 630 +9627723654262063110 636 +2069388890524985348 642 +11958437143660911108 646 +16716092534907663363 650 +11248726184299496451 653 +18008378090558150150 656 +1232905200495278083 662 +14556039753602233861 665 +12490549419210112003 670 +7570951270334149122 673 +4242316109322979334 675 +10028568668399206401 681 +15806189556696408581 682 +11453702452611310597 687 +16966620563014836228 692 +13444405044735874052 696 +344572103643217925 700 +13319765370655298563 705 +1925261439955404291 708 +12411512070563450885 711 +8413248403755250691 716 +4113375899020967427 719 +10238297791898645505 722 +9422652845239399429 723 +17430950367072156676 728 +17645998338011454466 732 +17038025885131095042 734 +4350089510007296005 736 +4684644445959447041 741 +16852196816903633923 742 +12412076410566473732 745 +229694072213088771 749 +5728176925693681668 752 +8836425946264293890 756 +10771600206287325187 758 +14538406684429040644 761 +0 765 +0 765 +6795670963687376899 765 +17001648216928042500 768 +2817549538244629506 772 +12055784361442164230 774 +1138095781720119300 780 +7675939519776646147 784 +15586108521605556229 787 +8241329451716995077 792 +7176774503550155269 797 +15885241231209489414 802 +14287585657926908933 808 +102297504848399364 813 +6871690962116779522 817 +7361321810739645955 819 +15620245878728904709 822 +18039444205286915 827 +8146946946326977033 830 +747880705052369411 839 +7034349621304829955 842 +4382563933267568645 845 +1129010232746233863 850 +15351341679939503106 857 +17290738267438047236 859 +4213069926222231043 863 +14062187236598933509 866 +7353744634042927108 871 +8741947409497572870 875 +6249911107455221255 881 +15768183846464501249 888 +18402222685660042756 889 +1238084758719643654 893 +13278836895159008265 899 +10421525818998680068 908 +8766757360920397829 912 +15583652182415581698 917 +686083037273571334 919 +10921338025144058885 925 +2550052083771555843 930 +15442277849212882436 933 +5901669753496873989 937 +5599608108154684932 942 +2824903990792868869 946 +8043782707491431429 951 +12617760369457217029 956 +12646509518097841672 961 +1384103042174482952 969 +5158962768530123266 977 +5516340608217038339 979 +9796950943705094659 982 +15350209530658671105 985 +511499293606343682 986 +4389162059392406017 988 +13499971127845927434 989 +0 999 +16154736499381992451 999 +41616189314142210 1002 +2535142050691551746 1004 +10540781191681404931 1006 +3220937376696672772 1009 +3609373675653430786 1013 +4263680928820668417 1015 +5275309592035181571 1016 +14360921703910194690 1019 +10489983568796279298 1021 +9563463757195637253 1023 +10628622235193735178 1028 +1661347253274813446 1038 +12791030827030631941 1044 +1751185393045687811 1049 +4537411189025756168 1052 +15038121761025135109 1060 +645558515617143297 1065 +17993047012002442758 1066 +2016046076376584710 1072 +6452065757650669574 1078 +14540794100821861889 1084 +16938215577336084483 1085 +12400271948800936452 1088 +10443390640743718919 1092 +10456846003398133251 1099 +12919944932614006276 1102 +18116861362218948611 1106 +14170057647781982210 1109 +13277812105658801159 1111 +9272001883768126985 1118 +2043633908128933380 1127 +11847695636823865859 1131 +18432820092306735618 1134 +6113231520934037511 1136 +17277086458158906885 1143 +17792335370285102083 1148 +15151647897101837315 1151 +2503409696623913986 1154 +12603224190549400584 1156 +7873955187567303172 1164 +7583155227506520578 1168 +8066272663683279361 1170 +10412419600896809987 1171 +14162491147761742853 1174 +5823293000835959810 1179 +15744314503622788097 1181 +1103936914771888644 1182 +14653225887495153667 1186 +14986882042980885508 1189 +16152442732959165956 1193 +18371165926136822276 1197 +3044634222610946563 1201 +13898890537863009795 1204 +4061512870512987652 1207 +2895901948413647366 1211 +749260804632562692 1217 +13565499906199649793 1221 +2993484925812128259 1222 +6283701204582228999 1225 +15036378874633344518 1232 +12451767259953937929 1238 +8012340377316603909 1247 +4719053031390059012 1252 +14430712698160791043 1256 +2757627166710815237 1259 +17045908089906438150 1264 +9794939645634237955 1270 +10951689481421216775 1273 +3270575299750905349 1280 +16948261273262275586 1285 +12661769290247388677 1287 +1756204080764887047 1292 +14646052990049187333 1299 +16589228095387886594 1304 +10057567800473414657 1306 +4020018155739468293 1307 +1051071748299192324 1312 +15954453438051617795 1316 +9250037760903790597 1319 +2617357346817172482 1324 +14458140156564460036 1326 +9258220503682652166 1330 +4338984086760293378 1336 +1701852378915214338 1338 +12559121088843158021 1340 +12180768457368693769 1345 +7257136655931194886 1354 +17326973304285086217 1360 +6936353740287888899 1369 +6792432150911768067 1372 +13261624057494912004 1375 +13065595741116251140 1379 +474851978465208835 1383 +15618851112604340227 1386 +0 1389 +9431734925030405130 1389 +14920417328130545666 1399 +17609384734705962497 1401 +3649956789726752772 1402 +321742374796773378 1406 +8066075484158643207 1408 +13758572884242114049 1415 +2124325094552856068 1416 +461827687269430786 1420 +15685559927026880513 1422 +1855711341102343171 1423 +6432773051187124742 1426 +8869810176376467974 1432 +16101738114708925955 1438 +5373054322768043014 1441 +15350117599251381252 1447 +15172069784324674051 1451 +6505455335105115654 1454 +17227290636569070083 1460 +10762877552863524870 1463 +188865761021926914 1469 +12355608051052064259 1471 +13399800679240869890 1474 +8855793298626290178 1476 +12154430640994595332 1478 +17578786395661211139 1482 +1316645148432803845 1485 +4876929961334621699 1490 +17556172442582357000 1493 +3630303433225635335 1501 +10903553388795329030 1508 +8884696260500157956 1514 +9488500588847084549 1518 +14596717090700754435 1523 +16351558113225126918 1526 +15738241079202289157 1532 +13815430566130503684 1537 +15889028819765158921 1541 +1037775479067529732 1550 +14056414264278932995 1554 +11844112989099629062 1557 +18020058445036810756 1563 +16100457414234641410 1567 +8481399952943458309 1569 +4968953102512390151 1574 +16776626439464893954 1581 +17229198784979479048 1583 +3170917758633476610 1591 +15854483231549015049 1593 +585287761717617667 1602 +3164628595333039108 1605 +18140005721639941125 1609 +11758747563243892740 1614 +2902901662138776069 1618 +13884443270117333506 1623 +10272097240317851137 1625 +13663545325344877062 1626 +11630522735022017029 1632 +6672697002821577222 1637 +15506376297837184005 1643 +2167951603404201475 1648 +6145644575778358788 1651 +11424208279613949955 1655 +10068545654673559045 1658 +7933286200368179205 1663 +4955260756402268163 1668 +15354999013411855878 1671 +14723013979351112707 1677 +4229666098637339651 1680 +13481813979953036806 1683 +5602611922658041867 1689 +11605275798038324740 1700 +11757744925160534019 1704 +8656671608797683206 1707 +10156048515242288136 1713 +677494227032061956 1721 +9125082167782384132 1725 +15950829101397318149 1729 +17916941030097373700 1734 +11057370064074320387 1738 +14730944822532857858 1741 +7232539601094902787 1743 +17549091829156738563 1746 +4258738691598693891 1749 +7914933167620933635 1752 +2693990201385277954 1755 +8110965034852982279 1757 +5002061195851980292 1764 +15686056040800883205 1768 +14812460453038620161 1773 +15155414036304136709 1774 +326984502075507717 1779 +6918818382679955972 1784 +4129919749465388038 1788 +16462312007734608387 1794 +12582259796717495300 1797 +8482951797835447301 1801 +7350529073458249221 1806 +6409820879126534151 1811 +8974722322108053510 1818 +11139504674834480644 1824 +10982452441052880390 1828 +11282284436809355781 1834 +14676527958212179970 1839 +4628372122931810308 1841 +2323952708132747778 1845 +18288128929152378369 1847 +9137533311582739458 1848 +13051886984951245826 1850 +3094202607174463491 1852 +17084259117134628358 1855 +10864808195750103556 1861 +9691479920486325765 1865 +16051570878929423877 1870 +14942335257028095492 1875 +15516395450672752643 1879 +4691893808465027588 1882 +4825023688931794946 1886 +591651247344864769 1888 +152251924711860227 1889 +10102564294591346181 1892 +1875462351514284548 1897 +10641915244480237572 1901 +18251833082638123010 1905 +8977616143752840198 1907 +7762088676497459714 1913 +18134382805680854531 1915 +4351166408471459844 1918 +0 1922 +11570788783081409029 1922 +16310943348466210822 1927 +1950682539364228098 1933 +14174450130758331394 1935 +12540558775932825094 1937 +4849181067837138946 1943 +15692140680093720066 1945 +1100089137168042500 1947 +6911002783362030085 1951 +8939306172691334151 1956 +4615943891371636740 1963 +4991663930526050313 1967 +12512060051627164165 1976 +9986663463050918403 1981 +849582699811990534 1984 +8870231678719442436 1990 +15410721210994656773 1994 +7575831461777645576 1999 +1760355052631757316 2007 +10396920047084554245 2011 +16965727441838753795 2016 +6564098124671811076 2019 +4754574663326107651 2023 +16443438937421763590 2026 +3736139770824927751 2032 +10189312089264694274 2039 +2608231651170701314 2041 +1618187431829715971 2043 +13964589655848614403 2046 +14711106173283854342 2049 +11018868817662299654 2055 +5788910885258662917 2061 +16854347242636947969 2066 +3792288030905357827 2067 +2040804437544309763 2070 +15318990424402253317 2073 +13159390566295367175 2078 +15520409893570056194 2085 +16922271936817263622 2087 +15106301346832417802 2093 +11569449047954110468 2103 +5406009700514186760 2107 +11165058811872798728 2115 +6019438930175447048 2123 +13056449596119601157 2131 +18026372663938511875 2136 +14299233528797568006 2139 +1623241918150725639 2145 +338611903777385990 2152 +15153337499253836805 2158 +11530593787854836227 2163 +2791545371428070914 2166 +18074662966011402242 2168 +102353566473860098 2170 +15161205015794311175 2172 +13561908083170274823 2179 +3243473901464747524 2186 +16360508913208342532 2190 +13116772131681526788 2194 +10595753749714895365 2198 +14329988434663134212 2203 +4436969913528429574 2207 +11254991232132897288 2213 +9974779987992215556 2221 +17530131783097877507 2225 +17835057174950058502 2228 +2194589912450167811 2234 +4047598369291716098 2237 +13800599313219949572 2239 +9768698864568413701 2243 +1193059019744404997 2248 +4836333712907456515 2253 +6286880162788310021 2256 +1144899980375976966 2261 +4130628035191581190 2267 +5600305704898857987 2273 +13824439852357587971 2276 +14827678551597577732 2279 +17290233475284407300 2283 +8257699152545607683 2287 +14466544619632754178 2290 +9152542077451422211 2292 +2631653449493830657 2295 +12991743670998815745 2296 +10830971026099525122 2297 +7695333360325946373 2299 +1324229004101004294 2304 +16757645521903355905 2310 +1131769746269742083 2311 +8650687424899161603 2314 +11935188736618878466 2317 +13186329971548500996 2319 +5440233700127942148 2323 +13466555439919609858 2327 +11364141341643190273 2329 +3152656931852233731 2330 +16496376325405678085 2333 +10895513708403542021 2338 +1234892860544900098 2343 +6960118589913716738 2345 +1289887021848992257 2347 +5339886967470400005 2348 +12188553884213102595 2353 +5835528522258251266 2356 +9578526502106339330 2358 +6901132897741236227 2360 +13219663883197070852 2363 +11271511322495267844 2367 +3243641385977152516 2371 +15071100194760318466 2375 +4527515658812804610 2377 +12362572575813834244 2379 +17704909475185412099 2383 +11873078016153959940 2386 +10603486924773645320 2390 +6433240370482672641 2398 +16022965237805657093 2399 +9289214872332584450 2404 +14673066295088608258 2406 +16376951822175981063 2408 +3190859133332019716 2415 +17236387672432709124 2419 +14699718912100317190 2423 +13937601556625970692 2429 +12038393848384345602 2433 +13749848150174031362 2435 +10359937927789704200 2437 +3814758407518984196 2445 +13927395576438001158 2449 +1939511713185142787 2455 +770110338122573831 2458 +0 2465 +5694928656541619716 2465 +16499275494188972035 2469 +16370974904800808962 2472 +1203041136722709511 2474 +13668382149081303043 2481 +11396682789488139777 2484 +5219908729599757313 2485 +7074865760823170564 2486 +10279294002750099461 2490 +13776557570696903171 2495 +15479140179415033350 2498 +15383688441488592901 2504 +4984649153634507268 2509 +13649680169043343364 2513 +1501587062950494722 2517 +14734218112647556099 2519 +5163019219778784770 2522 +2878380911109417476 2524 +10277776059235051010 2528 +5678245730504456706 2530 +15256203080779637762 2532 +6490408403662633989 2534 +4437392813089222658 2539 +3379213711590374914 2541 +2046972795103422978 2543 +2269153355487651845 2545 +10512277988476563459 2550 +15752288402474091526 2553 +1184330356851458566 2559 +18270244121999097859 2565 +10676522231862993413 2568 +3451029081713274884 2573 +12636192795989101569 2577 +7431464193316285955 2578 +9572794371208004098 2581 +332771022890949132 2583 +7337833529847383046 2595 +406959571780121091 2601 +11938271841198929411 2604 +6284439155477019652 2607 +3234318955360794115 2611 +4489356609889267719 2614 +17617658431113692170 2621 +13053688530141029893 2631 +8564618268796170757 2636 +6287439492967632899 2641 +3372781831999046149 2644 +17742274044699401219 2649 +6768850702216300549 2652 +4243651878201606149 2657 +14043732402243650051 2662 +5357874821604536324 2665 +15188169417933673475 2669 +2814807478188732419 2672 +9929328945242986501 2675 +6856183291586287622 2680 +10861201322579858945 2686 +9450808506212978690 2687 +7689973652510374913 2689 +14939115313062965253 2690 +3143144588842618375 2695 +709491934769324550 2702 +13345536110135221254 2708 +1211787982191358979 2714 +253545228641464323 2717 +17556570343058439170 2720 +1770922857365975043 2722 +3199891296683703298 2725 +695676800520161285 2727 +5453855249834556418 2732 +15069992440772123651 2734 +51870980753430534 2737 +12824988231002920963 2743 +18386328703308653570 2746 +4120997242229446147 2748 +8024528359738834947 2751 +13056682928240582150 2754 +3540889051785759746 2760 +10411560801290318340 2762 +11341100489571951618 2766 +8359875045211837444 2768 +10975470393556224516 2772 +1651086661371062273 2776 +17542875320536705540 2777 +8525482927322982918 2781 +2398803726914968579 2787 +9045573664097003013 2790 +17126101123797693956 2795 +17956674363057392137 2799 +9256946299137061890 2808 +3736241841892769284 2810 +4580396510350677509 2814 +15962522133195158532 2819 +17458464923831379974 2823 +14665227712463818757 2829 +16871556467936127493 2834 +9948336383948573186 2839 +4863773001307163137 2841 +17006879012472002053 2842 +7360509097370710018 2847 +17166983605697814533 2849 +11040571832541919753 2854 +17379951741614172674 2863 +7128676913500781570 2865 +3029986787306026505 2867 +11566828039492248067 2876 +2501652484105854980 2879 +0 2883 +7929022352408899076 2883 +4664613970831920133 2887 +15459916461375731714 2892 +9228019993897860613 2894 +10676229572337640963 2899 +6481867912814798340 2902 +4296396327816372227 2906 +14992044031117499908 2909 +12683528922867051010 2913 +2040873033013508609 2915 +7651393419294885896 2916 +7521517335316255750 2924 +3181803802886597124 2930 +7784078158300971010 2934 +15085350142790546948 2936 +6842036317915689988 2940 +13667923222529252355 2944 +3224689107719812098 2947 +4648325136694729730 2949 +6638081181140195331 2951 +992859360162491395 2954 +16816077552271718920 2957 +17673354941024363525 2965 +6317419225961869831 2970 +12789413559402655748 2977 +4581456376528149509 2981 +6921325244755327491 2986 +11611331539221398018 2989 +13747269320315203586 2991 +11587141599617415688 2993 +13263903661485335557 3001 +328625061817057284 3006 +16796344673634557957 3010 +5316152379061413893 3015 +9292953827422589442 3020 +6806453502912891397 3022 +13663158583348840451 3027 +14099389082448610310 3030 +11031358781273945605 3036 +15973117012050489862 3041 +7874660990265469956 3047 +9944282412671772167 3051 +14712210316765025797 3058 +8236098545193688579 3063 +10986568386764935172 3066 +5768490003937463812 3070 +14957560802875570181 3074 +14828569615759250436 3079 +12849360459158495749 3083 +13273433268457165828 3088 +17567479532132522500 3092 +4121877112237873670 3096 +10154992625952288777 3102 +3048370287134477826 3111 +7417277213295138817 3113 +6510844470787761667 3114 +9325157537692289538 3117 +5324073723845814280 3119 +2938977314283320322 3127 +14627711782979370501 3129 +9366550520871137285 3134 +2327755187155843593 3139 +6311959861460607489 3148 +4694460646129846275 3149 +8149291443892116995 3152 +14530371781397203972 3155 +17386494266240112133 3159 +12765507362113460744 3164 +5389076797106217476 3172 +12795047126721193476 3176 +7114021165387779073 3180 +11023957835677746178 3181 +10566218958691229186 3183 +18106722638958854659 3185 +5826292747170164231 3188 +2541652781142877699 3195 +6293158717507956230 3198 +692856733448236549 3204 +4932915077288137731 3209 +18331047357192558085 3212 +10014167524008155140 3217 +13262424149164850690 3221 +17111103342075994116 3223 +16730493478553972742 3227 +4265096093912705539 3233 +2212132589798623749 3236 +6472839844066051074 3241 +15537243785002490372 3243 +17962204466598197764 3247 +6139084908331594245 3251 +13562000388042410499 3256 +5270790572467027973 3259 +9389500025604390913 3264 +15947958143345967620 3265 +9880344363756946948 3269 +5424529361065114628 3273 +8772479320341481476 3277 +6135659579811036165 3281 +779142147636784133 3286 +8786609580093752325 3291 +11184793965660603397 3296 +16334230766039628802 3301 +14605975234833627652 3303 +1137561976399619075 3307 +3392242732066842118 3310 +10506034318166420996 3316 +2408162273619259908 3320 +8014329089165117956 3324 +11316054849820871172 3328 +3926641488021798913 3332 +14586984800934507523 3333 +11684826181830582274 3336 +8602115244827727365 3338 +7242922206518412806 3343 +12356974244923444745 3349 +18179262434090361859 3358 +9826548529131526147 3361 +17418326337181069828 3364 +16533812160361818629 3368 +11973387557705207301 3373 +4687962519948126723 3378 +7571378980335306242 3381 +17845651315931003396 3383 +1670294672735587332 3387 +14084259905169403398 3391 +0 3397 +9142849295096556548 3397 +1673756722526214149 3401 +14651289876409207297 3406 +8320569590308377092 3407 +13677291755864329731 3411 +9008135574670448133 3414 +14910977319032933891 3419 +4926720151397804549 3422 +1521264464738727937 3427 +5782216031443707908 3428 +1944659518666074628 3432 +3107932484388607492 3436 +14121746745096837124 3440 +4984148850634420741 3444 +1294614475488624645 3449 +1179528167054983687 3454 +5090953742855228932 3461 +17283662772825442823 3465 +14939701567916144132 3472 +6120213168201890307 3476 +10525916349030219779 3479 +12793462443941522435 3482 +8913324774053116422 3485 +8900115346070884869 3491 +14819995976810577925 3496 +11470089742952969223 3501 +12872905191841529863 3508 +11479067667118384646 3515 +1658110075293383173 3521 +11690001025866753539 3526 +6523753379044033537 3529 +4887279767397006342 3530 +12941787041044768772 3536 +6691972515156078085 3540 +516061050372767235 3545 +7782626726092075012 3548 +6114669862063622151 3552 +13088997701078245383 3559 +6848973045465964547 3566 +5951657758585981955 3569 +7317694980630102537 3572 +2762465638469104130 3581 +4638193712083044354 3583 +5478926351147780100 3585 +2240005485727809029 3589 +6749039560449811459 3594 +12712413182743261701 3597 +13159986871149604866 3602 +8330973771862578692 3604 +12195783308574042118 3608 +13616756907543259141 3614 +2079719002556027912 3619 +13951937555905771010 3627 +580991578681326598 3629 +17770454523198752771 3635 +17642816105925100546 3638 +4034479061183856133 3640 +13218402765209145860 3645 +16963354086646329858 3649 +894879424200627717 3651 +15520804511154236934 3656 +3614628514334978565 3662 +3958382904467398659 3667 +6157660124169726978 3670 +4387880399048053250 3672 +4347633545536496642 3674 +11243990292950977028 3676 +519796861353517572 3680 +10397257081898364418 3684 +15532403068826775044 3686 +16653773226682096129 3690 +13603771799467663875 3691 +15773900629934445573 3694 +10725423851115671043 3699 +7499135411497496070 3702 +13987590646927120386 3708 +9266169479736039428 3710 +11698920121000804359 3714 +18367403805578670081 3721 +8798571192592765443 3722 +9240443543574881796 3725 +14519307069256965634 3729 +3019312231207428098 3731 +6965554490601245700 3733 +14536065121782191110 3737 +3016440915731669508 3743 +4469471443248953348 3747 +8486475882744056833 3751 +10198048531410379777 3752 +3798000450041461764 3753 +3181379393213686787 3757 +6779759490630706178 3760 +11052331353566751236 3762 +12518754659682938883 3766 +8669814115352853507 3769 +6599029583865943556 3772 +1016143360150330883 3776 +12460867427268007426 3779 +3864091214906231302 3781 +13692414152180200451 3787 +10215062444975192072 3790 +248691539486926851 3798 +1048615075274544641 3801 +8871836029129671170 3802 +4722000902357912068 3804 +9831868702195141635 3808 +8446794232253035014 3811 +11588371511728304136 3817 +17101366765453312002 3825 +1085965808363934214 3827 +13652205642841978885 3833 +14636631645284828675 3838 +14937846093957912068 3841 +14593052506171293701 3845 +10005440742407834627 3850 +3478660979777377794 3853 +6840866270871284744 3855 +17931578529660957188 3863 +12896437037195268098 3867 +16313459739890555394 3869 +8681421403122425860 3871 +16503137485912177668 3875 +5574602919912124417 3879 +16580324658140753923 3880 +17489520831491682306 3883 +158553523026443270 3885 +14922808652651203586 3891 +0 3893 +16690197598502907397 3893 +16849230223831846402 3898 +11287265399619402754 3900 +18284590610544065028 3902 +16005078815948450311 3906 +1546808510312580612 3913 +14541467016091962883 3917 +3354286433891656196 3920 +17791450428352334850 3924 +9203299761599557123 3926 +2198610268239881733 3929 +11289718787562018817 3934 +3476995552193032196 3935 +7333067655049969665 3939 +11659232507368757253 3940 +12664318316567192065 3945 +7222985731912728583 3946 +1901121180843564549 3953 +6605798944100454404 3958 +16031395616361902596 3962 +18378707591340611593 3966 +4589318589709465609 3975 +7464336774749404162 3984 +7739704610129042948 3986 +16187291671717089793 3990 +16920822109262587906 3991 +12580421853678231557 3993 +8684865103601614850 3998 +3724965540938208772 4000 +13501780541836728322 4004 +8883122444561852419 4006 +1166914175835375624 4009 +9767826813697113601 4017 +645945319755131911 4018 +3011410886400698885 4025 +17530323073203753476 4030 +17246831063113417218 4034 +15750625928725708801 4036 +2923574556898743298 4037 +0 4039 +16593816993990497282 4039 +594335452468176901 4041 +9242792880196487172 4046 +2925091730546861572 4050 +710163250727713285 4054 +15668366180456310276 4059 +9176102467939487240 4063 +7719390528049625605 4071 +18254986238447028742 4076 +11061251388776522249 4082 +9583483219178270726 4091 +7334009023327453697 4097 +15772687249799158277 4098 +7053509647954993666 4103 +4760119684447448066 4105 +12514677107900772869 4107 +9079199448502360584 4112 +3804800099534990339 4120 +18077058436920909319 4123 +155526277958584836 4130 +5719399321732196356 4134 +7522605654999731201 4138 +9361405524516431878 4139 +4371586703089078279 4145 +8166128293750346242 4152 +4445483906075901954 4154 +15843412858532990468 4156 +13530724729748097537 4160 +16410674837123083267 4161 +15311491956256578565 4164 +8779293770704838152 4169 +6819434869570180098 4177 +582289959750943747 4179 +18061868723707392003 4182 +10979514187580228099 4185 +1683381312566371844 4188 +1555626316843442695 4192 +10976466729588899843 4199 +2702902158747268611 4202 +11927948430040361989 4205 +1357142276997138440 4210 +3923994564983937027 4218 +8605945630272230402 4221 +9805534960878212098 4223 +16978190245702040070 4225 +1695326113565522947 4231 +1815441536775804931 4234 +9977291751511117314 4237 +6615098483818553861 4239 +4619069333445224450 4244 +11582842649688561156 4246 +12814616588624110083 4250 +8858459858515214850 4253 +8624256726839618569 4255 +2769118973487549450 4264 +10932018989657033219 4274 +14347570118220682756 4277 +14523997250595637254 4281 +13118512827219856898 4287 +17849052824888937475 4289 +6484827696412789252 4292 +731963290451713538 4296 +16619389590800951813 4298 +12253116778612083719 4303 +8514585453373502980 4310 +574633014103341573 4314 +10116362179005680644 4319 +8634042640565877767 4323 +4493000951590839816 4330 +3954498639706717187 4338 +8571837631866271749 4341 +8880962775523007498 4346 +17165861892165422081 4356 +4940881348273062402 4357 +9426072955425259524 4359 +16250404841346332673 4363 +18203380833445270532 4364 +8800188589450096642 4368 +9416993782305439237 4370 +15111181432750126595 4375 +1152783780971921922 4378 +12709377263714464261 4380 +6492189814061219849 4385 +12201110772866198529 4394 +11285443965604916740 4395 +17240707423578494982 4399 +18203157173005026308 4405 +5042014172521546242 4409 +15067078180218241541 4411 +2900600120638945282 4416 +15176585640015951874 4418 +13681423585483236868 4420 +8578312108061815300 4424 +7879303743048533508 4428 +13955552508708982277 4432 +13065062913196068867 4437 +8454806274260643848 4440 +6113241591330622466 4448 +4702250141967325699 4450 +12590918714588494338 4453 +13383271157608760323 4455 +1058664902666170883 4458 +5319889905212576771 4461 +6205119741840471556 4464 +6846108669011447298 4468 +17994280664429563908 4470 +6765975279074618888 4474 +11380782831985747973 4482 +11999235188552149508 4487 +4490475307227301380 4491 +14758283554314033670 4495 +9556570547003650563 4501 +10604988940361112581 4504 +572444269181219844 4509 +2917404965076563460 4513 +11894703630821773828 4517 +2335358274775487495 4521 +16587318415926521351 4528 +3842743172292605446 4535 +11465770178539060741 4541 +4835458897317165062 4546 +4716291346929232386 4552 +11168616789068585988 4554 +16217427030191656965 4558 +16218447035879625731 4563 +10383982068816990722 4566 +0 4568 +1304741521476817922 4568 +18147923364964930051 4570 +15560555701796005895 4573 +16918480938170934789 4580 +8217914106448700421 4585 +7718555968188404741 4590 +14468564443531819012 4595 +8387309400431565318 4599 +16984643912647729156 4605 +14131901013073049093 4609 +16499113315310049282 4614 +4376443033037850117 4616 +11139100753249460226 4621 +12029596736994445315 4623 +12834583953007196675 4626 +7236492658149180932 4629 +3746429201187019267 4633 +14849380293221464581 4636 +18037187836262859781 4641 +11451875704381713411 4646 +11657131588799864325 4649 +124703049569255430 4654 +4570707627638373889 4660 +11477758676522894342 4661 +10752011921622272008 4667 +11998623471041620483 4675 +13734263951332960769 4678 +3363789861705151489 4679 +8111674493944774151 4680 +14299206540933410309 4687 +15921626124820444164 4692 +7358851314402396677 4696 +4121952071483910148 4701 +10457654895596960777 4705 +12768620803166364677 4714 +8519263111109905413 4719 +6354612590117906945 4724 +13817933356105917958 4725 +10482337396852136963 4731 +13676650184942916100 4734 +15292303340807660035 4738 +17413491447962099202 4741 +10108489852817477126 4743 +309723907036228099 4749 +17198295582881661954 4752 +8201103396273483265 4754 +2792427207749154818 4755 +9044749306710779910 4757 +0 4763 +450970919663187974 4763 +3164079451828306952 4769 +4594202099731149827 4777 +9516773606015987202 4780 +12780842600566923782 4782 +8639834157101913604 4788 +5269932442430079492 4792 +11722438511258174471 4796 +12186045632659596806 4803 +15745262497382841345 4809 +430678281651805189 4810 +11255293269916703748 4815 +4792530857020513284 4819 +1075638793622870020 4823 +2825871034899806726 4827 +17761532691273970690 4833 +14744324147151364099 4835 +5832560231163590658 4838 +2696586446207606789 4840 +8095635630794167811 4845 +7196155876309740546 4848 +12089370733243622918 4850 +18081114474907614722 4856 +2123625373193432066 4858 +12137216209278371333 4860 +5757898768468328452 4865 +15127742106494163973 4869 +17652513026386336259 4874 +9876132532602956292 4877 +11809821623727483396 4881 +7202247537204540417 4885 +12695627262656202758 4886 +5618995994464878085 4892 +2582724973740529155 4897 +6830374542368674308 4900 +2338417334943155715 4904 +5325957519852752391 4907 +7257013851451289605 4914 +5730493948524211714 4919 +4876024390276992515 4921 +5625754462303377411 4924 +3311605299144313348 4927 +12770317984794545154 4931 +2564640614907196420 4933 +14961703739287097858 4937 +6037075801896728581 4939 +11073085346795281923 4944 +2396357776540456449 4947 +244446437475824131 4948 +18283069419999675394 4951 +11638148799621244932 4953 +14107448233064762883 4957 +8441747500621765634 4960 +4700902206444935173 4962 +1057726969270200322 4967 +3293022547829544451 4969 +15556291724584224258 4972 +8660260066433516036 4974 +16470604734287864327 4978 +1437323633021380612 4985 +1049166735343526403 4989 +1629967315941341189 4992 +9736823674437639683 4997 +15542613791160641025 5000 +13601322227432355330 5001 +8855274604882002435 5003 +8270990614946121221 5006 +906178467411565065 5011 +1678837419199364613 5020 +14510134176097652742 5025 +15613575246942811655 5031 +10563171007738669061 5038 +5375860970738373637 5043 +5340115811228427270 5048 +8117448185370354690 5054 +11517564011205303812 5056 +15826155891509415939 5060 +7690823095854227458 5063 +4469857779296232453 5065 +16180994487838899204 5070 +17764579802035375108 5074 +882403058573654533 5078 +467890667178238465 5083 +9101342690755394051 5084 +15606520353506722821 5087 +9155346481769497090 5092 +8986202013317767684 5094 +10374332718318459908 5098 +3928022774241354755 5102 +1979029657031698435 5105 +15716355602249250820 5108 +7480075764411142149 5112 +3132990009248812546 5117 +6490963149481173510 5119 +10347023225008215557 5125 +18182014871994586116 5130 +3164615855353296897 5134 +16321980034621594117 5135 +8463695038579853828 5140 +13408691695174879233 5144 +5963572558545319428 5145 +4187023754214273542 5149 +11239631529971196417 5155 +439613891506949123 5156 +2603261809038267909 5159 +10103747052322374145 5164 +12569662964283514883 5165 +12532582912811409925 5168 +14106109295412484617 5173 +15767259753478317577 5182 +7097740504640437763 5191 +18306874996919868933 5194 +7094688775832226818 5199 +12264637506030164996 5201 +9396104376183849476 5205 +10173230873400748547 5209 +12969850294690639876 5212 +8625501401622866949 5216 +16560779766889967109 5221 +4598025090319640071 5226 +17821037967292495364 5233 +12095109707737803779 5237 +4579991049963654151 5240 +17189058799215177220 5247 +4094262538697912841 5251 +6281118825081547267 5260 +3333820402103199237 5263 +9561106457960692228 5268 +8522457636805681666 5272 +15391411280214398468 5274 +8624542176126483974 5278 +7873407149234052098 5284 +0 5286 +15353982196430252550 5286 +476290611918255619 5292 +6945123698660304900 5295 +17778839208666020357 5299 +15691171452505344005 5304 +0 5309 +5048096752415360005 5309 +8016200063162784259 5314 +11445447798230300163 5317 +6177861088351511555 5320 +16820510022374129671 5323 +15168394562749531139 5330 +10260146258854585350 5333 +14387790939026388484 5339 +9387733993426691075 5343 +9067197275410977285 5346 +2673050609009867270 5351 +17278692595176526850 5357 +10345459538852311553 5359 +15041547032041079300 5360 +2237640628562264066 5364 +16410203373044407299 5366 +5849579241415880713 5369 +586293207476916744 5378 +8905466085841957382 5386 +18060846984229837829 5392 +4250762355711191043 5397 +5773209343174278147 5400 +9831616780796583937 5403 +11962156368052975110 5404 +4376854667039831043 5410 +15266181824317673985 5413 +11498553019899415041 5414 +7220040187652049417 5415 +14453652137959739907 5424 +1246548954794318343 5427 +17725487187149454342 5434 +6364220281919306755 5440 +12953046075979904514 5443 +7686119690290867716 5445 +8837051926597206021 5449 +10726764689661541378 5454 +6410363555564701698 5456 +7807057908532360707 5458 +11441135839727768580 5461 +5892553948844857348 5465 +6969169768959660548 5469 +815483156364596228 5473 +6766268863952056327 5477 +13218989004083423237 5484 +3068387766543694854 5489 +16805194046066042881 5495 +5740923382447874052 5496 +14819128095101711362 5500 +1155312204299294725 5502 +6950098701279485959 5507 +18344096206157446660 5514 +14831672397121312771 5518 +1800479812009139716 5521 +15994630996307008004 5525 +16358997105731627012 5529 +13272492786882578948 5533 +11706002955785148932 5537 +458566387086222853 5541 +4229863270655526915 5546 +13439382182303002115 5549 +1637786253258854405 5552 +12962416928880289283 5557 +17205757558624150019 5560 +17510579336299706882 5563 +14678109131876326913 5565 +11523725982198860803 5566 +1698011984638328835 5569 +17817672923420330504 5572 +16467136375238854148 5580 +9894079351897735169 5584 +12952471521038690822 5585 +13173764706748080131 5591 +7316038483997508609 5594 +13258129728567140358 5595 +10091191967454020101 5601 +3201526137120643078 5606 +16745929307137784324 5612 +15586235914496503299 5616 +4735107861389880323 5619 +12304528814241262597 5622 +9277809768079388165 5627 +963712425023763970 5632 +4800522453809645059 5634 +2522270797834617346 5637 +302389896108908036 5639 +9720432069528830465 5643 +7083540084405023746 5644 +10517353976337266182 5646 +10379752136160331270 5652 +3895386448649206787 5658 +5315483765787874821 5661 +4590746231020767749 5666 +14292051038970284036 5671 +1019603881872179717 5675 +10917784975605266438 5680 +12867234761384525831 5686 +5908967007700571137 5693 +10024770846522468873 5694 +18278021375422664712 5703 +4521836517828230657 5711 +12948136759271800325 5712 +6773976795420495876 5717 +9817150339912677896 5721 +888516590972663298 5729 +12336160115693121030 5731 +16812511524087169546 5737 +7917426534129094149 5747 +2909165800748688902 5752 +2101043015706464771 5758 +7573077145106875401 5761 +14539329857649740803 5770 +7851399296764811779 5773 +14914153716645243908 5776 +1215732143652941826 5780 +15026401847885029380 5782 +15681021643988566019 5786 +18259049620697283586 5789 +4071893202565227011 5791 +7320221145270773256 5794 +4222801278242579971 5802 +1274141200251679749 5805 +4894691997861290499 5810 +13595808479066611205 5813 +13766296669076917250 5818 +7001687810628228610 5820 +14113975547193253890 5822 +9705779810592710662 5824 +10851507199526368771 5830 +17114733542011779077 5833 +2735982884933194762 5838 +12060987599627811845 5848 +15640982746121063939 5853 +11813199666665554950 5856 +16784341655116157447 5862 +1205399856835813378 5869 +128537277995013633 5871 +8705386621364153348 5872 +7530635783205814787 5876 +1640625027741376515 5879 +3188791025708137474 5882 +12656591027115955205 5884 +3662872140094074370 5889 +13375379691633666051 5891 +11811677611779654148 5894 +8372221404167497736 5898 +5967647394609305605 5906 +12087607891196384776 5911 +0 5919 +4631836504443709956 5919 +5195227587980765700 5923 +13489291505987862021 5927 +11273692348603220485 5932 +12511142907902712836 5937 +14844997102609086986 5941 +14009898996985431557 5951 +5106735844775611395 5956 +7115464813506754561 5959 +18421078144073226759 5960 +1673371587999895046 5967 +7249287650474960387 5973 +18254801096244198401 5976 +10845455537550204420 5977 +16547640089028825602 5981 +5094048012846587909 5983 +7645582339849400328 5988 +2840395802559538179 5996 +1487812045342827522 5999 +9606635782082252294 6001 +14550586608614821893 6007 +13904825321634152452 6012 +7354628611851658754 6016 +14527497361242699781 6018 +13229910147518716421 6023 +842849858858196483 6028 +17450944970416451589 6031 +14269490456539911176 6036 +8541512575848761859 6044 +1701404947928492036 6047 +17527546224194262532 6051 +4651148661813341189 6055 +9624044658817426436 6060 +15764420060274549251 6064 +151281334643089927 6067 +13354074741020446724 6074 +12037559520230791683 6078 +8433230574898498052 6081 +16923756640933334021 6085 +13781229227787992578 6090 +0 6092 +12335580644750121987 6092 +630083316049508868 6095 +9032749797590358531 6099 +15335001432824693763 6102 +1189260656430807557 6105 +10788149532662318086 6110 +5751610068693969927 6116 +8863006570995502597 6123 +4953651112154401796 6128 +2377336929532862981 6132 +13315696277300143621 6137 +9881524949184074756 6142 +673723078234318855 6146 +2155357865374380552 6153 +1651314293593319942 6161 +16220792790114272257 6167 +9304118317345036291 6168 +9445525297139147780 6171 +1384525081842273797 6175 +7988061703725634056 6180 +17508770227432426504 6188 +1801122352972553222 6196 +3563748004375268354 6202 +10985250526689652226 6204 +13761378483779882499 6206 +5991674434248450051 6209 +10369153579381474818 6212 +12583968798827355141 6214 +12262040326531599876 6219 +15952678556261619204 6223 +4336647905489382916 6227 +13784029169484659717 6231 +17684414874627288066 6236 +12166285610608617477 6238 +15710473312945574407 6243 +4033802383266833923 6250 +2650549562585408006 6253 +4553083642119998468 6259 +12895945069917976578 6263 +8506046608949635076 6265 +9271817824760493058 6269 +7516519409937144835 6271 +16838343100870268935 6274 +12721354534183836161 6281 +16750564434670083079 6282 +2638239730174174722 6289 +2571893274066115597 6291 +6826970406653361670 6304 +3359665871244676613 6310 +15115573768649186308 6315 +3807948753919418881 6319 +15232460835013117444 6320 +3316828421183856136 6324 +10610744675615521794 6332 +6551409730562075651 6334 +11194080050858350599 6337 +14117841431625805313 6344 +18258514941011246084 6345 +16986077365492217862 6349 +6334946973007650310 6355 +17215903787463370753 6361 +17884835592520470017 6362 +15525738264813795845 6363 +10120361185597214213 6368 +2106980603270034947 6373 +9212197138786472453 6376 +16244156874828867079 6381 +12076635765063801346 6388 +17960563606245799428 6390 +11955205236820086787 6394 +961370286201689603 6397 +10919436265920321029 6400 +2980298961834868738 6405 +7190104359634574851 6407 +16532623209997783555 6410 +6835648141600956420 6413 +777125430771714050 6417 +2741616990333208066 6419 +3737045445932905475 6421 +9440578807109589508 6424 +3093823019576583684 6428 +17287051251236836358 6432 +15007677512325475329 6438 +2061521213198002690 6439 +14840182643097619457 6441 +6865163569301842438 6442 +3916440123117659649 6448 +344813347313968135 6449 +13978374148716416005 6456 +11385172953626610694 6461 +8042716662572559874 6467 +15614828626380350978 6469 +8775718659362548226 6471 +13317742357773230084 6473 +3411833916986338819 6477 +10619269959347163657 6480 +7251962227674130948 6489 +16835797179545646594 6493 +5648743747760435713 6495 +1081500656409916421 6496 +16126497606667745284 6501 +16637690223820498437 6505 +1448893235578566662 6510 +7623758817568382472 6516 +1978846779355565059 6524 +2201801267461752838 6527 +8877599532137881092 6533 +14969980351871110149 6537 +7734374183993187330 6542 +17517612290705084418 6544 +7994086665557083652 6546 +8236699948169225732 6550 +3476691879483092482 6554 +10185022236819770883 6556 +17562564647371288068 6559 +16539705271975050756 6563 +17280725740671409159 6567 +1410231120780078596 6574 +11501074093192482819 6578 +5210345646926905346 6581 +3366194182052396549 6583 +6679957231485701635 6588 +9238004051178234885 6591 +5530326132795641860 6596 +3647817335762768393 6600 +0 6609 +4369796691841161218 6609 +1808509433172346371 6611 +10451870078362226693 6614 +5770802135042034691 6619 +16122818596883161605 6622 +5511905646297384964 6627 +7602373499383020548 6631 +17251683102611977225 6635 +6746026416038795270 6644 +63969693172890117 6650 +8036795356754587651 6655 +10061392600136104453 6658 +16676114221425241605 6663 +16563902576079620614 6668 +9765027585029946370 6674 +15201110253059529218 6676 +3947786244308157444 6678 +1150158273612251654 6682 +7969505074023058437 6688 +1005421222645784071 6693 +7985341926898920450 6700 +16599790109862244866 6702 +17848050874105681411 6704 +4836663746196405251 6707 +16453458191194307075 6710 +8424524042623081476 6713 +616216244749677059 6717 +17888681742593107462 6720 +17854595599560200708 6726 +8267426814981850115 6730 +16723135007693594114 6733 +16817459561031944196 6735 +8620432340424535558 6739 +9955295055865551363 6745 +5270263149562452483 6748 +16103376334482816518 6751 +6150110407917622787 6757 +8311512925022677511 6760 +377463900917083650 6767 +8463786110737268227 6769 +12318745441159791618 6772 +3141380733494224903 6774 +4003978747004751877 6781 +7474645745432199682 6786 +14290140698394777091 6788 +16650092577659853829 6791 +17663785715206149638 6796 +6725154888741898754 6802 +2391047000172383237 6804 +5765182673658288643 6809 +652057112263718915 6812 +3887614843709007876 6815 +1619416564481993732 6819 +7730236136777612292 6823 +12393692528881592322 6827 +4137087401365720582 6829 +5667099042661527048 6835 +5779170701267461127 6843 +11674807417041754113 6850 +13599964326147404805 6851 +7821018611832787970 6856 +6528215495763197956 6858 +8623358427344020484 6862 +16155400127382829062 6866 +7331883569652496901 6872 +3794354192892717572 6877 +9924869259523491843 6881 +14655974584117115397 6884 +3164854291659947525 6889 +0 6894 +14699035881486189572 6894 +17620048177336119300 6898 +7973539150855733769 6902 +16031910541696791557 6911 +6292729385119133190 6916 +9193473160777480706 6922 +17720373829140184070 6924 +0 6930 +0 6930 +8067316663891949057 6930 +4118835820859164163 6931 +12433371141340572677 6934 +3446352107506434563 6939 +12178121616992345094 6942 +17497691059834945540 6948 +1468599692982927875 6952 +6694865634287724549 6955 +12546617028740646917 6960 +11310103239789881351 6965 +4486043883502303753 6972 +11263904827260029955 6981 +11988956976280312323 6984 +9055793399690154499 6987 +7671498247843035140 6990 +7185582530403593218 6994 +289936663493193731 6996 +3960194497031164933 6999 +1569764721288832520 7004 +15752318308477809154 7012 +6030292069755904516 7014 +9243420919274872836 7018 +915218678548043268 7022 +1281380607417445892 7026 +17041255401742160389 7030 +5316036976619279874 7035 +12100239460398977026 7037 +14311524551481943553 7039 +17818618222851583494 7040 +11759172847850377220 7046 +13793419752267551241 7050 +4743219213997207554 7059 +11481286678833090052 7061 +8442972670589794818 7065 +4082188842576119297 7067 +26021000010988546 7068 +15788421933460093954 7070 +13966672519445510661 7072 +2218684855334216712 7077 +11945005828842298369 7085 +7865418297435639299 7086 +2602545071208707588 7089 +1325937740048341507 7093 +14548251831960184325 7096 +16851546583073723910 7101 +8064305531441438213 7107 +0 7112 +2432864981255334918 7112 +266705439558115330 7118 +1323618382562836996 7120 +13399617749717613060 7124 +4856538974280558595 7128 +17147164184761594372 7131 +9423153210531224069 7135 +891960878352570882 7140 +12883522656707708933 7142 +4168852582427637256 7147 +14003784465234531843 7155 +11836750294138581506 7158 +10584777790766445059 7160 +3029049359168862211 7163 +7303794105514906114 7166 +12219880139156726275 7168 +5240206986384832515 7171 +15843664896967679490 7174 +2366746164688489986 7176 +7113601757497264129 7178 +16110705982320537602 7179 +17946755977776491524 7181 +14321256077044832260 7185 +9687149754744899076 7189 +5819684580041536003 7193 +10056554367080965126 7196 +1484576351346407940 7202 +1867715742877318149 7206 +6364565516116836867 7211 +15396558044726351873 7214 +907575361552482821 7215 +9030390467299806724 7220 +7197543741185703428 7224 +7240826905685187080 7228 +8994471739803695617 7236 +4600345088139427332 7237 +16923453318223414276 7241 +12959619284059558407 7245 +3811170739117670914 7252 +6490680310573832708 7254 +17447426234550208009 7258 +14518171069267544581 7267 +14744426175125003779 7272 +13362520386019213828 7275 +16996436072540537860 7279 +2004209338836424197 7283 +1410953652777119746 7288 +14173401971169090053 7290 +9288362133865038338 7295 +7176894368513666052 7297 +6859203420427629573 7301 +4348409582883356166 7306 +4167845437308220417 7312 +16847520454148617222 7313 +1263925487586891782 7319 +6216185568259362819 7325 +9084872121752940547 7328 +12000008398055695878 7331 +4621743016219831303 7337 +4410980278445624324 7344 +1968078245558784003 7348 +16209143478214361091 7351 +10047684971622392834 7354 +6866544022933411842 7356 +14053664778960330758 7358 +17666310608262008834 7364 +9418629696202473989 7366 +12158568749790799874 7371 +3903107239169726983 7373 +16934217124218475523 7380 +6784036115976175106 7383 +2322681628781431814 7385 +9052485431987192325 7391 +5903158917487809026 7396 +6418304047327182344 7398 +9158220433904642562 7406 +15709576149764117507 7408 +14508854480658025988 7411 +12270610319670688771 7415 +2271935621738322948 7418 +16673645763603238401 7422 +7914521473814752261 7423 +17241560197369381890 7428 +3317580003129040901 7430 +5875108360229164550 7435 +121923756141514758 7441 +13768444484468151813 7447 +6160304613514555395 7452 +5667949611252881923 7455 +730924964321006595 7458 +12570858684417463301 7461 +12417861930741414404 7466 +10693606750072288769 7470 +5379915891207845380 7471 +9432177183959854597 7475 +12926090456060550147 7480 +6720239280908562437 7483 +5039799783987231238 7488 +14789387039116688905 7494 +12299112658954087426 7503 +451217186577053701 7505 +16747617474951016449 7510 +9653101368709929482 7511 +15962646879900827141 7521 +17646623344718269954 7526 +1290200664936367619 7528 +14217601310685615621 7531 +7326537869119905799 7536 +2845678131456585731 7543 +7409466190058079748 7546 +16949231843150638596 7550 +12154730755959659013 7554 +11108758041153949190 7559 +5302850382339694081 7565 +12777420003328202758 7566 +4951058897750202883 7572 +18087709190069197317 7575 +8309956548456840195 7580 +11424052273868807684 7583 +6763461368287390211 7587 +1052353175302176772 7590 +10285242523309713924 7594 +5574877375266793990 7598 +11751351688995908613 7604 +17883146139441921025 7609 +13980025242308461575 7610 +6346634362728781826 7617 +15553567232979087365 7619 +1506849685770316291 7624 +379717142895987203 7627 +3405862455288401411 7630 +10155245922281545220 7633 +5991890787576068097 7637 +15902609019942444038 7638 +4988794741806039046 7644 +730183945982557702 7650 +10002144724703238657 7656 +11812357400900710402 7657 +17547908682777338373 7659 +1079026022932460034 7664 +10896071686975929861 7666 +7970499494331210755 7671 +195033555535043591 7674 +11191545185015829506 7681 +4160346631066105348 7683 +10396858972577104899 7687 +10603435768971021316 7690 +12109493715672806405 7694 +13849701958662260230 7699 +10567536788743348739 7705 +3784347783362411014 7708 +1305995892186461698 7714 +14854802528017367043 7716 +2724808921430019074 7719 +8629687381836611585 7721 +942819722101876226 7722 +876456126611467777 7724 +10262939234702002183 7725 +4843732871211896324 7732 +4561458580905996293 7736 +16671513564896481284 7741 +17587339519610067463 7745 +6555181309781543938 7752 +10585426575552683522 7754 +10554712047066359300 7756 +5700133485924837891 7760 +17318063265233108485 7763 +4482221624408975873 7768 +18359388101117346307 7769 +6313159050076783622 7772 +11551723470497474564 7778 +11277462396509328387 7782 +9088916772537679366 7785 +8690591897282059270 7791 +8468606001075240454 7797 +15565028024262837767 7803 +10311860485461539846 7810 +5631868792480462345 7816 +570149343778398725 7825 +6058375942917000197 7830 +13953318628551224836 7835 +11179571210796391941 7839 +14574258089638999043 7844 +3196990973536510981 7847 +14717232404954073090 7852 +0 7854 +1372021117129221638 7854 +18411825613110952453 7860 +17432840234471342593 7865 +9715548195313850882 7866 +4179525199494086151 7868 +16793786456678641154 7875 +13326530259693276680 7877 +16647314254364856328 7885 +4945823669621224961 7893 +2844796132852937734 7894 +10720505095633131525 7900 +11839418445982857222 7905 +0 7911 +18143469209390810115 7911 +12101088167471738371 7914 +5087925111474210306 7917 +15293874667548231685 7919 +7988878807014233091 7924 +1839613273747579400 7927 +6337251690545079814 7935 +564442707383644165 7941 +15957549581309898242 7946 +5229417531202658820 7948 +5433665768768661508 7952 +5933188477635430403 7956 +7414868338322786819 7959 +13296531146858492422 7962 +15550177506028955140 7968 +463871822310462468 7972 +8292151178183624708 7976 +6885652216908276740 7980 +16313412289874552835 7984 +2248212804173039620 7987 +7007398238342784004 7991 +8802820241077499910 7995 +14120589990344666627 8001 +13757032874656087559 8004 +0 8011 +12530492041133706243 8011 +13249740401367401479 8014 +8760552301975805443 8021 +4236893056099910661 8024 +18301861982932083715 8029 +4258539354365740548 8032 +10508901918494082054 8036 +9450899597312345603 8042 +322523146097602052 8045 +8329116751818144771 8049 +1828039460332935684 8052 +10972786354663633413 8056 +10318184708532905991 8061 +16171355766908130308 8068 +12066772711191411717 8072 +17400523314225590791 8077 +5736227831339853829 8084 +11291399398029418502 8089 +11267323722497888771 8095 +15395677595137162247 8098 +6949224002705600515 8105 +1404896573996103687 8108 +5505585177507620354 8115 +5021226479790840321 8117 +2698282295086657538 8118 +8894381380483259905 8120 +8152328571922393604 8121 +11132262295508500481 8125 +8502238219690083844 8126 +3141000496401951749 8130 +1835992332722526722 8135 +14863583533266772488 8137 +17972024320123034119 8145 +10279071255226923524 8152 +1360106251626162181 8156 +5698603712565799429 8161 +15847288013675310082 8166 +3989946313806367238 8168 +2427307917389630981 8174 +1854711861588155907 8179 +15132660629557690886 8182 +4043717128045952002 8188 +10989565538392424969 8190 +9440249847886644739 8199 +8528634401120202245 8202 +13531217106136005126 8207 +3570305886649725446 8213 +16158227968874028034 8219 +16593199649201908738 8221 +17410444797776695298 8223 +5793711040174230533 8225 +11749181107247138307 8230 +17445594392159278594 8233 +16274906993203656708 8235 +5655041509868999681 8239 +2930261496911882756 8240 +9907176810344158212 8244 +8742981743194258949 8248 +1986439699841024003 8253 +9071406478778435587 8256 +4295034949331146756 8259 +10274553923901851651 8263 +0 8266 +1305919823008511492 8266 +8418130105429052936 8270 +10888725125685264391 8278 +6860813630659105283 8285 +11182063914015076358 8288 +17410101182922689026 8294 +13463305314725718529 8296 +6037707652310486017 8297 +16133528540415141382 8298 +1958311093454672389 8304 +14129758092039130119 8309 +17512731293423258113 8316 +1507155918878111234 8317 +9214049808092181515 8319 +11491214840999470084 8330 +12369219675349497350 8334 +9551174459349762564 8340 +3780734142670839301 8344 +14315453831426861059 8349 +16885680510660891137 8352 +10255270850554520577 8353 +11386622207830013446 8354 +14180836309254254083 8360 +12796913875774676994 8363 +12022280131935670787 8365 +2773930757019434501 8368 +1261784900600799751 8373 +17432746119775873541 8380 +917284368507701766 8385 +5675598692066638339 8391 +16325448982935621634 8394 +2298208391858902024 8396 +10289755184878818312 8404 +11575676771974117378 8412 +15646607573166711811 8414 +8044051625169124869 8417 +14292601805461197833 8422 +17906919062309416965 8431 +13755572326863287811 8436 +13260542391125375490 8439 +14112338548000417282 8441 +8562198574276141061 8443 +3075989231230766086 8448 +6627381639025473539 8454 +9558506327941540355 8457 +3050634355519113223 8460 +5599177239041632775 8467 +16640062294123539973 8474 +12499269163424732162 8479 +4577416965579084293 8481 +5759701960149997574 8486 +12825586972175283715 8492 +14086999047856346115 8495 +2702296495317167108 8498 +9801156934359653891 8502 +11036614471469535234 8505 +4210118172907015 8507 +17232973578216285700 8514 +8965639677429228034 8518 +7963118906128056322 8520 +2134400259457781761 8522 +16479574393968987653 8523 +735042849455725060 8528 +12174649880104067075 8532 +4098357871764179458 8535 +3626511059591761411 8537 +16159465235751440904 8540 +6877665693110597122 8548 +7619770516555940866 8550 +6070954866838528006 8552 +1602100370053053443 8558 +6682156672501669891 8561 +0 8564 +12976941038521090566 8564 +17509588123037565957 8570 +14668722231680379398 8575 +9404874268201038342 8581 +4567340063323232261 8587 +4406601618444595204 8592 +14563908573748340227 8596 +3314026749701976065 8599 +12546630319430558726 8600 +10834173178238194179 8606 +15216547323096548874 8609 +10747940868473858054 8619 +492511222260073988 8625 +6265947051558841861 8629 +5072453149675713031 8634 +4084002626702451203 8641 +12688802802867240453 8644 +13217889628009886211 8649 +10367420612382045189 8652 +17886329693619927555 8657 +1409270675472399364 8660 +10668937096741765127 8664 +13646078603755173891 8671 +16087966002653160452 8674 +2786828138380211720 8678 +7709758552404304902 8686 +4507529531976573444 8692 +6979091742367726083 8696 +7651087636548012037 8699 +605322723284290051 8704 +1142045690790139397 8707 +6770526826490514947 8712 +3858088302002392577 8715 +14192397473452250116 8716 +9218333596683400708 8720 +17195496239451869699 8724 +16831694989553668103 8727 +5891354149489283075 8734 +11342212721824115207 8737 +16786653330421427203 8744 +6567453180839802887 8747 +12383651170651642370 8754 +9626030013526808070 8756 +14968473710495059459 8762 +1118991002462441475 8765 +5529502052781136390 8768 +13509851720846138883 8774 +5010013037581190658 8777 +8699266025231189506 8779 +2989467716126492162 8781 +11887297125215523844 8783 +16484879149332086787 8787 +7536464965184838661 8790 +17656713113845844485 8795 +1569241683937567750 8800 +4182479984517561857 8806 +2335090652135217158 8807 +16803541603275629575 8813 +5069564201065277959 8820 +9357114418836861958 8827 +12617157543943749638 8833 +14103620940878455813 8839 +6601524404955806212 8844 +18071804906001857544 8848 +12099425236104985092 8856 +7720809976909580290 8860 +7795287101192707074 8862 +11685801736502286337 8864 +17313141240733775364 8865 +1151229193173762052 8869 +7855565556101846532 8873 +17200158265555509250 8877 +9927102024113868802 8879 +12071986138804869641 8881 +685881457693666305 8890 +4019925263921856517 8891 +11131094141829193735 8896 +8378721334308140551 8903 +4096887044461006338 8910 +6560118542590002181 8912 +15234538177700753412 8917 +10705471323934878214 8921 +6659850843278034435 8927 +11213431734766069762 8930 +15324594591133952003 8932 +16996794633371353092 8935 +17237201925924856836 8939 +17845474640756336642 8943 +16213846231076867075 8945 +9241941044156192773 8948 +15664380317982342149 8953 +13476951222203193350 8958 +11606723441576963075 8964 +3190619035982557697 8967 +4911946809162569218 8968 +4213121625341500421 8970 +3277588693318198276 8975 +15268409481416566788 8979 +12407528498985476103 8983 +14442556804900515331 8990 +3483437623775262214 8993 +13015118922420698116 8999 +5583180392973535238 9003 +1490077386865614852 9009 +11345994401098651653 9013 +1341114167787553799 9018 +2452002562335664129 9025 +12275290046284115972 9026 +4233605382812971525 9030 +408788942157097474 9035 +17571893604030201861 9037 +3341706476115579910 9042 +10524304492669914627 9048 +5178842762213481987 9051 +14555535401669431810 9054 +1989655261605702145 9056 +863596221647866374 9057 +16725313039533945349 9063 +5808102046285241346 9068 +15522908671792444929 9070 +18254216245293910020 9071 +13261308779496181251 9075 +9069974022887755777 9078 +3027498727461508101 9079 +3615484141831181313 9084 +9738600069127987717 9085 +16654216294514428419 9090 +13090870588256895490 9093 +10870405033720755205 9095 +2483159383184107009 9100 +14739096315046142982 9101 +10639230736003013640 9107 +2234668458554736644 9115 +15167910481604261891 9119 +15723452155656544774 9122 +16098153300006150659 9128 +0 9131 +6621016528465383425 9131 +140475194743476738 9132 +6893970575631986689 9134 +6606271452543915014 9135 +14292791931241447942 9141 +3144898580040751623 9147 +15179453479986634755 9154 +1919133076145245185 9157 +9119943093154101761 9158 +2999854552123979780 9159 +8996557988860728835 9163 +13317526602586399235 9166 +1962820981623469572 9169 +2859564017544879108 9173 +3776318440090158085 9177 +16433232478295741441 9182 +0 9183 +10229371506436378632 9183 +11832209345663664132 9191 +430454303362019331 9195 +5100832806585937415 9198 +16807303102272382470 9205 +17162723043629411843 9211 +16990304274792526854 9214 +9893519808489756170 9220 +2778217712506416645 9230 +3255561616305333249 9235 +282102417794655748 9236 +13189765052364285441 9240 +6003286675261884422 9241 +10668853645540891142 9247 +8506841348970852865 9253 +12573283311865711623 9254 +2576941358310312449 9261 +12217163120521995778 9262 +15070590415040590341 9264 +13035720748688974337 9269 +12390206297400938501 9270 +17956136742575476228 9275 +10937188658906432518 9279 +951488017092099076 9285 +10476573860640586245 9289 +8462700183356378118 9294 +15981635330675290116 9300 +2173726211647627268 9304 +14049227834022748161 9308 +13741989152277199878 9309 +11063093051944271363 9315 +16963321384578588169 9318 +18031735498174368261 9327 +8035542338044660227 9332 +10171513136154043396 9335 +1551901567237416965 9339 +0 9344 +14701647296012106246 9344 +5558077204553428483 9350 +6665933302585895425 9353 +8290443569605364231 9354 +12033229616451351043 9361 +16687210608067276293 9364 +16191469766372938243 9369 +853448271643046915 9372 +14721700262998993413 9375 +3830535910377979395 9380 +0 9383 +795877729647198210 9383 +14522724544706684425 9385 +770359238308712963 9394 +1119662581276869122 9397 +8233938464840117769 9399 +14033836485492004867 9408 +2266497638579647491 9411 +9066339511608754690 9414 +16213603201887723524 9416 +10582315720361171458 9420 +12131649404377744900 9422 +7191775516706343427 9426 +13549496590751731203 9429 +11946199661831995394 9432 +7966748260820582914 9434 +6622915507857968643 9436 +9778895679228566531 9439 +13696259226783232002 9442 +1727875004410902020 9444 +6671815210095970314 9448 +4930933639868210182 9458 +2134824739127955976 9464 +18349865749450315267 9472 +17312731740347076611 9475 +15927161163536175617 9478 +14687108974697809926 9479 +12068905242964258821 9485 +1854943585932460546 9490 +5777876758436016131 9492 +10195708163165955593 9495 +13868935935856658436 9504 +3225535118839135749 9508 +14205118788590686722 9513 +9952619008617846273 9515 +2081745049496343555 9516 +4044307879165834246 9519 +9607559701155948550 9525 +15453114171682033666 9531 +1911805413776502280 9533 +14147271486530859012 9541 +9129430366996847619 9545 +17534237304492951045 9548 +14439851843441393666 9553 +3154102976948739077 9555 +2554269051167526405 9560 +11481475896865519105 9565 +6260180642777056773 9566 +11288372094396388356 9571 +5973247535215072257 9575 +14800845483401749506 9576 +4364094711009488900 9578 +17440280092866831366 9582 +17738456315013919236 9588 +11181018937336397314 9592 +1430506867474457090 9594 +263457319465108489 9596 +8418483489501913606 9605 +11605307791739653126 9611 +593539205693591554 9617 +12799262575054359044 9619 +1748392601811438081 9623 +10151488648578407937 9624 +0 9625 +14679448497924163075 9625 +8951671754022244365 9628 +16510804525175667203 9641 +16125458973797690884 9644 +4097706006182552580 9648 +16179467815734404610 9652 +8910213788650892802 9654 +17401584116553268227 9656 +8857453474677065731 9659 +9466609545424865283 9662 +4429577993876297730 9665 +12098757901255463431 9667 +12822882736859289093 9674 +2826741295946186242 9679 +14831293953945207814 9681 +6042174557622045700 9687 +6311618998676794884 9691 +18061834319601334789 9695 +7817480195787658757 9700 +7104283074252869124 9705 +13223327883783400455 9709 +3535450815554780677 9716 +15875736552712763905 9721 +0 9722 +17315104829678644738 9722 +14779341776942310403 9724 +18224409074039673349 9727 +6215292511689292294 9732 +18031801514459247620 9738 +14478821894592903684 9742 +5466743955099909634 9746 +11830828923146764293 9748 +14747906259620397573 9753 +13084993292492529155 9758 +8131105780965498372 9761 +2237031095716472324 9765 +3050070881055704069 9769 +18050339972027272194 9774 +8460535905837329412 9776 +6641025007498814981 9780 +7751108080568738822 9785 +8793605694759911429 9791 +8123575679285307398 9796 +17508947393464770567 9802 +16449028364203557377 9809 +2801291199560909832 9810 +2780479123005444613 9818 +13472915251925491717 9823 +3001096349759363587 9828 +1683901816538201603 9831 +18325601312721674246 9834 +8631835976110855683 9840 +6995759890565723654 9843 +2796004150310711811 9849 +11788339508819728900 9852 +6977169843978716163 9856 +3792482014413729797 9859 +1359252815854206470 9864 +10680536530910914050 9870 +15586866839664043015 9872 +8051073732081620481 9879 +0 9880 +2670266531533073922 9880 +1793198853586300421 9882 +11580612158209094146 9887 +10067939374781071875 9889 +16057192830231155716 9892 +12034886530960807426 9896 +4988503126789574658 9898 +8403411982344179715 9900 +1145479661280153603 9903 +8616162896562540546 9906 +2997983402789075462 9908 +16889482378680589826 9914 +12807561018992635398 9916 +12636361784082401283 9922 +11090975748475137540 9925 +5676897164033889797 9929 +10883925407865470981 9934 +3253024831027420163 9939 +0 9942 +18293390612744373762 9942 +2692657715968096776 9944 +708698135680073731 9952 +13419519692439726593 9955 +15005950957490665475 9956 +1740175860072533508 9959 +17920569872062253061 9963 +0 9968 +5927389144262405637 9968 +137492500375476228 9973 +893988961548741634 9977 +11398430589301595142 9979 +6855239271074829316 9985 +5586985987811968006 9989 +13442939521650089473 9995 +10687706971698865669 9996 +3477767477653632516 10001 +15758482997008166406 10005 +8217770349388471303 10011 +4936753047109563395 10018 +462196852475189764 10021 +12302841100951863301 10025 +14398994320637903367 10030 +2463233980994163714 10037 +10723398603062453761 10039 +9403066381861257222 10040 +7064734830228017159 10046 +16252151146410262017 10053 +399386466682711042 10054 +17872466339235444739 10056 +16821262164109428228 10059 +9652866034206724100 10063 +4010200236891043842 10067 +7033456902031388677 10069 +3163103226782042114 10074 +15951295813012160517 10076 +18397588078637887495 10081 +8099042860415771137 10088 +14688069292301517828 10089 +6623265367321679368 10093 +18115365250904448004 10101 +3181147706909864970 10105 +6343813623046272517 10115 +17918131919751139844 10120 +795118959611833859 10124 +5595537026358431753 10127 +3178514048201445379 10136 +18176852764359904259 10139 +15617204493706365953 10142 +15881682572063012867 10143 +18144175236283734019 10146 +15197187346270765060 10149 +15304197827650887684 10153 +6589296600976509442 10157 +3291819586300985858 10159 +10774481184633835010 10161 +569306890647424005 10163 +7692097630459897345 10168 +105812752742722054 10169 +6975460241179387396 10175 +8990722227674533890 10179 +2862725282664309766 10181 +6572524223972714504 10187 +6313316401563381762 10195 +14158510156393358339 10197 +7082575081548040194 10200 +8180842391736478212 10202 +6146977149393993733 10206 +16003451760849488905 10211 +7770833809486187525 10220 +16504863374273908740 10225 +7567776748883443203 10229 +3324045097214086661 10232 +4188635866602947075 10237 +6002549944707960325 10240 +15606237339841616899 10245 +6409883751251205634 10248 +1564175615915917827 10250 +14335795570326144516 10253 +12655734471235479555 10257 +5260943438271100933 10260 +12810672245499198978 10265 +17617766749464050692 10267 +6617904839709883394 10271 +10842777333937130501 10273 +7422341167934369285 10278 +432977468305990660 10283 +6653053966035689991 10287 +11063327282504813061 10294 +14942611746857827845 10299 +13727939070223743493 10304 +12307547314488522245 10309 +16806685108432690692 10314 +7493026787034320391 10318 +11434060753681467395 10325 +16697479409419232257 10328 +7481648466529403396 10329 +884601087729076740 10333 +11171406263405606403 10337 +13694980405486140419 10340 +9900593620464713219 10343 +11262335367653441541 10346 +6502372914660938248 10351 +10275218261104443908 10359 +18041832752595365383 10363 +5941786011605272577 10370 +13456399229627370499 10371 +4728960508425157635 10374 +8428900728118668803 10377 +4267488105109175811 10380 +5125269249435089413 10383 +5232600223868175877 10388 +14445875504103160836 10393 +5793511741155545602 10397 +3604450604041000963 10399 +13596821824367664643 10402 +9249517733873826819 10405 +7349823286561239045 10408 +8736150384956542468 10413 +2700095460181959682 10417 +7756158588753929733 10419 +15515046268542449160 10424 +10288580723041352710 10432 +15966280946305018883 10438 +1073969165655532036 10441 +16594755998814816258 10445 +10966316779615005189 10447 +12140001116249902599 10452 +4507003793481212931 10459 +7027397812773733382 10462 +2490378099026844673 10468 +2985610800735568897 10469 +5872393756613277700 10470 +6659373846461891075 10474 +12305278384621229060 10477 +11811741504281895939 10481 +3595586802938513925 10484 +18291595252128420865 10489 +7848329482089458179 10490 +14392993567772158467 10493 +11255255496664507394 10496 +6368766555636015108 10498 +4865944788736121351 10502 +15818241996731244033 10509 +9445786658522360323 10510 +15424237608732513284 10513 +15018692159369128450 10517 +18325997894852115970 10519 +1723344800456140807 10521 +13161630741889867779 10528 +9970106902821178370 10531 +11010376987887493124 10533 +17423423149806548995 10537 +10232438034258571780 10540 +2910075616546804739 10544 +1683146562875537411 10547 +13489828702960997382 10550 +3970966336468612610 10556 +14625091155647858180 10558 +6704081445235510789 10562 +4660693690905324547 10567 +14082483503507523078 10570 +3355901866133885444 10576 +12281078701162318340 10580 +12980511712350988289 10584 +15091896032994689539 10585 +11828395116564455425 10588 +15084944605571522564 10589 +9726410834851451396 10593 +2692386685448262658 10597 +4525317743492870147 10599 +10740765886321148417 10602 +9813523361687316481 10603 +5238259626429949957 10604 +6837564799038014471 10609 +14505727905857078788 10616 +11087785818892529667 10620 +2750976172065575939 10623 +5268083010491978246 10626 +9080256686287490051 10632 +14502297773325674499 10635 +18379783834389451267 10638 +876447832047330308 10641 +15986703178587891716 10645 +8113205450225738756 10649 +15619316808555903493 10653 +3153361020086153222 10658 +16422910233379296259 10664 +3340537608625611780 10667 +4011687875162188293 10671 +2587180872132928514 10676 +4640857502429313538 10678 +12473360059018334214 10680 +12438501028447798785 10686 +5955064094122748930 10687 +0 10689 +14962823182176813061 10689 +17732231831885831169 10694 +10253598723579764743 10695 +4695391722448695301 10702 +9566295012134258181 10707 +814468546409041410 10712 +5309040010947112965 10714 +8777775352424540163 10719 +13800735402375158787 10722 +10126019627859245057 10725 +12812323307660661764 10726 +1830963606639539719 10730 +33183754693990405 10737 +13194177944581253122 10742 +5793816214708082689 10744 +15349409645672445441 10745 +6649468544576613383 10746 +18095467899548619780 10753 +13175312826477599745 10757 +11933296674631612931 10758 +15203329843366495745 10761 +10623507584662025219 10762 +17433655317505715715 10765 +14164874344984493570 10768 +74123664976785924 10770 +9226526864512878083 10774 +3371203137145338370 10777 +14711117676213028867 10779 +14044024419157976578 10782 +9046561817441040899 10784 +12795225552647931400 10787 +15210437097796377607 10795 +7002772756746634754 10802 +13959339961666309121 10804 +11377865278414767106 10805 +13826477664649506820 10807 +9531033321111015939 10811 +6149152156411390468 10814 +1918326819834906113 10818 +13626109355763652098 10819 +8363624003011356168 10821 +4798141770638844420 10829 +15794645538114155526 10833 +9039615187681755140 10839 +9801904360124036611 10843 +9868728879510362118 10846 +7077611375720156676 10852 +10869719529810028550 10856 +1404658768600361476 10862 +126504211945176579 10866 +4865155040778748930 10869 +14193909766987968008 10871 +11587735670343240709 10879 +10615536296055437315 10884 +15047176352170630151 10887 +7428005105651044355 10894 +3153533201613726724 10897 +5987090195865460229 10901 +206985857495723526 10906 +3103136403100096518 10912 +12582100422624733701 10918 +5201067771797811716 10923 +15257137520426585604 10927 +9244083462758056961 10931 +152340482437429765 10932 +8019625548019310594 10937 +16189915760085130754 10939 +9602882754816930819 10941 +1852739039293247494 10944 +11841957367663621635 10950 +860238781417081349 10953 +11085250328562996228 10958 +4206489539807777797 10962 +13474285968438399491 10967 +14935532650768147457 10970 +9118236405792527368 10971 +11564315142679138819 10979 +15297966693984715270 10982 +8072543443535407108 10988 +5655096982485431298 10992 +4733648367163131397 10994 +7351052290639098884 10999 +0 11003 +9111179703644555265 11003 +14807887209540074498 11004 +18397626780478526977 11006 +7288460374880843269 11007 +14962370793879370243 11012 +13744581539423377412 11015 +0 11019 +9954171421724776454 11019 +11345946503103023620 11025 +17557390126121620998 11029 +5002379505332131331 11035 +6797897511964633602 11038 +11996889539387908 11040 +7691666349841047554 11044 +7909770516654377476 11046 +3630794191213475331 11050 +2852488971117329926 11053 +18422677506837325827 11059 +12736626153192497157 11062 +7340053935725563907 11067 +9110413400708195335 11070 +10113627452004820488 11077 +10001250316175431174 11085 +17578554677691718658 11091 +11085270693578036739 11093 +1429686332953531906 11096 +2473294995050599428 11098 +18043687729107078149 11102 +14449716007562759685 11107 +9273572303988447745 11112 +11295832248831169030 11113 +6877438285510909954 11119 +5139825706100170759 11121 +5990000902951205892 11128 +4997102625258299907 11132 +13543268216194013701 11135 +13531559896534807554 11140 +333037719648708613 11142 +4836255526022977027 11147 +10654590189828598785 11150 +8220654605389774340 11151 +16024962888851961858 11155 +4300010364263599618 11157 +8584940067397060610 11159 +7293199560808176647 11161 +8902296380763329539 11168 +8713542690456975362 11171 +1282919269344419845 11173 +2744350487822926855 11178 +7905535606216793602 11185 +8713853942765085700 11187 +13137501494332703749 11191 +16869733948537667077 11196 +387426592518732803 11201 +10698772526499902980 11204 +17062924891392284679 11208 +5347741040223507974 11215 +5515914905696456706 11221 +11212334577630967816 11223 +11931605130623290888 11231 +18134742485233751556 11239 +12446306639647826434 11243 +13465337223471053832 11245 +1415284240028592644 11253 +11661884721310026758 11257 +6288357468357484550 11263 +9299901287275800581 11269 +12292094719344357895 11274 +1409978630337341956 11281 +7692617297280694280 11285 +9459479029927041538 11293 +12071976365378907651 11295 +10445467649800312836 11298 +9367354873058264580 11302 +14571776118123995137 11306 +2445898143112884229 11307 +4531266338139771913 11312 +15892049416741779976 11321 +16144475367701765635 11329 +5222142725022641157 11332 +3294799092845633028 11337 +17123108744137505793 11341 +5061725544736516099 11342 +0 11345 +3050143891868482568 11345 +6170099363060697601 11353 +17255615908055048198 11354 +12770383682579269126 11360 +9913186086238710277 11366 +15920348821148864006 11371 +9531270652648965130 11377 +9784481004640090628 11387 +12966974478091550213 11391 +1643937058889700360 11396 +5025950136765072387 11404 +9912938469468120066 11407 +7043797904654924292 11409 +1185627076723265029 11413 +12234571795876955649 11418 +7315373296823703553 11419 +4061426953675026437 11420 +11067669453362241538 11425 +3845507233029208067 11427 +5025561255885039110 11430 +3264702445534073862 11436 +14116060576118215172 11442 +5771158121533248515 11446 +1848470421091288067 11449 +2770039776989556742 11452 +5477935103595528196 11458 +6475183985274578947 11462 +773085324551381506 11465 +17411116705110327811 11467 +15062507297024424455 11470 +17594729013654014470 11477 +14967532286016330754 11483 +284742764616427527 11485 +1144453939906270211 11492 +9471616404805601284 11495 +12282145712696474629 11499 +10190664955465169922 11504 +8048278609529820677 11506 +298528447369236485 11511 +11149915974004236804 11516 +8817544343138510342 11520 +14441523019754257923 11526 +9695995797510974982 11529 +15204503392937620995 11535 +2559340425437576195 11538 +0 11541 +6249985535787450374 11541 +1946490094862362118 11547 +6220148814487725059 11553 +9428403997949610502 11556 +15898049804714035714 11562 +14204256644721205767 11564 +9429261853349131777 11571 +8805105851544437252 11572 +13810865754493046787 11576 +17487563049738143237 11579 +2583777445855208964 11584 +17654524173139259396 11588 +7547763676844314629 11592 +9943793380923699207 11597 +1301931596123948546 11604 +7251306843178537989 11606 +17584064034697726472 11611 +14311603627559650309 11619 +18407335282295150598 11624 +15347704461076126212 11630 +13588750264116107783 11634 +10672460664958725639 11641 +14552375599508129282 11648 +49864273448564226 11650 +3795273357641029124 11652 +15699379307845374466 11656 +6539045620661557255 11658 +2191333861450763784 11665 +2987736989058896386 11673 +7040925860428535302 11675 +11644374922047164421 11681 +15788812492742214146 11686 +8314360951945556483 11688 +12367668260321109506 11691 +1380139510655159302 11693 +1817668430503911425 11699 +16592192816951549956 11700 +7823410726699291141 11704 +10817647816044563461 11709 +5449916453682273285 11714 +6234304331607127045 11719 +1039881239098415623 11724 +1857609987634035204 11731 +7194683361082503683 11735 +11418669976090193924 11738 +14501952461658243586 11742 +16209911840739923462 11744 +17586511569719025159 11750 +11875098886626057217 11757 +5773941053930340364 11758 +11218672869958663681 11770 +17355195642916319747 11771 +596300132709545987 11774 +894230484014964739 11777 +11660170555642300423 11780 +13561074458394271239 11787 +5845557735444752902 11794 +10940853873769988099 11800 +2032868814077970435 11803 +5570380417392475141 11806 +11038214882798309893 11811 +16751249052219128322 11816 +10682459443423358980 11818 +13755602814254840327 11822 +399404366132365318 11829 +11303625657769971716 11835 +15361375525002049025 11839 +3593880786615056902 11840 +6153110964231758855 11846 +3408568766455044612 11853 +2613756108711896070 11857 +7162419239222155272 11863 +15596832943452218883 11871 +11035879024581125124 11874 +12754700447425886723 11878 +17623563204529450498 11881 +3473362933666854402 11883 +17729995502832382979 11885 +9011868493632731654 11888 +8039899295533382148 11894 +11574100708719175171 11898 +5580494255534806537 11901 +18050138787176917511 11910 +5751778203372149765 11917 +7666439677108759045 11922 +6500043206451679749 11927 +5409916806480033284 11932 +2648194152109708803 11936 +6813014681138504195 11939 +17154133471469917702 11942 +1976658341818715650 11948 +16391075952094730755 11950 +5725912388862940162 11953 +4418977178573759490 11955 +1602727285099148803 11957 +12803049396276139016 11960 +476873196437625348 11968 +7167024206413698562 11972 +2523392979810050051 11974 +16397316934195009539 11977 +6094124922530847747 11980 +8831350887987372036 11983 +124229872722288644 11987 +12187439331895134723 11991 +7690170544759371778 11994 +6274662766724895235 11996 +10100854916226607621 11999 +9635921847911966721 12004 +15146577740220677637 12005 +7595608988833091586 12010 +1574411728090629123 12012 +7288115052453725698 12015 +3333374725823008258 12017 +18341463172089921029 12019 +11115816530229093891 12024 +285782829490242053 12027 +5022965320417460738 12032 +6327238504762587139 12034 +10583342242587824134 12037 +3598858360147405313 12043 +10457539457748952070 12044 +6861766570654233092 12050 +5054635241207285762 12054 +4797368229783220225 12056 +10246128304373002756 12057 +4048332415060676100 12061 +5661842674235586054 12065 +10285820565933157892 12071 +5456768557806448129 12075 +9990291381903555074 12076 +17300757770274511878 12078 +3708780586652234243 12084 +10197729552372943875 12087 +2034706296656871942 12090 +12082191349316013571 12096 +16098000176991273477 12099 +4446897088013577220 12104 +408390414726710787 12108 +8587290746204137986 12111 +8663027054730379780 12113 +15067038856679949315 12117 +2263412900109087747 12120 +10062768421990064133 12123 +1875998724176752135 12128 +7537979749142836227 12135 +1497570584526162437 12138 +7301218277919791620 12143 +17331926611846008836 12147 +18226016421663860227 12151 +10058552640034791940 12154 +1170251819317689858 12158 +9646564143928013320 12160 +4453037263313635330 12168 +6962469811386884099 12170 +12280506437046000647 12173 +13158051540917503494 12180 +7612145523489810947 12186 +13229803994314446851 12189 +12374948234057884676 12192 +5934231992991468548 12196 +2027186672207029252 12200 +3339477519890886146 12204 +16202048369050547204 12206 +11675498979911361031 12210 +12649949830816608772 12217 +7383272898681845251 12221 +13297711486873803780 12224 +17337932264249900547 12228 +13132855211000912388 12231 +10238598893283246596 12235 +15525260749411561987 12239 +8245968052979646468 12242 +9085512413700462085 12246 +1733946937260674562 12251 +16194737545186107397 12253 +3416073302901824517 12258 +5732670094069629445 12263 +5154044050835592708 12268 +8928672328638101507 12272 +16500081914247865860 12275 +11457908882222400004 12279 +5383574978705684483 12283 +7992379473327263236 12286 +5706837052198251014 12290 +5037665405868295682 12296 +15035896221645178375 12298 +15071844376736250887 12305 +15309996504481610243 12312 +15562933963848776194 12315 +163186906932188677 12317 +2374130499855504902 12322 +2569508991103655940 12328 +789463164449538049 12332 +218699959633792005 12333 +2911202957764233731 12338 +16628251580066183169 12341 +3513659068269389320 12342 +17528030977884150275 12350 +17091719929957530627 12353 +12704570934888002568 12356 +7780569958686943747 12364 +11854526675725734403 12367 +16311299314628239875 12370 +2467865151723842052 12373 +3891723201477266947 12377 +7432470032878099466 12380 +6276064233275015172 12390 +16449223821050769926 12394 +17493427954559926282 12400 +8092301951301211651 12410 +5099387185001664002 12413 +14387467479461305351 12415 +7537635068892791811 12422 +3255383268726903816 12425 +6146940525328033796 12433 +6260339012215173637 12437 +7287427132736029697 12442 +17338169107851802627 12443 +14349623228242155522 12446 +9736536319467479556 12448 +13137764970903396355 12452 +11487018781893929986 12455 +17231539835066243586 12457 +11520918084194792457 12459 +10426866417109009412 12468 +3274772142961110530 12472 +17784008328646559240 12474 +14089103292409059335 12482 +16791673186303537156 12489 +11119143991563088388 12493 +894317219907478021 12497 +1846189274497208325 12502 +14855749648213358596 12507 +15130410407043989513 12511 +4524149031169393667 12520 +2885943511763185157 12523 +13236531404794437639 12528 +9118193217884600836 12535 +13873321717923463681 12539 +1663527571813521413 12540 +14819408989220880901 12545 +18161914237887760390 12550 +16014208034229212677 12556 +513947383245219334 12561 +5740744584026816007 12567 +10343811303471552517 12574 +15739276310402680322 12579 +15635008341117922818 12581 +16948367489848861698 12583 +1325326982286721027 12585 +4675046412174859787 12588 +16486616322706164740 12599 +3555076431405758470 12603 +8640274963046855684 12609 +6116889213133005317 12613 +3308843584963152387 12618 +6402423448082731522 12621 +0 12623 +17868168998630654470 12623 +12654613131474554372 12629 +4754188914126380549 12633 +5453284171923587074 12638 +580391655670834692 12640 +13633767766973540358 12644 +2488236520765891076 12650 +13026889860929734659 12654 +4812962054397270536 12657 +2032379257593710086 12665 +10088452525800258052 12671 +7155467404188659208 12675 +15012543646266144262 12683 +0 12689 +9096321115467605508 12689 +2715108319420481540 12693 +1265708709027761668 12697 +15952536304094332930 12701 +4328159326779637764 12703 +5933972816208578561 12707 +6259615535158505988 12708 +18269983011477771780 12712 +14304362429173707778 12716 +12912910306911097862 12718 +15570374910949471745 12724 +12492912423369602054 12725 +823228847178436099 12731 +12317786358713568776 12734 +13201550128702444548 12742 +16079955468184666630 12746 +2752729477835092483 12752 +2685265298172668418 12755 +7287670561661523971 12757 +8671779289390229507 12760 +12402492188041614853 12763 +4100560198601192454 12768 +12734470718857046021 12774 +8838785157774217732 12779 +10696957862127249924 12783 +9781204748968359428 12787 +6070342433697036293 12791 +9643378786854654977 12796 +11572216010584511490 12797 +10059536597792601090 12799 +9406143597723672068 12801 +5254296983295501318 12805 +14307823916223887361 12811 +5790519023002238471 12812 +18271648307123489285 12819 +12552681577988588035 12824 +12528420600322198534 12827 +17623351351668504068 12833 +4629283171925294083 12837 +11006098158073645063 12840 +14617645329556959237 12847 +14866100704650270723 12852 +7735296188210820609 12855 +821095099886467078 12856 +1536287959958034948 12862 +7026063904827670019 12866 +6499799045302352385 12869 +5329641989986046469 12870 +17907949365883158532 12875 +17255179269283389956 12879 +12038853369471574020 12883 +1913785476450866179 12887 +17541958249612304898 12890 +6400100034733133827 12892 +17888335291578516997 12895 +16551020404006986755 12900 +8338343950712385538 12903 +8625070551922107906 12905 +10607422600534723585 12907 +18185398980507590145 12908 +10758291994558754823 12909 +3796493522275537413 12916 +11636305925542507012 12921 +9326831394961205767 12925 +17115728663313327621 12932 +17563665777558564867 12937 +14661707505813122565 12940 +17689517334147042306 12945 +10390635386634774023 12947 +2958644431372989959 12954 +7041483358595062275 12961 +4865413367700044292 12964 +724553891628253699 12968 +6998047259955038211 12971 +9362821945656839684 12974 +9448487723764304902 12978 +144089847388858371 12984 +14978862317302686723 12987 +4129555248861789189 12990 +10369235039041423362 12995 +12790191367069788676 12997 +17900944791829118981 13001 +3853996994672590340 13006 +17927977380159204866 13010 +7749251660409837572 13012 +3873072447389703689 13016 +6768454598047388165 13025 +2644651223500616195 13030 +8146029672905009157 13033 +9153728993592977923 13038 +5370910663005533186 13041 +10555050654285684227 13043 +12354828783962266119 13046 +2318552557533552645 13053 +42357009183186433 13058 +15586490688155257859 13059 +12738379956279528965 13062 +8879028841315976194 13067 +16361646613202452484 13069 +7447666535979319299 13073 +796418699629325317 13076 +10393852123208993286 13081 +620242481835686403 13087 +7316941950227565575 13090 +8175917706647117827 13097 +5284307042952117256 13100 +8763046016892901380 13108 +2336269719675799047 13112 +5164403014025451013 13119 +8630208071335337989 13124 +13288934062879607302 13129 +4820486226265399815 13135 +510569821395456003 13142 +13698202987468466180 13145 +7779550692380688390 13149 +13753655595128105990 13155 +14099451325941346819 13161 +11481145755856673284 13164 +7565186265506411523 13168 +5560449621617437700 13171 +6613795504271717894 13175 +14950766918397400578 13181 +13682683082808141830 13183 +3896845345470642179 13189 +9677700292420613635 13192 +12452279160780317189 13195 +13656791808808619009 13200 +3139787766770210311 13201 +13486941691601507331 13208 +17169173453208012294 13211 +3584462006487300102 13217 +4001866027667285507 13223 +14146386274168823809 13226 +13417986052057377795 13227 +17168265051322583556 13230 +17895277887072309762 13234 +4971716006631138822 13236 +15288673763400620548 13242 +3701695728423198214 13246 +10651720850712643589 13252 +641131955639056901 13257 +10936803264958521861 13262 +4609941053054272005 13267 +649775986040987140 13272 +13779247008987272708 13276 +10434573770024776195 13280 +11006184570306131458 13283 +5170108788894986755 13285 +4331420277771149830 13288 +2127303499172962312 13294 +15979902818481013763 13302 +1591435171124646408 13305 +5728091639638540801 13313 +7253385354127659012 13314 +5709603076666696197 13318 +16765239374568064518 13323 +834176432430348805 13329 +17293630159502462979 13334 +8510053969959589379 13337 +15819905031661099014 13340 +17374472113772409858 13346 +16689565223059042309 13348 +5498502190398603777 13353 +14930667686662392836 13354 +3377919637269278211 13358 +1348659360727891973 13361 +1614299063805460998 13366 +4006503646146766852 13372 +11965637870571013636 13376 +2556733459363944455 13380 +7004126662023957508 13387 +2284558198032555528 13391 +12014097582845680131 13399 +11346939189282498563 13402 +14665471866471160322 13405 +18347535002892492292 13407 +14349252194434425859 13411 +0 13414 +4733395496660409858 13414 +11172087760091276289 13416 +6394247879872563206 13417 +15379844851350937606 13423 +4108841883850038278 13429 +13198749425591336963 13435 +13989387587925279236 13438 +14283886164633494537 13442 +3608977183409216004 13451 +8252756752000377860 13455 +14785327539145158149 13459 +13639977114562667525 13464 +12684052000906823687 13469 +3949864629946914819 13476 +5358471506712795658 13479 +102889710578678274 13489 +17430512309889695237 13491 +14158606416610028548 13496 +8411563209508800003 13500 +488549287480365057 13503 +8538419886126713859 13504 +2270354928139360262 13507 +13497390908973134852 13513 +3088362747958582277 13517 +15572053744028430339 13522 +6229840809979436036 13525 +13128663884400110084 13529 +5509098232929805314 13533 +5009071276596693510 13535 +1701788384429507077 13541 +14644805489198816261 13546 +0 13551 +15015812326435543557 13551 +15313982816392451079 13556 +0 13563 +5912692170729751044 13563 +2180668712114711559 13567 +8702204258200401924 13574 +11108335245208602628 13578 +10094606800129130500 13582 +15462861619574099975 13586 +12018147818671197185 13593 +7966339695277654021 13594 +6611386221212356100 13599 +10446065579221105156 13603 +12315245106022811652 13607 +3985300817223362563 13611 +6957074124972124675 13614 +3978820081569705989 13617 +8876331275203961861 13622 +16704134203057569285 13627 +14084586860681961986 13632 +850036066666319876 13634 +12210679201364297733 13638 +9207504706235208706 13643 +15725398577640609795 13645 +11868840248791104516 13648 +6852788178413372932 13652 +46691743954518532 13656 +7165981905539315716 13660 +766314503744698884 13664 +4807721064448995843 13668 +11016274339685648387 13671 +9862257514506298890 13674 +2381226845569165316 13684 +2764157120372607492 13688 +16402170409849930244 13692 +7556893451406763010 13696 +6316292941467259906 13698 +17847351167669830146 13700 +0 13702 +3327359560691641350 13702 +4346929752600015874 13708 +5864334767347471366 13710 +12393913002618683911 13716 +8574332758891649029 13723 +14131927646167949827 13728 +17467234980946554884 13731 +2880461726012977668 13735 +5557134369089540613 13739 +1738481621785257985 13744 +3113367742836904455 13745 +8216263702935451138 13752 +6432000147498659331 13754 +15410839596034223106 13757 +1717810013562137609 13759 +6750721254412587013 13768 +4377339015629541891 13773 +3629271360068778500 13776 +15963830199808040451 13780 +9452601884665975811 13783 +17137194405420894724 13786 +9947806573241773061 13790 +4648330291429796355 13795 +2346063359091572229 13798 +1122579315551184389 13803 +7299343842390453765 13808 +9186076952210210823 13813 +2687118423995931144 13820 +18174598580460227586 13828 +12466468644306437126 13830 +12492842772074170373 13836 +5373496496164223491 13841 +13048024109776895492 13844 +13889718738469905410 13848 +7189231886305948166 13850 +4526619414887711747 13856 +9447027695450776068 13859 +13283245592125653513 13863 +2598926677069956610 13872 +12917707438100622851 13874 +6048266495097297922 13877 +16596845989537953282 13879 +5056157207811663876 13881 +11729166343437158404 13885 +11039943393643901957 13889 +12356229825502872065 13894 +15695948972322485253 13895 +766170476791724549 13900 +8595394586156911619 13905 +3450909172921139717 13908 +5577993803516288006 13913 +4125016664753752578 13919 +7991572477426046468 13921 +18082817874172110850 13925 +3566400335352195588 13927 +12670788428691484162 13931 +15199000295278163458 13933 +7621276768927185411 13935 +10071887159078387205 13938 +15755215010253538820 13943 +2869488861817903624 13947 +4838750387002504193 13955 +7254593680116738051 13956 +10201020860478545924 13959 +7821309847286795268 13963 +2169236276964706308 13967 +9150468761293675525 13971 +3523998903586711557 13976 +2331730765575973379 13981 +3664255523636237316 13984 +2872527500647571460 13988 +3965077251437073923 13992 +4097027292794322434 13995 +379561933242542088 13997 +8289645478672230403 14005 +3957467186361093637 14008 +10397366722849224706 14013 +3135907583418449925 14015 +3281027056278354945 14020 +6874347795961347589 14021 +17745154653628923396 14026 +15131689054395375619 14030 +378748089677818882 14033 +16556239616858798083 14035 +1480008932828151298 14038 +11337848262105739266 14040 +17044498590888268806 14042 +12460223807705607172 14048 +6944601834124076547 14052 +14889331329313073667 14055 +7636955800060440581 14058 +715082391864298500 14063 +9991761640834763267 14067 +17114001043696195588 14070 +16168836561093885957 14074 +10210795564438713862 14079 +6701614819555832321 14085 +10141355494572213763 14086 +9154757699909436422 14089 +469974584079077894 14095 +7196240529936990724 14101 +4985357608701852676 14105 +15195490015551094277 14109 +3368994145784687623 14114 +17434151454501212676 14121 +9457517818048842755 14125 +1768725680496821762 14128 +13427349994538706435 14130 +9263665107637164034 14133 +10608108282283479554 14135 +1368232015823247874 14137 +7914950254448722945 14139 +0 14140 +12126976933228132869 14140 +0 14145 +636008185919031815 14145 +4860962044772342273 14152 +16664594326734770179 14153 +11047758173216836612 14156 +1998441497648265219 14160 +3463454502816609283 14163 +14817044404181010435 14166 +4547776671167556100 14169 +8720085586915009027 14173 +16465409589149638146 14176 +12885173566785081858 14178 +12323814790337526276 14180 +6981026610677000708 14184 +10088170875332047875 14188 +16128395619967168004 14191 +9468085413793489419 14195 +6804022343743081479 14206 +1323245391918545925 14213 +15195122444227756548 14218 +15468795188388805128 14222 +17708115886062396932 14230 +17033027666144693249 14234 +1681709375263737345 14235 +759823122463008262 14236 +16862108443071344642 14242 +9450047359755266565 14244 +7282967561046564359 14249 +16515892561531772419 14256 +14646346744478798339 14259 +15343589174032061957 14262 +15689868625755791363 14267 +15393696718717471749 14270 +12396339454241723400 14275 +2762786704366278151 14283 +14184493200535955463 14290 +1412481280722182148 14297 +8658012357964138500 14301 +17256918933230412803 14305 +9303680016602813956 14308 +17529344406904303619 14312 +11151741872503053316 14315 +11917798225547361797 14319 +16876158571219275777 14324 +17237863691443182598 14325 +2820790318209027 14331 +2596197339001857030 14334 +12244471639906340866 14340 +998685063913405956 14342 +2128681327196598276 14346 +5066511538062769670 14350 +3912773679936741379 14356 +1439041230078897155 14359 +3026804635494988292 14362 +12488582281661418499 14366 +2062186326566365699 14369 +6799083705653247493 14372 +8951171796981298691 14377 +18232248882517506562 14380 +9801358008705360389 14382 +2174168591314342916 14387 +2604205838426414084 14391 +15129821281555459076 14395 +5901417477871491076 14399 +7275640636939515907 14403 +9948969004755812354 14406 +6377122036890004481 14408 +553472616221064198 14409 +5685897707846745603 14415 +10900569788921862661 14418 +5044695554613343750 14423 +9596765205478535173 14429 +16965363306861059587 14434 +619325970224673793 14437 +17463104645387872774 14438 +16771797554315316227 14444 +8666221890938308613 14447 +5681861339507941891 14452 +5317206559945816578 14455 +2935208460468603908 14457 +0 14461 +3930674651844854278 14461 +16121381279578775557 14467 +10317916537586138626 14472 +5993708502240130051 14474 +17367796168985006089 14477 +12759148660175714818 14486 +2927524856502185988 14488 +14672893933279028739 14492 +16852900123190059523 14495 +15229530658818815491 14498 +4690871338115212289 14501 +8894927937752535556 14502 +12861051220105064451 14506 +14884371175840240645 14509 +11178427925471414277 14514 +18188593649669771268 14519 +6696710157204428808 14523 +1207513741180139524 14531 +3797259859694168070 14535 +13977650570807476739 14541 +8058739033811569155 14544 +12690562994781760514 14547 +4752046372867473924 14549 +15228283706397346821 14553 +1478147256859662340 14558 +10713443314846721542 14562 +3140632229234402309 14568 +8684659658389647363 14573 +695232621969144836 14576 +16263586557920580613 14580 +7661934549599697923 14585 +8177131190164950535 14588 +11891188174880621578 14595 +16086669622174757891 14605 +34314122859174403 14608 +3594937943595274243 14611 +16848227598195705346 14614 +6242127403411206147 14616 +4048060282730411527 14619 +1132478360341346308 14626 +11918530470134006273 14630 +7673294071924852743 14631 +10248912839993957890 14638 +17484222520834023938 14640 +8238657067378605062 14642 +586570751923824132 14648 +10449679533362771972 14652 +423656487004309507 14656 +10332771388554981892 14659 +9963328636015181313 14663 +11974757570829606404 14664 +13705663900201014276 14668 +13437930391559629829 14672 +5342356103370053123 14677 +7374318946160020484 14680 +2165305090669163528 14684 +2240333376775918596 14692 +3201033445463289345 14696 +4634125266024213507 14697 +4082912304890270210 14700 +13184886133142467589 14702 +11984188551470290947 14707 +12414459824537250819 14710 +9013264609575864324 14713 +4808215949531384324 14717 +1343643499920283651 14721 +8121071173151668226 14724 +12495010560166636036 14726 +4111029144814939141 14730 +1482348292357600260 14735 +10598248552891353092 14739 +5389944794103344643 14743 +12971356648795453960 14746 +13103247038026437121 14754 +16835225207429819907 14755 +14121531338859786760 14758 +7320357243697516547 14766 +17344323402780168197 14769 +9405715264091817985 14774 +7456009970881625603 14775 +17189560695826353666 14778 +9922258694630265860 14780 +4690581910158470658 14784 +6286768843935578118 14786 +0 14792 +5174055524629459974 14792 +1435639132727830021 14798 +3338229659503958529 14803 +3965714820552386050 14804 +8848893485647221252 14806 +11035370398744499205 14810 +476622342343141380 14815 +4720016498684646403 14819 +15031254686744351746 14822 +9570544137382290435 14824 +9616066838463326723 14827 +17681437379797414916 14830 +10801034798127029762 14834 +2590301749387853829 14836 +12472710578691957763 14841 +3165631498274360835 14844 +4230396654960381448 14847 +1352646332065229828 14855 +9436990105423903748 14859 +4158774841487408132 14863 +6110793500646375428 14867 +1259327833164251654 14871 +9861658306950881797 14877 +3247001240965254150 14882 +8714971430361825282 14888 +13742095595255667718 14890 +1683052621512219143 14896 +15759028262094447621 14903 +2240999390449840133 14908 +10913669735636742148 14913 +11368266842447943170 14917 +5068444565112509445 14919 +16732291222238322692 14924 +6911164108251180550 14928 +4584028845649568258 14934 +3829140703962784773 14936 +6008635652072227336 14941 +1927461419521318914 14949 +17036348914915182085 14951 +10425585270628024327 14956 +4575451159616940552 14963 +7892746064427872260 14971 +11595349022342425090 14975 +10495121724373179909 14977 +15213023795063453189 14982 +17883757296817613314 14987 +13178664577999652357 14989 +9823110730128268805 14994 +13359762586489587716 14999 +8420831374730216965 15003 +10126871538047552517 15008 +17859294786417719302 15013 +11582938404331821571 15019 +3868101667326982661 15022 +13340210189027849729 15027 +2432867656297835014 15028 +6696980088061065729 15034 +13465122793740290052 15035 +3696012896036672514 15039 +17658285848196150786 15041 +8729411062716148226 15043 +14111220715442704899 15045 +7756720602202411528 15048 +7428305090212489732 15056 +18316797470175985155 15060 +16700748657699112962 15063 +8175652146851875846 15065 +18414538870926371846 15071 +10041066745724385798 15077 +4489661711442092546 15083 +1039356630524263937 15085 +1583324077848630787 15086 +11372063324156425730 15089 +7506720143314637828 15091 +2075708868273115142 15095 +526660331558762500 15101 +4794702593733836297 15105 +5278133248122283521 15114 +8019740821924173826 15115 +15503431192425241090 15117 +12880128004135637511 15119 +7846280832097641475 15126 +297075817567129090 15129 +12953022025960471557 15131 +11306056203329869830 15136 +17511071961252716034 15142 +13095251297286985735 15144 +7946769881397969921 15151 +7474448453762291203 15152 +14807414146736159749 15155 +12463332113723542018 15160 +10605933972133315081 15162 +2845962986766749189 15171 +0 15176 +1286058183080222725 15176 +13873665827264638467 15181 +3739411198202435590 15184 +5192153527954599942 15190 +12098192821455622661 15196 +5224919883347613700 15201 +16356531266454579716 15205 +6765243305419612165 15209 +3023103569010802694 15214 +12826233200101012482 15220 +8921759050859782659 15222 +9470393648649655809 15225 +15908360876699588615 15226 +6109894551971410437 15233 +9313980885207140866 15238 +4552674908779376644 15240 +15992677217274220034 15244 +15771734288629485061 15246 +50298245800917509 15251 +18384903805962415619 15256 +4727711469018279941 15259 +16558370807573327364 15264 +8175124542381266437 15268 +4941315667547116034 15273 +16706412937813292041 15275 +3101092822690895878 15284 +17706760698052840450 15290 +208690807718127109 15292 +4306590821041546756 15297 +2590803204107528194 15301 +1578255844834359811 15303 +14150285258378114563 15306 +3023721242759822340 15309 +6467845128887501317 15313 +16409380545984562692 15318 +7589144827300874758 15322 +11670464649319070210 15328 +16043083996193837573 15330 +17212338070900969475 15335 +4734711485195715585 15338 +8921359965899433987 15339 +14386339843214561796 15342 +1377580987413732354 15346 +3236579081575897606 15348 +2428737613692577794 15354 +2610480095021974019 15356 +6355004016849004039 15359 +8875662082840143877 15366 +12597979903834980867 15371 +15632648488428743171 15374 +6416856010745475590 15377 +6339381203774848514 15383 +5484387702964357635 15385 +8562822497955832323 15388 +1670357196292852739 15391 +8377037021631952899 15394 +13652988527907871749 15397 +4706332753594769416 15402 +6990688474905527811 15410 +13969226187276543491 15413 +2986054745447290373 15416 +2833435701828413444 15421 +18024362064211850244 15425 +14445091677290663427 15429 +9666567425064961543 15432 +15372228030541763587 15439 +1419715726823519749 15442 +14934364705928793089 15447 +15315903716035083270 15448 +7001788900975590404 15454 +2836268651943508998 15458 +13995404921015748611 15464 +10256226077386344451 15467 +3215368207532838915 15470 +3387764928622885382 15473 +17815945569439229443 15479 +1546765437283806209 15482 +3440460593144801794 15483 +13520112112364152838 15485 +2598541340155435010 15491 +4582541906333661702 15493 +1586364523858296324 15499 +10144393081903831043 15503 +9952334817542236673 15506 +13260418032357864455 15507 +6245883550883555845 15514 +10204885924327643146 15519 +4417729686018115078 15529 +7911817694342999557 15535 +14808982502210011650 15540 +4181373649630806018 15542 +10239510052312035841 15544 +6780904986473687045 15545 +349913727656000007 15550 +9137384197622555141 15557 +14037645922961310213 15562 +9779186370106571267 15567 +13566928121075175938 15570 +3390855903064700935 15572 +8926993066275933701 15579 +13513151896934512645 15584 +9483193465219613191 15589 +1274624467205289987 15596 +17757544554910910979 15599 +278466452457639937 15602 +9117038353576732676 15603 +10002138018000786439 15607 +7357413388698162179 15614 +11899397520499201030 15617 +12243888344393871364 15623 +17056763599856595459 15627 +1172256188268982277 15630 +2021682254269863939 15635 +6429602178581417476 15638 +3333359302196577799 15642 +8547900897941994499 15649 +10882266720229368327 15652 +17194908467903874564 15659 +334948604690802181 15663 +2652758166108631046 15668 +14074064769615117315 15674 +13699024342383627266 15677 +9953597667540445702 15679 +7008974410780808197 15685 +16467311737560121862 15690 +6479738013562875395 15696 +3404964828954926084 15699 +1714883784688296451 15703 +18146642697057819652 15706 +3709760797302150657 15710 +18336741383645638659 15711 +7893113251521908740 15714 +5345417721386634757 15718 +9122044713185760772 15723 +2354654105463245316 15727 +16785268717599004164 15731 +7987742067712178692 15735 +10490190920522809346 15739 +3170173109973938179 15741 +9260925724752190981 15744 +10640812112236239363 15749 +1642515808129614856 15752 +17141905772803363846 15760 +11841091414254755841 15766 +1216583441154010120 15767 +4962587737873884677 15775 +5668058488478943234 15780 +1281748476873197573 15782 +11879209829635119108 15787 +2346425083818750471 15791 +13220371247435689477 15798 +8095441867369053699 15803 +919995268913232385 15806 +336311605568019460 15807 +1341681118263824385 15811 +369125198150925317 15812 +15411396266102503939 15817 +14102360298987704835 15820 +554045474745956870 15823 +8685384008276641284 15829 +12272972551007807493 15833 +17873976391172805638 15838 +11036266599458423815 15844 +18073498993510290947 15851 +16590203594424707588 15854 +16793505050029957128 15858 +5697089723162491401 15866 +8179660498997708296 15875 +8564404933221510150 15883 +14838233497551376898 15889 +6085660447197327362 15891 +7054886686922217479 15893 +14228552636089370115 15900 +6740953323605007366 15903 +14263756478043115528 15909 +17463498621367737862 15917 +9471444730727557635 15923 +11652920205869637635 15926 +17939723766604202501 15929 +8345915340052857862 15934 +13267208851156870663 15940 +4658190260877463554 15947 +12020571955563955715 15949 +4540774123575580676 15952 +9435015141837475846 15956 +10811940319855350275 15962 +1747946402829138945 15965 +748434706708057091 15966 +11455736466596600321 15969 +7680676038787307009 15970 +8417727135618744834 15971 +2703019464499341826 15973 +7744965464580140036 15975 +8341995853856345093 15979 +18143774072530375683 15984 +2501853218585253378 15987 +6437506091307810308 15989 +9245958780765400579 15993 +9092513873131530754 15996 +3812942197995265027 15998 +9133202703057518085 16001 +14397310461485528068 16006 +16569732926638375942 16010 +10138256775774147076 16016 +17261912144566325252 16020 +5640568049907868166 16024 +4197218387920133634 16030 +5646961491672636931 16032 +14558939509781943810 16035 +2911338728750615554 16037 +2376490351657288708 16039 +8512156260500680194 16043 +15580686649104837637 16045 +12993612670813446658 16050 +2647509485781278724 16052 +7316805237355362822 16056 +3418361753791092226 16062 +12030726198541006851 16064 +8394492618447363590 16067 +13989049383475433988 16073 +7361319983530954245 16077 +6502764476511013381 16082 +1632409729941813252 16087 +13646102408383139333 16091 +18069274506524926977 16096 +6669564156682715656 16097 +8892729009627695107 16105 +9207104110232402948 16108 +8779588181963749378 16112 +15498091709226978823 16114 +17235247923695785474 16121 +14349465717470398980 16123 +9848242102152511492 16127 +5656441832146008577 16131 +16804643395750349318 16132 +1257386423199225348 16138 +12282218808797510660 16142 +1618971420622280708 16146 +16315989985407112194 16150 +13865405280978754054 16152 +2418318251182999045 16158 +4105011142311218691 16163 +0 16166 +12566056733534590980 16166 +126465616806839809 16170 +5992817857174322691 16171 +14737633106591159811 16174 +8417310370458819588 16177 +2201420094321446915 16181 +5012642309690880004 16184 +12946715582772431362 16188 +0 16190 +14052915698110093318 16190 +9785393882705586690 16196 +12547484719715841542 16198 +6071898864872510466 16204 +3813043822356018693 16206 +5602589953530252289 16211 +2608709128484382723 16212 +2557133282544140296 16215 +1586437238938993666 16223 +15711909082943240709 16225 +6198941775203910660 16230 +8271285411029511685 16234 +14615494694258257414 16239 +7068677962648663555 16245 +12715193918272598532 16248 +7223203206941533190 16252 +8882183166947670021 16258 +18269871561067245570 16263 +15587801210274869252 16265 +18207561010684728836 16269 +11100151176765233666 16273 +1285498194788984839 16275 +13192468431206089733 16282 +6287825090161134594 16287 +16724760138842056197 16289 +5884117568059714565 16294 +12941102413096888834 16299 +6622777145831669254 16301 +14772047136249833988 16307 +15610502663053962246 16311 +12831015294337335299 16317 +8624267667819816450 16320 +11261126856066316802 16322 +13528938045709939205 16324 +12198631373220199426 16329 +13398439159582389252 16331 +15857795567729800198 16335 +12352104541139689474 16341 +9274914527810039814 16343 +702454016114968581 16349 +15602717501974289923 16354 +2806974863955908613 16357 +7041897447867445762 16362 +6352276231854495235 16364 +3081553419699629571 16367 +10018596350695881219 16370 +9226759684216695300 16373 +5484235384745911300 16377 +5981391395751935492 16381 +4761853650522420740 16385 +6272975268901123587 16389 +15221799053909079555 16392 +8430526126028399113 16395 +369730742782402049 16404 +12413587852939838468 16405 +4036729303512247302 16409 +2250216254980095492 16415 +4668631441353387524 16419 +4185303196006019590 16423 +16629526464646243843 16429 +5156124550981460994 16432 +6075619365071382020 16434 +0 16438 +3781779623239674885 16438 +4893370940761616386 16443 +17869341415064270340 16445 +9398021468171766274 16449 +2273412565753078275 16451 +6282093220726712325 16454 +4704266587323164674 16459 +10856019830221989894 16461 +15663346086628149764 16467 +7222995980596117509 16471 +13029103367303492620 16476 +5087457670153001480 16488 +225223431864373253 16496 +3219360281461238275 16501 +10004941562876051461 16504 +12001389841890265094 16509 +13051984053586690051 16515 +8996177785259784708 16518 +2136320281732527106 16522 +5063172895175473667 16524 +8123086885979539459 16527 +4085999784011572227 16530 +16059562907573646339 16533 +3786132709828354053 16536 +3226797779441827333 16541 +8689841472937724421 16546 +4706055052411879428 16551 +1623281896139976711 16555 +2946165402314335237 16562 +2405131599623872005 16567 +12688207144465868292 16572 +12459559041471744003 16576 +349470221539531781 16579 +2469058044036867589 16584 +18179561078083749889 16589 +2215360586151045122 16590 +13943601939637107203 16592 +14595089759166677507 16595 +11635505134491000322 16598 +2982886423678641669 16600 +8531688839562000390 16605 +18159513174021168644 16611 +10405880675893783555 16615 +1793729362566111234 16618 +12038855344822921222 16620 +7016728969884160003 16626 +6478196453694643207 16629 +8547896641422907906 16636 +7366164450540494852 16638 +11955055645023411715 16642 +0 16645 +8379066048458684931 16645 +16321090229174130182 16648 +8184777933419068427 16654 +326861412654772225 16665 +9862724270187164674 16666 +3468863279714081799 16668 +17909949261302713860 16675 +16369105741604074501 16679 +1467646096142008322 16684 +11678028931218645511 16686 +3123227819826895361 16693 +16781416291982414342 16694 +1727341905071477761 16700 +2098348348499217923 16701 +17841359304115988484 16704 +325186531284464133 16708 +11435465598425768453 16713 +420781934768594437 16718 +13811053393967896071 16723 +8469890554354015235 16730 +0 16733 +1451609760141172225 16733 +15514648386756162055 16734 +11214566030594397700 16741 +15927454551777871364 16745 +12110841366828704259 16749 +1616568611438039555 16752 +17850058847101105153 16755 +14424066717601718786 16756 +5903187679998437895 16758 +15010951884936623618 16765 +13518898346434727426 16767 +13614496146759390724 16769 +2893008676570222083 16773 +7525782369018380290 16776 +14607496926925752836 16778 +16070170373201868291 16782 +7737193415900620291 16785 +955403767543388674 16788 +10877264563968900613 16790 +8310598819938640899 16795 +6073516344142813187 16798 +17361541376663459845 16801 +11911214172662138883 16806 +18096346710455122438 16809 +7079686971748048390 16815 +6426101757712751617 16821 +7988806062504075270 16822 +8923011506461640195 16828 +18060575970666675714 16831 +673018014318471684 16833 +8365665247181490693 16837 +4456555030993593859 16842 +9558553754630840323 16845 +7916061050908743173 16848 +3073234565033522693 16853 +9269362997721353730 16858 +11700195349721689089 16860 +11881804436586238980 16861 +12765120286981603333 16865 +16323771027846317573 16870 +6789946304160911363 16875 +0 16878 +10264329450424921605 16878 +16992073899899176453 16883 +7515343229939199491 16888 +300941563134091782 16891 +12643522219454725126 16897 +14817093015374053895 16903 +1784549552539223557 16910 +896298698643004931 16915 +16092195014717931014 16918 +7693254716865759234 16924 +16241029966822156293 16926 +14482509326338971653 16931 +12223179682782718467 16936 +2868463103161070085 16939 +13277836299489095171 16944 +8061616828388979715 16947 +17262297762230204930 16950 +5571419058638122500 16952 +6402916720621549057 16956 +6674610762835575302 16957 +8495457170679507974 16963 +12080407351667593731 16969 +9894668511611304966 16972 +9883113498522270213 16978 +8474219213321976324 16983 +4907764598210953730 16987 +0 16989 +17237011920081569799 16989 +16492674532617146885 16996 +3507901733717542404 17001 +296375690097713669 17005 +14994596783185938433 17010 +17531373472617949186 17011 +7206355321693214723 17013 +8557280588318184963 17016 +703253918514583556 17019 +7536184755451825155 17023 +2325374507195712515 17026 +6759298445307222020 17029 +182516057667499009 17033 +16380234278170854403 17034 +0 17037 +5433488876118733316 17037 +8638292631541698050 17041 +3933240595280632837 17043 +8796560483046627843 17048 +2109448312582532615 17051 +4788085071971615236 17058 +16888627989907244547 17062 +10043181491120396290 17065 +12107362316483473411 17067 +333796734267823107 17070 +5074127767973446150 17073 +2222497162031391752 17079 +12807230470789957635 17087 +15386647184793108997 17090 +16878842023646674947 17095 +13671176511690941443 17098 +7564672519121150979 17101 +401543057619270663 17104 +2408173720101279238 17111 +12244384400665214466 17117 +10027619419633355267 17119 +5310368373016508932 17122 +1885867335676435974 17126 +8238983337137405959 17132 +17548891440420944387 17139 +12685398197562601478 17142 +13378634095429322756 17148 +3472853259249048072 17152 +5256062898755531781 17160 +448472534912987654 17165 +15258983660332203524 17171 +10966404014205719043 17175 +17801073515991280138 17178 +6754416740487111683 17188 +11802727169642033157 17191 +17550167624137926665 17196 +4956050346854599685 17205 +17258182600896340482 17210 +13169343367558636547 17212 +2105196721877649414 17215 +7489474637301709318 17221 +321145606960989699 17227 +6447321161748106244 17230 +3510207262678565890 17234 +15498510342787297282 17236 +2461474280324903428 17238 +3006908607156711425 17242 +9634656736748831235 17243 +10861244389715726341 17246 +17450403668650166792 17251 +13388367341984471043 17259 +3902413535569965060 17262 +17069801647016930309 17266 +1150914350028078083 17271 +10822616066796559875 17274 +14182520656479461380 17277 +3668863331363004421 17281 +2275037377811860486 17286 +3502352903157599748 17292 +14511862204555026948 17296 +3594057349437662209 17300 +5257558413778211845 17301 +10369397825040642050 17306 +9388912940617560068 17308 +1424492418038682627 17312 +5702065212234932742 17315 +6076021289646959106 17321 +1548142195485158920 17323 +5957808711287437826 17331 +13483181974491267590 17333 +7555860172577411075 17339 +1143742630034500611 17342 +13515243716124319235 17345 +4281139076203754500 17348 +2753280935052568069 17352 +2776018366854731267 17357 +15847717550135008772 17360 +17822553163064317957 17364 +8417137728736290822 17369 +7688542293957139460 17375 +16728791950902491140 17379 +1162834479130123270 17383 +7202791359544249859 17389 +1712444503903365635 17392 +0 17395 +9099329261151783428 17395 +11116988554089572866 17399 +15390425194248773636 17401 +3948005502268519427 17405 +5272534579284212232 17408 +17899710755888724994 17416 +178674580346706438 17418 +18390172693707042821 17424 +17864747288798996998 17429 +12065895701345991683 17435 +2001104426635744258 17438 +13403013682369005057 17440 +9788036919013778949 17441 +8572487210179742213 17446 +9308423243618177541 17451 +15301845620449742852 17456 +8702260729810872837 17460 +577971592352770051 17465 +1778552792629796354 17468 +7443819489419728388 17470 +14531582146385073671 17474 +694580565947401219 17481 +11419073949710052354 17484 +11677360025831753733 17486 +14522994711986808328 17491 +14914373779674046465 17499 +10490211395862261763 17500 +9099473568333183491 17503 +17584876449743474691 17506 +3575871998307543045 17509 +6026354958108596741 17514 +9554096922784947206 17519 +8302585101975049219 17525 +1055708399083582466 17528 +16188620972095471623 17530 +11470180264446302722 17537 +9503592442237488641 17539 +17968519448822772228 17540 +10382727973544650243 17544 +8912006701664482306 17547 +8072751430611846660 17549 +16775492669047947266 17553 +6347524138553265670 17555 +7290287999906354180 17561 +16496844369300671491 17565 +12943780520457216006 17568 +10710823685142870017 17574 +11456605727048980482 17575 +5259267643598334979 17577 +7308658452962436098 17580 +15114954780415081474 17582 +5336967716008493572 17584 +12745811972760059395 17588 +3016140961063191043 17591 +1411284168433024004 17594 +4722084482675176962 17598 +11311885960003854851 17600 +2904071443134020611 17603 +4696901362159970820 17606 +11110621002025153539 17610 +11101168651342736898 17613 +18120441236894791170 17615 +1110855099371993606 17617 +12814057578843871746 17623 +11158907979557423618 17625 +5286811450992870405 17627 +10470099018614586371 17632 +7029626249156742659 17635 +14851719685298038274 17638 +7948352892551098369 17640 +2068151288233797637 17641 +3662896786777881605 17646 +16515987797715025409 17651 +13046317715115865095 17652 +18114390763453004804 17659 +2792754092909185030 17663 +4352322600547992582 17669 +17920900838312745477 17675 +6970218303349065220 17680 +16523584569241877511 17684 +12996364645365213188 17691 +8174719380660922370 17695 +8519421280106037764 17697 +8675115630912038914 17701 +7187061100377968131 17703 +3099095741540461573 17706 +0 17711 +4149167278481433604 17711 +2037744911907409414 17715 +18103175120151724549 17721 +818824538179060229 17726 +16654825260845047300 17731 +7608484847763187714 17735 +17824365348714145284 17737 +8502375963902534661 17741 +14975086881735744004 17746 +10480268131855604740 17750 +4800036983556069380 17754 +14532129388741032455 17758 +2662031865360443401 17765 +10835917571618955267 17774 +8072045633066592774 17777 +13450115869123076610 17783 +13888333680617648133 17785 +4418519354922508803 17790 +16742841264625756164 17793 +4817903463712130563 17797 +14596077429208106502 17800 +11119170928677278722 17806 +7072340642059250690 17808 +18033499755598316035 17810 +5084864454898896387 17813 +1310240834527861766 17816 +704549270925365252 17822 +3201409497183251460 17826 +7737914732159290372 17830 +16187630755789017094 17834 +0 17840 +17320524957859045891 17840 +12846251070194532869 17843 +11863612477882916868 17848 +2418740443101942275 17852 +14180071787011145217 17855 +9149761972168168965 17856 +1704182340288473098 17861 +806717856276287493 17871 +15918742616457910788 17876 +10570901711493427206 17880 +3820006188267930118 17886 +2822304174842034179 17892 +12605127829581916678 17895 +9583227094457961480 17901 +17591187408594048516 17909 +513879678269588481 17913 +3002738625567468038 17914 +10964486036644858884 17920 +9745528552724210690 17924 +1915266787934673413 17926 +15155777026947349508 17931 +17181525398590937603 17935 +15353939661191467011 17938 +14446508030793647108 17941 +6790863573405396994 17945 +13036352572961290757 17947 +4018224079220916228 17952 +3257579204926970883 17956 +3238619816308921351 17959 +18158307914136829957 17966 +5066982218608467972 17971 +880431952106219011 17975 +8862617693684911106 17978 +265529216896015877 17980 +2982906000006118404 17985 +18045200181317362181 17989 +16468105299513663494 17994 +9016107311750390791 18000 +15186006752488220676 18007 +10329897325312213507 18011 +11441393274344711173 18014 +17675814151333205509 18019 +1284632897370961924 18024 +14677966717680410626 18028 +8338381495846008322 18030 +13016915543899655684 18032 +9150034220553501188 18036 +17476809309182605314 18040 +7050245426748603908 18042 +17043069290564980226 18046 +3837824166224244742 18048 +4533264309517975045 18054 +2975998177384400903 18059 +15589760522441077251 18066 +8930462439368594949 18069 +8508893654122978309 18074 +1345262795546162184 18079 +14453671879151965187 18087 +8169358341591655432 18090 +1590451064229695492 18098 +17679813206365522438 18102 +7128803935123896835 18108 +6787674688797430787 18111 +2910659041711088131 18114 +17678063360013005827 18117 +11141776462347373573 18120 +1497285996098478084 18125 +3246233881584621061 18129 +14048102662228807171 18134 +566396624228160516 18137 +10061515218041901061 18141 +2994233086083884037 18146 +13477980161901560836 18151 +3258109833126129666 18155 +3676902518101597698 18157 +4656100757835053060 18159 +15307988990089878533 18163 +6329192365763988996 18168 +9252960338506828806 18172 +12872961845245258243 18178 +3996447481826266630 18181 +4143398087605019139 18187 +15745766586668328452 18190 +5463274339163523589 18194 +17933545240536186882 18199 +163229470207392258 18201 +2817367404230056455 18203 +16615044135217380357 18210 +15357437963352426500 18215 +8095189553740977665 18219 +5829529128319995393 18220 +11119301736639855621 18221 +14878686820027431427 18226 +4386712291104730627 18229 +8725219797831466501 18232 +8290178281933630977 18237 +10606417580467812356 18238 +3706503471780903427 18242 +1022141624202984450 18245 +16851347384037457921 18247 +16430766742150571524 18248 +0 18252 +0 18252 +3553490461483681796 18252 +18218645454464049157 18256 +1654567040933499397 18261 +7360352594035066885 18266 +17734316162815331332 18271 +9660591152163728907 18275 +5810498913832603141 18286 +15968492373475179009 18291 +10593807922592089091 18292 +16826262182020948485 18295 +585330619197971971 18300 +6016399692921918980 18303 +14867319477982773765 18307 +2795460652149581827 18312 +17342605758632487938 18315 +6889437707173705220 18317 +12552988609638217218 18321 +5003865768441710595 18323 +14287029948279678471 18326 +6125531731866758148 18333 +0 18337 +13059228569244725765 18337 +3280502695501830150 18342 +16548448212439762949 18348 +1359587646619892228 18353 +16041197862291839493 18357 +11103988777531803654 18362 +9278043616323705860 18368 +5619601694806039045 18372 +3951201969833997827 18377 +12627605666356239364 18380 +10114740550068128263 18384 +8102918929463282180 18391 +9713578582491033606 18395 +13024859411804356613 18401 +14746976650514313733 18406 +8690513062509970435 18411 +12611024366440236546 18414 +3132188835329715202 18416 +4391987342920227842 18418 +14196306160141717507 18420 +1266578785323705346 18423 +11438251685439512070 18425 +5347761275765690886 18431 +7833979206721106947 18437 +9300229752924534786 18440 +17849010043719968769 18442 +13518774270461940739 18443 +18372905304445960193 18446 +8492614880238050821 18447 +17126664503755092996 18452 +15526962412739309061 18456 +12363657096040162819 18461 +974530619155719171 18464 +11473811396377310219 18467 +13200878766248525316 18478 +1429985887115403268 18482 +9893612565055642115 18486 +7998677061599670792 18489 +12118033893167052294 18497 +3449961124522207750 18503 +6315701317331720705 18509 +12470070264708668931 18510 +16058124116265694211 18513 +17724554872937388038 18516 +16711382714391796225 18522 +6844973172675814405 18523 +14940392462011722244 18528 +2178568611927227906 18532 +17989040604185408007 18534 +4738708395049959426 18541 +7559674729598107140 18543 +14568450749042924036 18547 +14741031329144027137 18551 +2827694659663289346 18552 +16576547521119122435 18554 +10818326004208371207 18557 +6216674569047216646 18564 +16409549342855020551 18570 +14371113219681412098 18577 +12620850935561330692 18579 +16048835763927813635 18583 +12196422590708985858 18586 +1567518421319694341 18588 +10544844874898185219 18593 +15756378069840692225 18596 +16328530795065795076 18597 +3613452516786128387 18601 +3715419399250164741 18604 +7110751152021123587 18609 +13057634736656014339 18612 +3759837135264300033 18615 +17383440052463800835 18616 +15117697109562083845 18619 +5099484006420559363 18624 +4249459754476228609 18627 +7488570051554188807 18628 +6332484053272445442 18635 +11880663544755638276 18637 +17634755164610273284 18641 +14310711895321561093 18645 +11567152351254252551 18650 +8335481484735887874 18657 +5437676456208644101 18659 +16715248310097918983 18664 +6475970792727791622 18671 +3478104596437086724 18677 +10468703808121589767 18681 +5581414627383485444 18688 +8949610551929297414 18692 +4674079550897119236 18698 +11368592761901007875 18702 +12414545582408830468 18705 +15134201291875985415 18709 +817504924631001602 18716 +990785674943617539 18718 +17460156584281655813 18721 +9267592576591478275 18726 +11139352714903212554 18729 +4634893066036826114 18739 +8689166029920792579 18741 +13867064291960066566 18744 +11473021866495617543 18750 +3811057647161826821 18757 +15300287906635781127 18762 +15804363476651655169 18769 +11260137998408239108 18770 +2754962089403471363 18774 +7802828944307740680 18777 +636360121811317765 18785 +9396469657379562503 18790 +11186986036742399491 18797 +7163591006156518405 18800 +7106808694198402562 18805 +18289919749720750088 18807 +1330416580089965061 18815 +3901437616480589319 18820 +7430383788043227139 18827 +6091752173462348805 18830 +16805516729213823489 18835 +8374600724149050884 18836 +9988219281321223689 18840 +6093201378831398914 18849 +6703226885346903042 18851 +17535484344477633030 18853 +4768666167647581187 18859 +15876036649675025927 18862 +16178506280182368771 18869 +11959190264993336837 18872 +14496777905418626050 18877 +16592110602762662405 18879 +9495815205939670019 18884 +5776555165298360837 18887 +6180233466357150210 18892 +14538522099089615365 18894 +8067089341861519364 18899 +2326483802717305351 18903 +17094745254133548040 18910 +6261238870109244422 18918 +717198564032712197 18924 +9863432558597144071 18929 +16767636427595796487 18936 +6099216316939852802 18943 +13144070340775161351 18945 +10248884329260284417 18952 +8768503082805795841 18953 +0 18954 +667655494649806338 18954 +10548166099091896834 18956 +9208097784420483586 18958 +4040599151086788098 18960 +7837162695590152198 18962 +4131492134419037187 18968 +2883251467967579654 18971 +5064059614968566787 18977 +17373392723668269570 18980 +3982233551947362823 18982 +8143789619600195587 18989 +7784435556040100356 18992 +17015005594182775814 18996 +17499154364214916097 19002 +13166949364166475780 19003 +7191505605230522885 19007 +15009294307052768773 19012 +14296434606108489733 19017 +12820186716225203202 19022 +14987245020584732677 19024 +5686202966659398658 19029 +15753043063775677443 19031 +15231340251441739781 19034 +8280417919248910851 19039 +3641646255830483458 19042 +13718418543423250435 19044 +7579541395977554436 19047 +2356162876263034369 19051 +18279350724761840643 19052 +10375340026243879428 19055 +18144153749401408003 19059 +8238521960918892549 19062 +4628838867171004418 19067 +3969066923346464260 19069 +9264160265556141571 19073 +14132678960187619844 19076 +16144115347842735620 19080 +6420006126445831170 19084 +16288736070088742404 19086 +6301505879198593027 19090 +13879771408806813702 19093 +11832569034876365825 19099 +16243414879146132485 19100 +8607109233578044423 19105 +0 19112 +16746564070424152067 19112 +12824582342568943110 19115 +2010161269715777545 19121 +8353226760919957510 19130 +5185034926495781383 19136 +1505328076141158405 19143 +16729761591511625219 19148 +4432884868188304899 19151 +14814595909573542401 19154 +14298969464743239169 19155 +7303753469680270853 19156 +16748550033185906179 19161 +17185231678978811397 19164 +1961530867429093378 19169 +15631023188784781319 19171 +6942873740829114885 19178 +13410621842924267526 19183 +1136272783441440261 19189 +10496350953281649669 19194 +12137720846452039684 19199 +6720374289388011525 19203 +10228786931375540738 19208 +234480210424917507 19210 +8189626909936508932 19213 +3965981737605197830 19217 +4317876006158213637 19223 +13949158937110621700 19228 +8659612089261979655 19232 +11603240894146258948 19239 +1464549052386554884 19243 +11695973132786358785 19247 +11745643950230553607 19248 +13503664154626280962 19255 +7755188324578426370 19257 +11192865272333824006 19259 +6837077596296066561 19265 +18111122262053649411 19266 +17859025849571134467 19269 +16288795143791060483 19272 +7353035833356537859 19275 +12910310409894884873 19278 +6046677678725403651 19287 +3586033236870233605 19290 +17134550495839196163 19295 +16644949281030007297 19298 +18235556160960935940 19299 +10677188430308441606 19303 +8704713727266225159 19309 +6548108649750723076 19316 +12154248641529696770 19320 +11043458510687529478 19322 +12034655269247938050 19328 +14941891654847216646 19330 +620375062231315459 19336 +10937003512848506374 19339 +2422602838415168004 19345 +1798686269746304007 19349 +5222162031891517444 19356 +2372018091783921668 19360 +13354895488523506181 19364 +2569942327813775363 19369 +11428998170337905669 19372 +2508851557444313608 19377 +17193122379593235970 19385 +0 19387 +15987483171262273538 19387 +15052523222251052549 19389 +13214150958922058245 19394 +4850286676828284419 19399 +10289226430606435332 19402 +10255568200357766146 19406 +5448399920849703425 19408 +11117681020457179140 19409 +12220194819191464961 19413 +15623142636111511046 19414 +18177009591411116550 19420 +17464354043636182530 19426 +1184759527180393473 19428 +2895261779502966788 19429 +13613117794986703875 19433 +9314404171388802564 19436 +12841252651934047748 19440 +5618433734333054465 19444 +9778344735663910917 19445 +13968302335087996930 19450 +10176083079036854277 19452 +14258112590785854469 19457 +11305569846395539464 19462 +3428216395901275138 19470 +14550377334457593860 19472 +13497676728980812290 19476 +567493719520041475 19478 +11431313172957067265 19481 +59703931407251970 19482 +1460746403158975489 19484 +7682009976422725126 19485 +162579937918497797 19491 +4748560726515840005 19496 +17880071815109513732 19501 +5121736580450930692 19505 +8845055730188704772 19509 +1855164801270559749 19513 +324525516295555593 19518 +7221157757716810759 19527 +11859848630883393026 19534 +15160099634831131651 19536 +7232536519929475080 19539 +11342808753453110277 19547 +12546398370665232388 19552 +5272002711265977858 19556 +4284364330831840260 19558 +4006364041369333251 19562 +14440802579059546113 19565 +1813924515342145026 19566 +17695622884624269830 19568 +3282066752482691586 19574 +16252127895694621187 19576 +1445249990905212936 19579 +15740302490063166467 19587 +14243750390059817473 19590 +13635314221030214659 19591 +8537911701666799107 19594 +6470116570181466113 19597 +8153469703688389122 19598 +12422220328171883521 19600 +12461952259449327619 19601 +14269830696953443329 19604 +6225729160973444618 19605 +7066846715063985667 19615 +7998884702888180743 19618 +7849041913633268744 19625 +13552578254439774214 19633 +7363264229992260611 19639 +4181142298539836423 19642 +10115175633979872262 19649 +0 19655 +13564621525838284291 19655 +5208904145628449283 19658 +9424707377547425794 19661 +60286517073761284 19663 +10311518364275542530 19667 +7492808546341731332 19669 +17440574082759086086 19673 +11412339461282485765 19679 +1211924301938944003 19684 +6327474652400458246 19687 +9009841248261255682 19693 +5645107938633756673 19695 +11546993119037534217 19696 +3714829000347616259 19705 +8075411080382389764 19708 +6519765840803535368 19712 +8981615013271194119 19720 +8679297605411253764 19727 +18113611985143620098 19731 +10605046427376200195 19733 +18327751097227609604 19736 +13283278512536090114 19740 +17389732717687113217 19742 +11693954067582653954 19743 +17136137669140560901 19745 +5788710368928631812 19750 +15783277880507531778 19754 +17476197280931720711 19756 +924194206827424260 19763 +14648073019795580421 19767 +15484935352320856068 19772 +18093507310484941315 19776 +2028775163823891973 19779 +7641899138566206467 19784 +10696608006196861959 19787 +3136362481444496388 19794 +599947987969224199 19798 +16879871844498145284 19805 +16183157417277979139 19809 +2047131977513284613 19812 +13257710411641030148 19817 +14426146332048523783 19821 +772269843515033604 19828 +18079671161959270915 19832 +12156130626211602946 19835 +9803804184263273987 19837 +3005860374774392838 19840 +334909604591986696 19846 +9950466330479584259 19854 +59121803907534851 19857 +370010302560506373 19860 +13860610111094473730 19865 +17081346013756710404 19867 +2773067860045947906 19871 +17158510184244801028 19873 +2357991538169727492 19877 +11002550446294491138 19881 +3424374498866676226 19883 +14606926054149332483 19885 +3141468023938281473 19888 +8166403600315176451 19889 +2481075036124566018 19892 +4552427035605562883 19894 +6450800832574491139 19897 +14315140564034306055 19900 +4635500331661366276 19907 +5249895811105998852 19911 +4933645323747420675 19915 +14454735052618096642 19918 +6208413000521927175 19920 +2332502188275951109 19927 +10992296294107410948 19932 +6842026416672800771 19936 +7681090767159100932 19939 +1366142089982656515 19943 +5173265512015457797 19946 +4160005494451194881 19951 +16768319114869517827 19952 +7971204770910790657 19955 +16868589731871699460 19956 +17336845797574411778 19960 +5842290169696826886 19962 +1309854004835234305 19968 +17455182958113122307 19969 +5647123007815682049 19972 +5870465065689438723 19973 +7717697946718272515 19976 +3138052161670355462 19979 +17607637730070896135 19985 +15021476363616803845 19992 +15962185961637415937 19997 +13166221385113887746 19998 +7098778739691791879 20000 +5900713598420989443 20007 +6154469845748541445 20010 +9480144208053501442 20015 +7714769913179553794 20017 +15195279815965214721 20019 +7353021580075505671 20020 +0 20027 +15989439836964022785 20027 +5415069114190217732 20028 +12176886515171828738 20032 +3933742003814063619 20034 +5670785654486042115 20037 +5976724071112942594 20040 +5531369097910991876 20042 +9741642304618135555 20046 +14250431963531515913 20049 +5248608067684452869 20058 +9906366249418260996 20063 +2353251346915591683 20067 +15712076593857771012 20070 +15716211817611516422 20074 +3080782808173423617 20080 +13823507128779751429 20081 +17803168480871926276 20086 +4391634991324668933 20090 +1261368126844049921 20095 +15839831685514116099 20096 +4654232785369120771 20099 +17275300455924865026 20102 +10768027160548937732 20104 +9277219171358969347 20108 +13272933774475857922 20111 +14348425854820878854 20113 +10851489213948707846 20119 +11898914813597216261 20125 +13486016557894636035 20130 +11278004198999097349 20133 +2047020824378660867 20138 +15948854976926457858 20141 +2774135247524517892 20143 +2715391113786306568 20147 +10891643548450491908 20155 +126928312551553541 20159 +10941406642320207874 20164 +10402365572846088194 20166 +4021721816442657796 20168 +11831284698771551749 20172 +7626390684627871747 20177 +18130690210927588868 20180 +2659342467301009925 20184 +2468933588896700933 20189 +14368447651199561730 20194 +17622439655967053830 20196 +0 20202 +17065266682347501059 20202 +4871760613913739781 20205 +17681712735108661251 20210 +9525338036243492868 20213 +17139663814482788870 20217 +7882480106080155139 20223 +4051395092162376710 20226 +16063818596312517122 20232 +8568846887569743366 20234 +12796380400035549190 20240 +9862850404373251074 20246 +1854396616827977222 20248 +16463706227878640649 20254 +15594410252922205701 20263 +13864129058071338497 20268 +8493747277023402499 20269 +15797179318926163970 20272 +15925313203163822595 20274 +603279439796708868 20277 +10071846106753677827 20281 +7131010361611173889 20284 +7511027781308106242 20285 +14649866774319265794 20287 +12521636893688444420 20289 +13362987287241975298 20293 +8897440701554810373 20295 +16387445382168140293 20300 +0 20305 +3406401513815788546 20305 +12373827075059812358 20307 +15908865043789774338 20313 +17711671965968163842 20315 +13474824086279880707 20317 +6506131613431641090 20320 +12348717024316691459 20322 +484281466389581827 20325 +13801091387729792005 20328 +16080722030047120899 20333 +10782860725549900293 20336 +11597141504681856518 20341 +13790690736821113348 20347 +6336565497324557826 20351 +4988631856391780356 20353 +13020706431068554761 20357 +12377957708031606786 20366 +12394165805990152710 20368 +13433217523581955077 20374 +4463425065159064580 20379 +5431547642920481281 20383 +15105930904058937350 20384 +16943483525074166787 20390 +5357674962712170498 20393 +5879562532448351233 20395 +8368754190969283077 20396 +2509468675290738184 20401 +10061482925545687042 20409 +5828917731932649475 20411 +8834492295138513411 20414 +15832604180403390983 20417 +6819111761391872004 20424 +7309277075027355657 20428 +7389115288940409860 20437 +14881130134634437637 20441 +14906180628133321218 20446 +5741832744228356609 20448 +6232230848528316422 20449 +13176547430565090820 20455 +4822164054563152390 20459 +9180817113329740292 20465 +689468021091231750 20469 +13340501234229889028 20475 +13038451099105706501 20479 +18440335370113287681 20484 +17577111957042628610 20485 +18408686105779617795 20487 +4324038060856559621 20490 +10672516898102803458 20495 +11177544075783643652 20497 +14827175584620890630 20501 +6744939160005343747 20507 +2351593889776063495 20510 +5459362851129235461 20517 +8425271403943884290 20522 +727954906205648900 20524 +3198302408148943875 20528 +0 20531 +9002730278417402374 20531 +17454975593665134597 20537 +10204775383051391490 20542 +6283757698553102340 20544 +13976941304248641029 20548 +9344011366484466692 20553 +11316355247172508679 20557 +13789851915595375108 20564 +11693535731690688520 20568 +10977431321355596292 20576 +11895853543764441605 20580 +10867878408043876353 20585 +10988213916624125955 20586 +6543916324244666373 20589 +12965379031133615619 20594 +10282650525721860099 20597 +0 20600 +8953673716847274503 20600 +4819982352432911876 20607 +809289799902370308 20611 +3914457278575502341 20615 +7972980307320053252 20620 +838731038368300549 20624 +7035822766766098436 20629 +21674258791687684 20633 +2180397349026846209 20637 +7924276644191863811 20638 +9052548572332188675 20641 +14418699729472734724 20644 +11105046838310303747 20648 +12182886901424788996 20651 +8730782711585560067 20655 +9946788087930725382 20658 +879167979250706952 20664 +10670046915823967235 20672 +15390432408076297222 20675 +1682443141258632197 20681 +15671358792032798216 20686 +5248057059832024580 20694 +16865876562580601351 20698 +822026493154309640 20705 +7322814985404109314 20713 +17518053458370446853 20715 +3858576728020333572 20720 +0 20724 +18160131004127297028 20724 +1891220765598345732 20728 +8941073071949199365 20732 +5720491591775995907 20737 +1035885458713573889 20740 +16247975200399542276 20741 +5946909270732211713 20745 +2918919290912546310 20746 +1151781668798368262 20752 +14161883315489330692 20758 +16386625642699280901 20762 +6419325257630792708 20767 +16686662633590629380 20771 +2747177605493707779 20775 +17186593552422805505 20778 +6301038725106500614 20779 +4585853154651620872 20785 +18052078882487580164 20793 +7122347129105385477 20797 +2652007359725642247 20802 +7986886785061106695 20809 +12300993624183096837 20816 +11646574953318932485 20821 +18145572191603609092 20826 +6481227702326594053 20830 +0 20835 +17854904846290171909 20835 +18348755717278961669 20840 +3953268826337304585 20845 +513230680352438280 20854 +13703107968728892933 20862 +11441037153527915529 20867 +8067343063451321349 20876 +14042838312574926851 20881 +3339499162750405635 20884 +7681458079905461253 20887 +17210051587358071810 20892 +751647806978895878 20894 +0 20900 +3531361954823049732 20900 +450084863290273795 20904 +7701804862114436101 20907 +7337331960546579971 20912 +11251611617647180295 20915 +5767388489058803206 20922 +14350988557445696002 20928 +15354727885706961921 20930 +11788295751299861512 20931 +2045439863022943239 20939 +3358630330825711110 20946 +8233133945310910465 20952 +4635905011586938376 20953 +3299086199324133893 20961 +15321898930302453258 20966 +15234828549713271814 20976 +10036156254843056129 20982 +2368150896328437763 20983 +811664383609941506 20986 +16110976190762743303 20988 +11899829395442338821 20995 +9261421121571033602 21000 +8946587894391559170 21002 +18138299317831677958 21004 +2531927223641912323 21010 +9321501379437185543 21013 +3594738697441232393 21020 +6916044490321926146 21029 +4234583370524847617 21031 +3139819670175239684 21032 +14981505451224828932 21036 +0 21040 +2000417749592306694 21040 +11820690956931219969 21046 +14162630957315738627 21047 +5768033534980315139 21050 +10984553981972438534 21053 +802982332641089540 21059 +692059187180590593 21063 +10935970496663680006 21064 +1179656916686724098 21070 +7052672193338926085 21072 +12864100077614296585 21077 +9262501659338151937 21086 +9236510897105561090 21087 +0 21089 +3704058935831607297 21089 +3756003848160173576 21090 +18244929855702660097 21098 +1484338364038789123 21099 +0 21102 +3569593098862651398 21102 +13459623797208766982 21108 +9342231545007726594 21114 +10821665925552605187 21116 +12160075616320196101 21119 +2521368054529195523 21124 +10932812287773018117 21127 +1053985840124137476 21132 +7249387512953132550 21136 +9221032419707280898 21142 +15600202279858474500 21144 +15170499060308086274 21148 +768687345963412993 21150 +2520904503588786690 21151 +9203023679189161989 21153 +18286220599771732482 21158 +5286449002783526917 21160 +642806949128079367 21165 +18413134189189542404 21172 +15029612011496063491 21176 +8609268738980142087 21179 +7337350720952855042 21186 +17402492862675073542 21188 +18241443617825001477 21194 +17250788717367245826 21199 +14775700364356896258 21201 +10645206835450959361 21203 +14006508101647398913 21204 +7028838704593596932 21205 +17657213518409589763 21209 +3645317627532185605 21212 +15893221388107073028 21217 +1478741592787575299 21221 +16525035596493992453 21224 +15942353675161980929 21229 +9180915906370592773 21230 +1019059672418356225 21235 +8682369372339305988 21236 +4129071554754067974 21240 +7889159485025710082 21246 +5377552746855858181 21248 +734578709401885704 21253 +16192643003080711 21261 +4303156535480364548 21268 +280917817090113030 21272 +8557225621011404297 21278 +2781933482352642051 21287 +1387767636722612228 21290 +6657646762425085445 21294 +10570993305775901188 21299 +14203353150686614019 21303 +13756999264798326788 21306 +10824667309662295044 21310 +5275682782753556997 21314 +8386929264001280514 21319 +0 21321 +16605140563349070341 21321 +683595528350586883 21326 +14415751641419568644 21329 +10654392142594208776 21333 +10325488604764860422 21341 +15347859463843069441 21347 +2933905638155960836 21348 +2576430186606600196 21352 +2307194829456527876 21356 +827247834101348354 21360 +4520454054308032515 21362 +7372570574324369411 21365 +3648262289424415748 21368 +16838013887397674502 21372 +8957452726769120260 21378 +1695422230705929218 21382 +6696381294624762884 21384 +18224229405345273861 21388 +12172261732355249666 21393 +8027226285926986243 21395 +14279395468321735682 21398 +13448977065716420101 21400 +4818069387901916163 21405 +14136762783151027205 21408 +1674187554776781317 21413 +14726545252698188803 21418 +10276933890704071171 21421 +6295197428952354308 21424 +18113752272902766595 21428 +2953340529981228545 21431 +6376201727323225093 21432 +6226506460475158533 21437 +10160999214802635271 21442 +2950365729430133762 21449 +14553804822200973316 21451 +3286593577614470658 21455 +15477935220409184260 21457 +4164018704181359106 21461 +16610483665978342402 21463 +2519539234813121026 21465 +13020896824514811908 21467 +12804758808648398851 21471 +14615128437285537283 21474 +1787774494900815363 21477 +7043296062988294150 21480 +5048893766437941762 21486 +8408540632726630914 21488 +10778091682978604549 21490 +13841599401976675844 21495 +15430292971025377795 21499 +3012651483959015426 21502 +11370034138314910723 21504 +2355720296944685060 21507 +2650509348780942339 21511 +12601225638960084485 21514 +14596067006204901894 21519 +17032699080978966019 21525 +4778934812457579015 21528 +942188832873750534 21535 +8345771012551857665 21541 +10365657483452526595 21542 +11299084367758252545 21545 +16891202829513970690 21546 +7382172061155222020 21548 +16667744265517775366 21552 +15511301834945167875 21558 +14968073782375908356 21561 +1001608682179367938 21565 +5601888547220249094 21567 +16596477743064280577 21573 +12490489013260103171 21574 +481797259600066050 21577 +4853333502210171908 21579 +3889523802418000900 21583 +1182895999698873351 21587 +71445034786693126 21594 +6706776737492656136 21600 +8413584604860724740 21608 +15696356549593144836 21612 +7589579663623798788 21616 +7329210887972848641 21620 +12257576086705198083 21621 +618480604108885512 21624 +18129999313939070467 21632 +17299692736814836227 21635 +8772266124726359554 21638 +17518976063203996678 21640 +13845289496003522055 21646 +13496909859813672452 21653 +15412924407905252865 21657 +17382322785031302146 21658 +15732797077385008645 21660 +1632989055978590723 21665 +2924922215475618307 21668 +2270880558340678148 21671 +12393421406720268294 21675 +9136676271993715206 21681 +10054459437133819394 21687 +15042273759754095620 21689 +10105328406528494084 21693 +5680864256091102721 21697 +5607489877669901829 21698 +15133513015331113478 21703 +2423576241567182852 21709 +6434611218384602115 21713 +18404753000277636610 21716 +15809670127702231043 21718 +17569446905922875908 21721 +7699677036701242372 21725 +9875793292816077316 21729 +3829836239431707654 21733 +8638594383373938182 21739 +16489635088310497794 21745 +15057598337962212872 21747 +3164585321278793735 21755 +6807214542719335428 21762 +10676426406383032328 21766 +10917341040616528389 21774 +2064460409263421958 21779 +3578765762866570755 21785 +13732395705619992069 21788 +9911316558583566856 21793 +16012737947727007750 21801 +5998812008899268099 21807 +1571532015357939205 21810 +6608454737388521477 21815 +3978114251854152710 21820 +2331635125039023619 21826 +9986971901397762562 21829 +10068107184219809794 21831 +5319192769117773316 21833 +6580798716319154181 21837 +13050405594565185541 21842 +8104334835835012613 21847 +443678268482450437 21852 +1274615016862129155 21857 +10305684361612533762 21860 +8079671450754412033 21862 +0 21863 +4410344562471774725 21863 +6007616799674574853 21868 +14630314957931480580 21873 +17727793774088642051 21877 +16894110925512397830 21880 +10303669948512801797 21886 +15507227370431628293 21891 +14372849576545305091 21896 +4843696278992655363 21899 +9867352419951158788 21902 +13330223326376299013 21906 +9459202069997834756 21911 +1939916935894530564 21915 +5892594151892752387 21919 +9147954885265900036 21922 +3164105183198081028 21926 +13817312541423377925 21930 +9602599490036038661 21935 +3152899491244979203 21940 +9358255153012436482 21943 +6607677551433182722 21945 +10216539131696656901 21947 +2626172793783730179 21952 +9309870924461615619 21955 +155893343141536261 21958 +7185056448842663429 21963 +16157232796437517826 21968 +4138938942277140999 21970 +7940922366109510149 21977 +313420017179261957 21982 +11572369930713492481 21987 +2541132211844988934 21988 +3388194088840222726 21994 +8033258295006504454 22000 +5576607964930539010 22006 +8173004584246327813 22008 +10707788813245882882 22013 +7420657348734944770 22015 +13950121425481180168 22017 +5911262235266912772 22025 +14366243049375762949 22029 +17773553427269763591 22034 +13705476589371419652 22041 +13188048473579642371 22045 +14386850720465097729 22048 +14302451377543996932 22049 +8366330226387196932 22053 +7950997592439468549 22057 +801253645811272705 22062 +13936063793390630407 22063 +11643607578083880964 22070 +9781423769327914497 22074 +13856021145282011653 22075 +12180688208779051010 22080 +195543773749209603 22082 +17337153548712927748 22085 +8634199694986698755 22089 +16473916765528386564 22092 +14661451294447883268 22096 +4912647218227999237 22100 +7530649427521927178 22105 +15804170002078767109 22115 +3104176855487492100 22120 +18155674769960946181 22124 +15170234875191585284 22129 +7290144465959398916 22133 +3043710788321599491 22137 +12904726818375712771 22140 +10534741375285880324 22143 +2777231933368061958 22147 +9419531052206976518 22153 +13719621926906616837 22159 +6527633719979764743 22164 +10196639557151851528 22171 +9829313851008583682 22179 +424728963808351237 22181 +16490836329799206403 22186 +5549473580222381062 22189 +7547054821875574277 22195 +3701659449063293956 22200 +5082901311514269186 22204 +11493959136043610113 22206 +12288960226272896516 22207 +9612070673949313030 22211 +18340148605913959943 22217 +1343911856220747778 22224 +2978061752319269892 22226 +17034306118148979201 22230 +8926973605384596481 22231 +17191697135915874311 22232 +2274021034285656582 22239 +10529339987227770369 22245 +17167213199213212676 22246 +12125081844466102787 22250 +3665174866241653764 22253 +3733867238847997956 22257 +9901021809547021316 22261 +5263647385462544901 22265 +2114901912108266505 22270 +10493779249841908739 22279 +8427306925550539269 22282 +16717226665246383623 22287 +14662537324487986693 22294 +12879644377811469317 22299 +12877503470061106177 22304 +5844375064291649542 22305 +17572549944597421572 22311 +1185368690854292485 22315 +2058761534902957576 22320 +7829298015783424515 22328 +3007046567822069764 22331 +15803617842387151873 22335 +6883033645025167876 22336 +15274746226965018628 22340 +13943751078985374209 22344 +16999088380883362820 22345 +2673408050607160834 22349 +6194347246277252101 22351 +5121575619092993027 22356 +2546307742957184010 22359 +447132488870579201 22369 +17550648659549047813 22370 +12725871070098365444 22375 +14790696691156118531 22379 +7947078750722768392 22382 +3967455510943647236 22390 +110028851392500228 22394 +16572305779811175938 22398 +0 22400 +5066622627788075521 22400 +11844330128328479746 22401 +5981559934319692297 22403 +6407379642897516547 22412 +128979085228032514 22415 +1953478463218479110 22417 +2739278502147275269 22423 +6669888021298276355 22428 +18108436159147618819 22431 +14501360336970361347 22434 +5980346870987305989 22437 +436661727095873027 22442 +12104524007721454084 22445 +6696443595630075908 22449 +1320127722664879106 22453 +4638708936655257602 22455 +17809863544688050691 22457 +16109224179404006917 22460 +4099892253543703553 22465 +6459093365964066313 22466 +10847566203387952129 22475 +16920078622991535110 22476 +4312356921119572997 22482 +2119310425649872388 22487 +2023696979441640454 22491 +8475361617557173767 22497 +17332442884461506564 22504 +5826534800699424772 22508 +11868312427138625541 22512 +9748953442121757187 22517 +10372264903851129858 22520 +688724551789654018 22522 +6672324504683350533 22524 +2597262547559713283 22529 +15020514628613595652 22532 +1659949759726320644 22536 +9147389439164025858 22540 +11029815551770914307 22542 +6356356967070216709 22545 +7694035924816557570 22550 +13482140396281620486 22552 +8714623297059617284 22558 +1501321923237656581 22562 +10026792422427333124 22567 +1844002226994552325 22571 +7594473426772600328 22576 +11347411746242081284 22584 +5323561675571748865 22588 +8183964357473279490 22589 +3795248132930729480 22591 +16507399823425781251 22599 +2872140961492903943 22602 +4488980626732908555 22609 +3664637549551815169 22620 +11184363152808824838 22621 +8753561336049915395 22627 +16714324591595268099 22630 +993227637545413636 22633 +3084046463705275907 22637 +0 22640 +13209839024863402499 22640 +9905343526272672263 22643 +3344620074654662150 22650 +9224082148686985222 22656 +9089158748917860866 22662 +868166374785447426 22664 +9996598689618919427 22666 +12215424511503828484 22669 +4643605339084368900 22673 +2414672778162464259 22677 +7640340775253891588 22680 +18434351753727878661 22684 +13238488203158408194 22689 +0 22691 +8979241965034623491 22691 +16753025328672660995 22694 +4432140365698233349 22697 +5227365786309204997 22702 +5038363268564375555 22707 +3742091993278641159 22710 +14584351667846785030 22717 +7346616311113856001 22723 +4572484574215340545 22724 +3425505900066951685 22725 +5851327030132360195 22730 +49065452103457798 22733 +9593161056005883911 22739 +4853720456764849669 22746 +4866890894782963201 22751 +5140023986880193539 22752 +1301387973922432003 22755 +2198324355335785475 22758 +15341280800930046466 22761 +16746794548575773192 22763 +1473093384405468163 22771 +5405194384090734599 22774 +1838657066062852609 22781 +13085751189211112451 22782 +6002543414021887494 22785 +4670152822306708482 22791 +11116384829356448260 22793 +16103373142576896516 22797 +16978945278901811205 22801 +11275616519668259332 22806 +8822194891698691590 22810 +4801499075466686468 22816 +0 22820 +1825341740185006087 22820 +3825796987373341698 22827 +4656211887636325379 22829 +18256248047942764033 22832 +1639791767578750979 22833 +1638747589742224900 22836 +10365483515447640578 22840 +11112054348271896066 22842 +10197665297110432772 22844 +12374521355070276097 22848 +10446507559594806275 22849 +11677478912745936902 22852 +0 22858 +2486336502084304901 22858 +10620408367475643396 22863 +3942137551213729794 22867 +2366803810577246725 22869 +5601928806901002247 22874 +10055935871027561479 22881 +14487686783376217601 22888 +9914425197286093826 22889 +8763232799134871557 22891 +9273269849684866563 22896 +10225438639840335874 22899 +16781006928777699333 22901 +14498710042005685763 22906 +10377957518526786562 22909 +10945521498170851329 22911 +2953355017825513479 22912 +3984405152711285251 22919 +18243399992240249859 22922 +13204224787045427715 22925 +1033128550679227909 22928 +6577830519111198214 22933 +8902595279264594952 22939 +15145103766576905732 22947 +5296896121183157763 22951 +9730817193452434945 22954 +17282808859681833474 22955 +10352844017302292993 22957 +9179634987119888387 22958 +7180524051518306821 22961 +15545818567366878722 22966 +14959945586304704515 22968 +0 22971 +13797746488560869381 22971 +13006572845872747009 22976 +17786492776302732293 22977 +7848060065047696900 22982 +7269170618857208837 22986 +13594023140203158018 22991 +13921553429994899462 22993 +15217227362831076866 22999 +2139683162423262212 23001 +7481132651019918852 23005 +12033382982918880773 23009 +3165686403542680067 23014 +8628277477403446786 23017 +5603756108551331330 23019 +13695345328165111809 23021 +7410061181967011331 23022 +14546934164223156227 23025 +10280697859926612996 23028 +1362296875659431945 23032 +17440409704219441667 23041 +11906386203153169412 23044 +9617125811641960963 23048 +4571435517281759238 23051 +3177293448051428355 23057 +15670892995744826374 23060 +6567919521784700423 23066 +10318229291421325313 23073 +4592816391217976838 23074 +344934248203954697 23080 +7195262201815452164 23089 +17874159769717868546 23093 +11612304115847916548 23095 +8864328375145650693 23099 +872227749216937476 23104 +4541474801551300101 23108 +17555637401302841859 23113 +17467472708964711940 23116 +1258524843294248451 23120 +11983437900220610052 23123 +8716638543657696772 23127 +334688497149194754 23131 +10641773400580085250 23133 +9732099819988253185 23135 +2783237840646917124 23136 +5888486359223231493 23140 +9766981857800699398 23145 +5622889844378353155 23151 +1943843817409348613 23154 +6980838466304054789 23159 +14767338667334675459 23164 +12680144473958489607 23167 +6882905250415012865 23174 +6088636023755619332 23175 +10774031598797983746 23179 +11760453753934417927 23181 +852613258850919941 23188 +5016599793754893321 23193 +2900349692593526794 23202 +12450697631691893254 23212 +12205402723345195524 23218 +5608598137119229443 23222 +3424743566426930690 23225 +18264059830463745032 23227 +4238820766025777670 23235 +17383531362531606023 23241 +17111256134790323202 23248 +15371535676903709698 23250 +10263929910251155458 23252 +8025666890173727236 23254 +10066803135004790787 23258 +53581435547865603 23261 +915324798419834885 23264 +3335620659346791429 23269 +4053604684847795203 23274 +10359192824843284998 23277 +3938621137916172803 23283 +12153572589023714309 23286 +4321817718846783495 23291 +17819084820817863170 23298 +11019911153398440453 23300 +10818464166743005189 23305 +17214613724475365890 23310 +15135487053085285379 23312 +10123308584160460296 23315 +6230901605382822402 23323 +9628020181458922503 23325 +155295845287073282 23332 +16116994177209501187 23334 +14388869720240898564 23337 +530470693944819207 23341 +14190931392153611778 23348 +3145740760064788486 23350 +3610024376584807431 23356 +17863875378623340550 23363 +9806626302425823747 23369 +17928120255349586951 23372 +2559627893739414533 23379 +12408204171074996740 23384 +6553614632808555014 23388 +2754467150267972102 23394 +284980329854233092 23400 +204766600875214341 23404 +8691328058888094723 23409 +8439438109415857667 23412 +4632738892247200771 23415 +668676867424994819 23418 +3805236117997409797 23421 +14324867251685372422 23426 +6680649630446700039 23432 +13495723458471161860 23439 +14177933675443448323 23443 +18386857406473981443 23446 +1006167456286977027 23449 +14402258610338892801 23452 +13805849367465006597 23453 +344943932294014977 23458 +9654807155908076036 23459 +9520715010274401794 23463 +7147239624258937347 23465 +11430615359071113729 23468 +3548874471397325318 23469 +14849266410637388805 23475 +16366837018047739395 23480 +4135084017441899012 23483 +14544699095401676294 23487 +16597121796394220550 23493 +9025797920648328199 23499 +6839960798384527875 23506 +3061696369501249026 23509 +8213552679918697985 23511 +11297961679178408455 23512 +9768730033454920193 23519 +5386368387239131649 23520 +4456792363038913027 23521 +14304839492068575238 23524 +12176276219164884998 23530 +14248753184263266822 23536 +1007704750941819906 23542 +10537464655757884419 23544 +973158778722698755 23547 +3278598250737242626 23550 +7373044686737645058 23552 +3705874520568049667 23554 +5331160804144914948 23557 +9858357898089276425 23561 +866656970397497862 23570 +13467241502496590343 23576 +17993559175371621379 23583 +2651356730170555911 23586 +14318739689787047430 23593 +3700647973768244740 23599 +13853168852448830469 23603 +9735217111425129473 23608 +9523859749747346439 23609 +6359129673202745347 23616 +7899918191126461953 23619 +17101563805743927300 23620 +4954084604434947589 23624 +3965592065475406850 23629 +6931921888263032324 23631 +4585196943930160133 23635 +4993951212287462913 23640 +2613905593360852483 23641 +13561163445953490948 23644 +3891168750624498179 23648 +4457701134625443842 23651 +11624055397951211014 23653 +12426014579947039234 23659 +4088994927794080770 23661 +12837534954743496707 23663 +13201365785471753733 23666 +11417972574062957063 23671 +0 23678 +17274459489486098951 23678 +13258625268634254342 23685 +1869865177161737 23691 +16315848642176509955 23700 +155897840259207170 23703 +13777857131402285572 23705 +17668836537260948482 23709 +0 23711 +5262210247570868743 23711 +13452379416295098883 23718 +8727979855144560646 23721 +3474525277459076611 23727 +9427859879652393473 23730 +618171788628172292 23731 +2784940102619861509 23735 +15763956666486339075 23740 +7060800313316528646 23743 +7402163178212407298 23749 +17418623559961793540 23751 +14533094439837804034 23755 +30961170344041988 23757 +4147055863403533314 23761 +7337371302591122437 23763 +10942944814538708483 23768 +6998297646877064707 23771 +12371713811388418052 23774 +13226188562288892932 23778 +10509361351292426755 23782 +3344074351471876613 23785 +17817090785257352710 23790 +5042873707351442434 23796 +3732541475923116549 23798 +10415339710182367746 23803 +13164359598075292162 23805 +17925358617045133826 23807 +13117168829858185730 23809 +2743613536915394056 23811 +4921672957793936389 23819 +514151133440945158 23824 +13815877245362751496 23830 +5461400855453657604 23838 +7988979331829388804 23842 +6950406959840490503 23846 +16753617256671753221 23853 +1315827256179111939 23858 +9460135294497996806 23861 +8759168241602366470 23867 +14426422107210905605 23873 +13038975058134362626 23878 +13377500486596083205 23880 +15259952993514831876 23885 +6054112389784795141 23889 +2392980047455243266 23894 +9948647774748887557 23896 +5535747246805433346 23901 +15557808754447804419 23903 +1837379186254151684 23906 +8011825624166573061 23910 +7264607254982092296 23915 +12198644609127541253 23923 +6639118894276153350 23928 +18403676202383972356 23934 +14359026181977847301 23938 +4808848716896552964 23943 +2635813761923283462 23947 +3448797037925437443 23953 +18231732346061236739 23956 +6205851753273632769 23959 +5144432790248082946 23960 +11264870665427711489 23962 +8100478654168792066 23963 +6096455617244917251 23965 +3123791088761034758 23968 +7654917786677058051 23974 +696312355146056707 23977 +10898958392331313155 23980 +4319124973886673923 23983 +0 23986 +15196582271688112641 23986 +10208828354487729155 23987 +14958272356934905859 23990 +1622296299163235336 23993 +13420598525954421256 24001 +10420245103445153798 24009 +17885342101038466565 24015 +17294597149520591873 24020 +8300024683150680067 24021 +18208790164602535940 24024 +5269284134630336005 24028 +11755180236130691078 24033 +1362483714921987586 24039 +6329531955723314691 24041 +11641839909369963011 24044 +11179650547329991174 24047 +14705780632517717510 24053 +1503375213269284867 24059 +5015308864462036996 24062 +8555301606324718084 24066 +11815270348580444165 24070 +1914954842397636099 24075 +8191650897847508485 24078 +920361339840122887 24083 +13119494338016420355 24090 +6580475820495385096 24093 +13700296747422369281 24101 +3086763394792010754 24102 +0 24104 +2156987987003048451 24104 +12782613863192057346 24107 +16722437046218067969 24109 +15463184524643508228 24110 +13585835502043672067 24114 +15092394571631343617 24117 +10425623378586099205 24118 +11471756454612894210 24123 +12667562957191197700 24125 +8753727456816570886 24129 +2972555279154121219 24135 +18391064084460706818 24138 +13616388948682033156 24140 +6885596233287810565 24144 +5666616599891280902 24149 +6282746495881289222 24155 +2003035593867864068 24161 +12465597187469294086 24165 +11893847171091311617 24171 +15538508974703529477 24172 +4004458974740554247 24177 +16582793194335546884 24184 +9170262696415158274 24188 +8968637756668518916 24190 +6278490490648952837 24194 +3574727414842673671 24199 +18158435339573075970 24206 +13124449956597477892 24208 +7302407791720344581 24212 +9767470252344080386 24217 +0 24219 +4237115034128231431 24219 +10236562165707747330 24226 +1242871656979657217 24228 +4534247194727872002 24229 +18405020591071084039 24231 +8388869888738818052 24238 +11573244539931619330 24242 +3561737257466789377 24244 +5202670628219230721 24245 +14079051703053272067 24246 +13402814485122695681 24249 +13776400340451030534 24250 +4608434499185777668 24256 +9585961164270429189 24260 +10632796057841501698 24265 +8892701858136206852 24267 +18272176016148011012 24271 +17519754625727291907 24275 +7921090784877163012 24278 +14344074254804835332 24282 +3984608403660214276 24286 +14878135524022381059 24290 +2350863308498458116 24293 +13924547174870812675 24297 +6312668086323179014 24300 +9853923593671219714 24306 +6046237688887467525 24308 +14614496555435571719 24313 +13082709994500218884 24320 +11262470465265739779 24324 +0 24327 +5233469006519159300 24327 +17652161961895255044 24331 +13987103377578238978 24335 +4394165191754013699 24337 +14374931472878203396 24340 +4445321672715709444 24344 +502180880685389828 24348 +6440253760991195650 24352 +2091187608337225222 24354 +17468023986491328513 24360 +6667229086352582146 24361 +7447310489297334788 24363 +16064228630495047172 24367 +4366755587466960387 24371 +14068943403346240514 24374 +11475428302772969987 24376 +3193944572116609539 24379 +8751219360258646534 24382 +381251212771070468 24388 +15595483403423106052 24392 +5951654690476073479 24396 +18015137789374368772 24403 +5453590786462438404 24407 +5664473491698682372 24411 +1070375884660946434 24415 +0 24417 +1480427149669871623 24417 +2467971418583409160 24424 +12294869202005187077 24432 +17520718864992363015 24437 +5745341797854718980 24444 +17203725453393202691 24448 +647506010334668802 24451 +18125673190634030083 24453 +18343068836020843522 24456 +6015890625594128388 24458 +4948415711362220548 24462 +15374012180933814275 24466 +18232480002611870211 24469 +0 24472 +451246736796804612 24472 +9916396633520262657 24476 +12739839251946097666 24477 +570300446109677570 24479 +15981410127772429316 24481 +9412595409792910341 24485 +0 24490 +7341944876705583107 24490 +2667033555903522312 24493 +7548229331832847875 24501 +888752491828724226 24504 +6710760182222116872 24506 +15303566380470004227 24514 +7030451415573346306 24517 +1923139160905610755 24519 +13184587830883530244 24522 +1867802947473790978 24526 +6073840300944069638 24528 +7494594069095821316 24534 +7031313121943186946 24538 +1015735190107991041 24540 +17258245559766086145 24541 +7996271666570092035 24542 +199039366681548296 24545 +12996877259240299523 24553 +4904848579847794183 24556 +3106630803097044486 24563 +6982150378936324099 24569 +13949123481026733576 24572 +17065655033693275140 24580 +9533928456965403652 24584 +6888247794917311491 24588 +5664431252714837506 24591 +2201762652847303682 24593 +10108705841812185092 24595 +17737067862680488453 24599 +12406075842896819717 24604 +1089371530341762561 24609 +1871255245818878468 24610 +15330573721389248517 24614 +17941162387573511684 24619 +997378217426181123 24623 +10438287338125093899 24626 +7749252885666103812 24637 +14426559261513684993 24641 +5992343976078597638 24642 +11988610258511095813 24648 +7115470406981692418 24653 +6965285418762805252 24655 +16065270967918269957 24659 +11425749213493693445 24664 +12651394700824816133 24669 +6813643009250099204 24674 +7273984081488433155 24678 +10002222873573560324 24681 +13996753291394776580 24685 +1485357734782703619 24689 +9553741833276743173 24692 +12304585369642553860 24697 +6114914913124643333 24701 +6802683329816819203 24706 +11064650779477736961 24709 +10174363750938768897 24710 +13941015198952688135 24711 +10343287653050385410 24718 +8606009458056289286 24720 +15178720987720487428 24726 +12992431077006740485 24730 +17409198122233821699 24735 +12294044832170370567 24738 +10610003456652260354 24745 +2245479818863844870 24747 +11775133625969798665 24753 +1576490904334202883 24762 +33235401187355651 24765 +14633107515558046722 24768 +3535329632602231813 24770 +9627647791296927748 24775 +17627425163499155460 24779 +11035265516273808388 24783 +9254115426244708867 24787 +278225542454459395 24790 +4255546486004063235 24793 +6647504327791175682 24796 +3899130628017692162 24798 +5897958461584824839 24800 +6142290702973256709 24807 +4152726145473712130 24812 +7041158954274438662 24814 +2302177503063577093 24820 +1873149849009934851 24825 +12854101060685263364 24828 +963005294589969416 24832 +4542472479193912835 24840 +6235394652999675907 24843 +17974984592158142465 24846 +17625662437270806021 24847 +8942589868386405892 24852 +2670889152777288710 24856 +14531026572405343746 24862 +4192727424182006785 24864 +9774812734963014667 24865 +4248398698566926852 24876 +1795640038151739397 24880 +13850288282219215877 24885 +15908746721428026370 24890 +15923174983938141187 24892 +11766603108451857412 24895 +15611266870123689475 24899 +0 24902 +13899962211363633666 24902 +861873314057033730 24904 +1265855794189606916 24906 +7073336798212124161 24910 +3484320399315566595 24911 +7542605225165527558 24914 +11770469608014718466 24920 +10650340728525457416 24922 +10872353355249235458 24930 +6199019384899886594 24932 +16694893948588297220 24934 +5912539958817782275 24938 +1006526997825500163 24941 +17525305958503258114 24944 +12938829933817215491 24946 +7576236402092503554 24949 +2744909294339436548 24951 +8192506843460777987 24955 +12177496006117352967 24958 +16961140321145915398 24965 +14754758511162492930 24971 +11204195073356534278 24973 +18200656016610191365 24979 +4754373453431545860 24984 +6506787893252750852 24988 +3571846435442367493 24992 +16904169407694781444 24997 +18257271210692696070 25001 +639935594011082756 25007 +6053563862444683780 25011 +0 25015 +14926879440384681989 25015 +8020736730128271881 25020 +7998065087384733703 25029 +10400036378023383043 25036 +1461675118712365061 25039 +17490484600089433604 25044 +1208238929874638854 25048 +11793872656870750723 25054 +0 25057 +10626163632107069958 25057 +10709542200290065415 25063 +8007605635845384196 25070 +18004163932129101314 25074 +12453007169215056388 25076 +7749516872025303557 25080 +14017004635321606662 25085 +14809742049777567746 25091 +5699116238865989123 25093 +13944871921366381570 25096 +17955207643423763461 25098 +11626175230192022019 25103 +3397825680796947972 25106 +17486666993024207876 25110 +1032602729683830274 25114 +4788821211113042437 25116 +604965009640285186 25121 +11017240175059592199 25123 +6245363896432715777 25130 +15542719955454190599 25131 +12483011783918952452 25138 +9304870955914176518 25142 +11960542479099049477 25148 +14585712835370653701 25153 +15596081269170607107 25158 +0 25161 +5476413583737398787 25161 +12137466808402920456 25164 +825265371742261251 25172 +15496088277582595587 25175 +719233800250869765 25178 +1636948134822126085 25183 +8832408868887718403 25188 +17685660931001340420 25191 +3672488502556813828 25195 +2482217413851172354 25199 +3399287108191701508 25201 +5974420531572817411 25205 +13781804036637953027 25208 +16934902479613224964 25211 +13719395027390938627 25215 +17849623686798627844 25218 +12908626493108857345 25222 +8131265371621566981 25223 +9770391939011642376 25228 +8812754329568033285 25236 +17597396363144135683 25241 +16425957306851854340 25244 +5698128327066824199 25248 +15091320934279864842 25255 +3677003629977205765 25265 +18232791827366551043 25270 +490594886435758596 25273 +5047766620058633220 25277 +18289367621938215940 25281 +8662947886718590981 25285 +7848515908601587204 25290 +4189521458459389449 25294 +17215880076228104194 25303 +3089493104147217926 25305 +5776236405494592516 25311 +7021390864306546692 25315 +6847121303712081410 25319 +12135688305020673025 25321 +6910585658425386497 25322 +8571880448656358915 25323 +8946504430413614597 25326 +9293565018345925125 25331 +604527126651609602 25336 +10459537417850311174 25338 +8200215725693158921 25344 +14276948101484118533 25353 +7573984069567257093 25358 +13758242087395924486 25363 +820870875856283140 25369 +11705907870873196037 25373 +11972223515114147841 25378 +7653430789606363651 25379 +17949395654862644227 25382 +3649359936127610883 25385 +3002335361212489220 25388 +15238192033667865092 25392 +8734705194145423878 25396 +4872457520859695624 25402 +1010446718870656003 25410 +12746031608438810115 25413 +3834147982093899269 25416 +6486187440192409603 25421 +0 25424 +4658212671194705410 25424 +1276710776141290498 25426 +12845558107556346883 25428 +11988880712302234630 25431 +2466830127907726853 25437 +4273789480212488707 25442 +9352429248344132615 25445 +1844364234617774598 25452 +7234876899874838018 25458 +2933834820089703939 25460 +15893255153313254404 25463 +14756941998830389249 25467 +12516944661262557700 25468 +5431194353153630214 25472 +11979324271359294982 25478 +15589921268771736582 25484 +11153326782203298820 25490 +10213069746612892164 25494 +17170268412638160899 25498 +3149098508580958211 25501 +6326711775935257605 25504 +9299994504835643397 25509 +8579518018893536262 25514 +3669694107610208774 25520 +1119405840408916483 25526 +11311300517832608258 25529 +1551700878801894402 25531 +4822057521320144899 25533 +2227347253942168065 25536 +3951124827149967364 25537 +1571958530593827843 25541 +6505845252840181253 25544 +17865513393166185989 25549 +9388663643289005058 25554 +6630137311087756809 25556 +9360988334714635268 25565 +11848744441682457090 25569 +14839315957506786822 25571 +9251551770375956486 25577 +16607775753010668035 25583 +14076569148844517379 25586 +12192928183246627843 25589 +13550387411423729157 25592 +17666481433749520902 25597 +17192100514829855235 25603 +16554749743032479237 25606 +8073412368868806146 25611 +16345420769586036740 25613 +3173109320577200648 25617 +12181385247546591234 25625 +2910657903921825796 25627 +5505161967194131971 25631 +9871131912793876999 25634 +1646713877081967109 25641 +15669589104639071235 25646 +16047042670483912194 25649 +12702665232700089351 25651 +13200855803182644228 25658 +11587832094712660486 25662 +12466802996255649287 25668 +823685791348723716 25675 +18249892823788331009 25679 +3581057825900067330 25680 +14073319405193384966 25682 +2001467115996591105 25688 +6875138427994265604 25689 +5365681514389727235 25693 +10346267474285613573 25696 +4309122721514291204 25701 +18403010898331163652 25705 +12508041138426527752 25709 +8240480402723826698 25717 +15744929427490861058 25727 +3480396024380483587 25729 +16230935782976412163 25732 +11296276286476526085 25735 +6710466239839051270 25740 +1428712913702546438 25746 +16609344619507297282 25752 +827861303219071493 25754 +11553145806288423430 25759 +3359582289933976068 25765 +8655146408409937924 25769 +14512244565247860229 25773 +10794598759985461254 25778 +7759649412509537794 25784 +14469046333163763716 25786 +16630647546465121285 25790 +11313000762537773572 25795 +16342691225398430211 25799 +17251565591254719489 25802 +12600349437117571587 25803 +9532645350325595139 25806 +2450101830333342725 25809 +2006223669516684805 25814 +16075139926686117380 25819 +9697185495769198601 25823 +17980079937314765319 25832 +16873608956994373125 25839 +13966648140031529987 25844 +6382463413298706946 25847 +5742618459795340290 25849 +7754546278681104389 25851 +3059252273717042691 25856 +7603543827106316289 25859 +2467902643542275593 25860 +9463899930575595016 25869 +2634153568665022469 25877 +6906823524134455299 25882 +12013207540735161859 25885 +18152951461695684099 25888 +6574348667508910596 25891 +13440564823701186561 25895 +16479599927956423172 25896 +12401864790045575688 25900 +2866162394705556483 25908 +0 25911 +5850201328179984901 25911 +8895041319770723844 25916 +2432568097292913669 25920 +568444565808612354 25925 +1895782726183909892 25927 +6106231300010446851 25931 +1282566154762021378 25934 +4356868712916027393 25936 +11731725897714074631 25937 +5262227199771045892 25944 +8901238784624778756 25948 +16743857695711051269 25952 +8457959839952182277 25957 +1044690483190249475 25962 +17975143647079645699 25965 +15688057258205349891 25968 +13419537194644337673 25971 +7042377968588872707 25980 +9228624186499046404 25983 +7043992141563084802 25987 +1146093973695489540 25989 +2260702714611855876 25993 +16648149135536599041 25997 +13558550666578374146 25998 +6605747985120024068 26000 +4782586802791291911 26004 +4274100748523034626 26011 +4471257387085621762 26013 +3681779948642206722 26015 +13434933782635570690 26017 +4552266169490634245 26019 +12043480356802044419 26024 +8962188653039116291 26027 +7445876128761640965 26030 +11830582585590405639 26035 +0 26042 +10870701282425653258 26042 +2890697581892275203 26052 +9864466405924292103 26055 +12269881413681591302 26062 +16078239324155970564 26068 +922410230690411013 26072 +2206312753452576772 26077 +15113919202557029895 26081 +17018124176572843525 26088 +9109922905933029379 26093 +15633828410905387525 26096 +9624937834263490053 26101 +11385945509487503877 26106 +12292645872123470340 26111 +16323206185309035522 26115 +2834374155140704260 26117 +16866255299444239875 26121 +5561059394607983106 26124 +2967374801051933701 26126 +1046483560511543300 26131 +15296675439390983684 26135 +53823984371589636 26139 +11817853979174982148 26143 +13588398166312345093 26147 +2921422799659876359 26152 +1037913293740151815 26159 +11081241622196699649 26166 +7989938387741259266 26167 +698853598498597386 26169 +10830932629144068 26179 +198755885061881347 26183 +5596238791680439300 26186 +668978002907288065 26190 +17811963750719182339 26191 +6915598525687685640 26194 +2419668182514706947 26202 +5399502422842534401 26205 +9363490528683276804 26206 +7342486868924583428 26210 +7524373262080323589 26214 +17470786589873091587 26219 +2837645362836855300 26222 +6675469529903703044 26226 +14283465286140007425 26230 +18009179297564582404 26231 +345705448266066438 26235 +344365606229283843 26241 +6125692498059770882 26244 +2352424589988614659 26246 +6560773214088609795 26249 +0 26252 +748975010709715459 26252 +9228877818808492548 26255 +13064523319207399430 26259 +2965615252125359619 26265 +12440847140155618819 26268 +14887546471523831816 26271 +5231678774710174724 26279 +14895260036856834562 26283 +262022606589063687 26285 +0 26292 +7899036695262770692 26292 +10605098552588886021 26296 +8850012936905382919 26301 +17308851655354011653 26308 +12188455769277335555 26313 +5823645979634531844 26316 +195522185249099779 26320 +14185816487155472899 26323 +15925881112881178114 26326 +2296422177932435971 26328 +5995836228392261123 26331 +12421706825260193282 26334 +16910623526469187587 26336 +8006716158879121927 26339 +13346063405445641730 26346 +9686149049064413193 26348 +7133695071770023426 26357 +17794668400317108231 26359 +10729698432623348740 26366 +5794437765797751814 26370 +1230132740611084806 26376 +12606952452936135684 26382 +7581958218025691141 26386 +9334614292917539845 26391 +15799295571469322243 26396 +18196669071452113413 26399 +5638428613664308740 26404 +9597900709128971270 26408 +10424660342557788674 26414 +16474945703340730886 26416 +8221981326449055748 26422 +7793854492568244226 26426 +1783419205863795203 26428 +3786304277165829637 26431 +17255600692972716033 26436 +14530694519523485697 26437 +13685876468783997447 26438 +7154780282148444165 26445 +16506913838789251588 26450 +5543442767584826369 26454 +11078839517591680514 26455 +7129370731118017541 26457 +10382979164548058114 26462 +13236038143379237382 26464 +1110291274506279940 26470 +1820507415532466180 26474 +9946464190439779843 26478 +11336515890249566724 26481 +17909282031306763269 26485 +14540819350933536261 26490 +5153852053465696774 26495 +11533745890572369924 26501 +806889486239979012 26505 +12074302603602817027 26509 +3744728155642010628 26512 +17494547808547570694 26516 +5664404560050761219 26522 +3513309020020989956 26525 +8556525643994014216 26529 +16016322459902147587 26537 +17117441489884099077 26540 +6637377568626939908 26545 +11542568285340469763 26549 +2392353423988516355 26552 +18015975036940945411 26555 +3340905045242173443 26558 +14074446437944570373 26561 +17870563227301265410 26566 +13148993075811829254 26568 +7286255692795774981 26574 +4029305867198621698 26579 +18012140708207531012 26581 +7048857064982787590 26585 +2448102152784641026 26591 +5240198343931616262 26593 +2679244379173903879 26599 +195634338281085957 26606 +12655747376488428552 26611 +588302091066484742 26619 +11308612143632206852 26625 +11003386194430957572 26629 +16025149975830750211 26633 +9784776650061177350 26636 +14684783013085426180 26642 +4473085540499356162 26646 +17703713313336819715 26648 +15749905879536642563 26651 +1393223194145586693 26654 +14281961389180761097 26659 +6919292293468946946 26668 +10500471931875257350 26670 +8749935316194581511 26676 +16734454934740689414 26683 +3487837223782191108 26689 +9052342040261133829 26693 +9519885863808569350 26698 +14591555995453915142 26704 +6099871815319455750 26710 +94585758437778949 26716 +2355306608976794627 26721 +14926211201816783878 26724 +10322187404703141381 26730 +6657924382101966849 26735 +7127620840733199362 26736 +16721650669494134275 26738 +15278152945935741445 26741 +5286219703733720066 26746 +11270470093488129029 26748 +12587269265516438531 26753 +6474897700567352834 26756 +14485621289193879559 26758 +11364496692887976965 26765 +10486488746383261187 26770 +2869166699765902339 26773 +9441436394789185540 26776 +18083119545633107975 26780 +16355158224176897539 26787 +12029022139180777473 26790 +3173215264072769027 26791 +15696613120759371782 26794 +6144078826961093124 26800 +2831680145811566596 26804 +10866626548640116739 26808 +10481916265480644615 26811 +4936775579099335684 26818 +9100515068332706821 26822 +8024609681770649603 26827 +14555081865191843843 26830 +8435761415060062210 26833 +11744131187960966660 26835 +9581855952338230786 26839 +6991714624584075269 26841 +13691845008183019016 26846 +14847323015200070661 26854 +11162249457964372999 26859 +14769726253412422660 26866 +14626583808523501570 26870 +12195149804785732099 26872 +8244915725735059464 26875 +0 26883 +3008219350595442179 26883 +3280466272498393605 26886 +8150666080149108742 26891 +11022542998885274626 26897 +15917959008493681154 26899 +276017786622548487 26901 +8520176035453850114 26908 +3031269856454158852 26910 +1353606491795872263 26914 +16368886598496535044 26921 +8484678370529341445 26925 +3134810949756533763 26930 +7800378552234578436 26933 +1391216964593303557 26937 +10778916075202323980 26942 +1448672125191542276 26954 +6385415006852818436 26958 +1683664210297716226 26962 +3147140901886471172 26964 +8412814177381368327 26968 +11108788502373744131 26975 +2488756250777698308 26978 +11302923490348889606 26982 +7486071503843326979 26988 +7342352982249078274 26991 +3232909501302083588 26993 +6102488929727873542 26997 +12350472987714231811 27003 +15350827031495073283 27006 +9958933809437712388 27009 +12623310372337964548 27013 +9576093247986916865 27017 +13085341118837014018 27018 +8820236434049139204 27020 +8240299923964322305 27024 +4159706262587897349 27025 +10670815441761567749 27030 +7068552353851751428 27035 +13254486443452516866 27039 +4471118871051672070 27041 +17180582141656274945 27047 +4997411873878271494 27048 +3501686381335443976 27054 +11286053616721857026 27062 +10488887652148183043 27064 +8886963280386445826 27067 +10533260672262459906 27069 +9641900191105246211 27071 +3075919226962638338 27074 +17520915218027851783 27076 +13925672206096462340 27083 +5439385833091859974 27087 +14243732740113220100 27093 +15592143975874792455 27097 +8997727347287806470 27104 +10424066016097853444 27110 +7501217778092918275 27114 +1075646480488467970 27117 +18058962486057843716 27119 +14369426206391290374 27123 +17276668018375632902 27129 +3748847973892275715 27135 +16764804099423556103 27138 +9006091885002600966 27145 +12026266393015675912 27151 +1105500620102248452 27159 +4785290264547499527 27163 +6978705233271629829 27170 +1130160791378667013 27175 +12335452163620435970 27180 +3686481125918646788 27182 +2542522857239030276 27186 +3589606865746253826 27190 +12552743352368756227 27192 +18232798138301315588 27195 +7316347267653361665 27199 +18167949950609146884 27200 +5024187878398144516 27204 +7456652818878817797 27208 +1395286417803506696 27213 +12961985230530608131 27221 +4147734950600421894 27224 +9722989347969250820 27230 +9083549625489668100 27234 +3664666660144311299 27238 +8959419110900237828 27241 +5553529769969892872 27245 +4246061396497230340 27253 +4822191890440430598 27257 +11211906246393911812 27263 +6848478195678093317 27267 +4954949366589552136 27272 +1974397514788577796 27280 +15007873233184790020 27284 +17277400476809197572 27288 +13532030098022371845 27292 +17677501567026844676 27297 +3446723425016085509 27301 +13886311634719239683 27306 +9586101772951327236 27309 +5155182439540033028 27313 +1169587213327981570 27317 +8237712426484747781 27319 +9244860169840804866 27324 +13683213366594845187 27326 +5051241960912612870 27329 +10835818111050469379 27335 +16042839191231193092 27338 +2619467081433918979 27342 +147131367927684100 27345 +10665362903870305798 27349 +5653111573624368134 27355 +375584679874299909 27361 +14525265683420749313 27366 +432558157630608388 27367 +16292344494697509890 27371 +8751346176605993477 27373 +4873492557166828550 27378 +1049673069666043396 27384 +15842313595051230210 27388 +147264119553937410 27390 +11756504092401036802 27392 +9837267249719330305 27394 +16131197654493874690 27395 +15451688148690201603 27397 +15809715559513975299 27400 +15630686053219703302 27403 +3618158929348574211 27409 +9782178545065601545 27412 +2752820535826828291 27421 +15891134512654757380 27424 +7034386580295145993 27428 +12116333686209456644 27437 +10174304713757693447 27441 +12253662515516915713 27448 +7550324643037303299 27449 +18360398773075969543 27452 +7237232579368046087 27459 +9613479660068310531 27466 +3499648588932929027 27469 +6516627242611611654 27472 +16005110232704619012 27478 +5776983248612602883 27482 +6155706342827033604 27485 +13437812642618473991 27489 +15179999934853344775 27496 +1898076527862277636 27503 +12518435787628947458 27507 +11338692921380554759 27509 +13353417955957816835 27516 +5860771007105874439 27519 +10783560161432391172 27526 +9987881495344849926 27530 +8421842939340968964 27536 +8249662980301807621 27540 +2145870488715683846 27545 +6518393701403160065 27551 +1796424316566573058 27552 +16900154922763670535 27554 +2870912908608101892 27561 +1304349631439577603 27565 +12409879380679973382 27568 +4057791366213311489 27574 +12533276048724285956 27575 +5973512774975400963 27579 +622587294887748614 27582 +12018120020760553476 27588 +13826347422201289220 27592 +4762354968488864774 27596 +4524013772732235267 27602 +11586465192778361347 27605 +5392389579297063937 27608 +11400737333656458243 27609 +14618520449686712326 27612 +1361552199205359618 27618 +5083108992099550723 27620 +8104709673983775235 27623 +13402471732488776195 27626 +18156818210118712323 27629 +1798890739753856516 27632 +1223471304503691266 27636 +0 27638 +8621402320853579784 27638 +3889412641608078341 27646 +5055343780742286340 27651 +3216684737107447302 27655 +14229611341044867073 27661 +15558263538203588099 27662 +18375719548819877891 27665 +15813009964992095238 27668 +2464900132630718981 27674 +1515765249901700101 27679 +9521831867569777157 27684 +16949714640657581572 27689 +2329840909049714690 27693 +17436473083288791047 27695 +8178015344742712835 27702 +17940400890257652228 27705 +6430164718508177410 27709 +10801382273407711746 27711 +12777267925233438724 27713 +3877579593157398531 27717 +13319056577659104771 27720 +11906663009744061443 27723 +17428314880490298371 27726 +7418786702237400070 27729 +14678600622743277060 27735 +2474078566299736071 27739 +11042886834646631937 27746 +13312725324099152898 27747 +4022180338697843715 27749 +5080517866480154115 27752 +8156467410417693190 27755 +17267187287864409091 27761 +11497516979312287241 27764 +13569460310789910019 27773 +7518467997218620932 27776 +13070160253209305603 27780 +7040850610130617860 27783 +0 27787 +4220608861755343364 27787 +16554669277945581574 27791 +595145960962535940 27797 +10122121487026345477 27801 +8892573337066229254 27806 +16686424766445128199 27812 +6770766767722113541 27819 +8593033412793342980 27824 +12442239126424642051 27828 +13263703269134096899 27831 +6385161970679072770 27834 +7735184941528572419 27836 +9304502789264267268 27839 +12351784909956926979 27843 +2880100774595672580 27846 +7429928805938670599 27850 +16368667135136940547 27857 +14364459451009725958 27860 +545053384611068934 27866 +0 27872 +2191422495147304450 27872 +8310835751121401350 27874 +13829753257442262532 27880 +5240557725077556740 27884 +17239188253798796291 27888 +15804618599038019588 27891 +14745958082150437377 27895 +16244382040190912517 27896 +5176414235846956550 27901 +3513739226084046852 27907 +10279328541209423365 27911 +7757122862044609537 27916 +15598613683385024515 27917 +2564557213253621249 27920 +16761460463794177539 27921 +10057047431352152065 27924 +18006832036041418756 27925 +11549737097282641411 27929 +9235910446611781122 27932 +17413798890868459013 27934 +8407021868911686660 27939 +4845839435810602500 27943 +6006513226312001027 27947 +13536101212952691718 27950 +6223582426461031941 27956 +13295116174814553089 27961 +8508040238892459011 27962 +16337072029493412354 27965 +0 27967 +10700771560166858759 27967 +2285823058027027971 27974 +3080546017316249092 27977 +8194783598788036617 27981 +13029225094369232387 27990 +7596366844458808321 27993 +7377479126391920642 27994 +6766779226111266306 27996 +9226729045589246978 27998 +10173354730201182724 28000 +1468200969673800708 28004 +3166069071501545475 28008 +6380326642996418052 28011 +17952378910424931843 28015 +8158079503861171718 28018 +7318064812501423619 28024 +1245957352202681862 28027 +12396312684426516995 28033 +7684871802716953092 28036 +16234066029364989954 28040 +12915851346179328004 28042 +7281410558554826243 28046 +4660967474287788546 28049 +9840362684032431618 28051 +3524850899286513158 28053 +13545488880025471490 28059 +809926346517548034 28061 +6995504328150139393 28063 +10034017174479275013 28064 +186180334663711751 28069 +1063172542843677186 28076 +8285633055977080325 28078 +15035871543837220356 28083 +14942544540787002885 28087 +13836850029281748996 28092 +10948173826532381697 28096 +2324288150131036678 28097 +16336290120382891012 28103 +7318236103188190211 28107 +11083215203594066437 28110 +2381080347703278597 28115 +10629996518826926085 28120 +3082348670022376965 28125 +4842059953080733187 28130 +0 28133 +7311476970086502915 28133 +7903634447602669569 28136 +11972113666077429764 28137 +13152594320338658306 28141 +8193374184350339585 28143 +2141594550907129348 28144 +10450492672025058306 28148 +9387985640269433347 28150 +5983902379444633604 28153 +4858010476205058049 28157 +8850168287238029827 28158 +16688637176656026114 28161 +1945029419626634757 28163 +1676526438839549447 28168 +17286635952634856965 28175 +2088384066095821314 28180 +0 28182 +2964017875771956231 28182 +855624542077578242 28189 +14892172170191644164 28191 +6612991671763228674 28195 +15194654524293992963 28197 +8758459668790766085 28200 +2548055658338270722 28205 +8327167366013708292 28207 +10403282793464861189 28211 +9124841415086534148 28216 +17566805500792805889 28220 +4630289020356398598 28221 +13648352990632903683 28227 +0 28230 +17591548856777894405 28230 +3562582011883224579 28235 +18182197624745111044 28238 +11705476618456432644 28242 +14792926507444500483 28246 +5326993200714919939 28249 +5048690790740402178 28252 +8181678211224550916 28254 +11709255950501104646 28258 +2582209636049208325 28264 +5443927714233498628 28269 +15989169951753241090 28273 +596280371067600387 28275 +5477290056279088135 28278 +2168329545856872964 28285 +14814662400331579912 28289 +772339942837213186 28297 +13367690288993158658 28299 +17853770245080822788 28301 +9558241057762813443 28305 +13882211544826064901 28308 +8799478436840589315 28313 +16979613459177100294 28316 +5443167718866574339 28322 +2992424036115425797 28325 +10129019856026884613 28330 +8023778154032047109 28335 +17085317781743672323 28340 +16602441073989671941 28343 +17206029348662434306 28348 +886971277470048258 28350 +321543337237064708 28352 +5909204083928730630 28356 +13828831704900858884 28362 +13102295955191143944 28366 +14098964092023052293 28374 +3436583933268448260 28379 +6722191164809163268 28383 +18344574424002923010 28387 +6555780959920237573 28389 +18024592149225913348 28394 +9254921390552094724 28398 +16558609014973372420 28402 +679092886464957443 28406 +11150219162199050245 28409 +12328434920089664513 28414 +14116353427730603015 28415 +18019974580341337604 28422 +5334570431422285830 28426 +12252147524837697542 28432 +8772720843793600519 28438 +4936226690166132229 28445 +5597699376331235333 28450 +0 28455 +0 28455 +4584385339165788675 28455 +10905880101782047237 28458 +2824929064107041283 28463 +3741986295057715205 28466 +14937952786581298184 28471 +11392781867700624904 28479 +4960786875875291650 28487 +8048766876653817859 28489 +5057530935261149187 28492 +17581306764435695105 28495 +1618037617150652419 28496 +3269700999116910082 28499 +7723657471213979138 28501 +5179130912236545545 28503 +18023288753951537158 28512 +1581374782339657731 28518 +0 28521 +8958288777424791044 28521 +15166601245424375812 28525 +11545785629215876611 28529 +13546463049416030211 28532 +2469303594089646594 28535 +12147633363236624385 28537 +17611860469016638980 28538 +8800772272595850757 28542 +10923676309329243141 28547 +372190756245978629 28552 +4414522656914765313 28557 +14111513333709766660 28558 +10510749322092323337 28562 +6288602906881384453 28571 +0 28576 +11602071110484892674 28576 +5967966140029625864 28578 +13159682470111820292 28586 +0 28590 +2438896670310097413 28590 +4229470721608786947 28595 +4607267255236008453 28598 +6752182174598235653 28603 +10137373799983976965 28608 +5274127864056043524 28613 +5608676394931841027 28617 +6773223806072598530 28620 +6599847116087781892 28622 +17312500478955085313 28626 +14082535990907241475 28627 +6299590187540378117 28630 +12018328536389122566 28635 +16703369590745074179 28641 +4974930060777376258 28644 +6502309230683364355 28646 +15952711250796520962 28649 +7605647104839661571 28651 +17490626542209442820 28654 +13568815612586168323 28658 +3215688815258174978 28661 +10292560650169198593 28663 +9725110180280765958 28664 +13697544866850542597 28670 +12570213635643774468 28675 +15720878499582542851 28679 +11595983049763955206 28682 +12127642627235337734 28688 +15182393610224321028 28694 +5809777998701283333 28698 +15570988263165847557 28703 +12408124524322416131 28708 +251585110279910405 28711 +6461735207022377988 28716 +11946231328684572679 28720 +17578861036625310209 28727 +18377888810445064193 28728 +11462887380525353989 28729 +11168677051035706883 28734 +14655751011354213893 28737 +5311440810777178113 28742 +4580235998657878020 28743 +6678746785738700292 28747 +16527541002954472968 28751 +13610322881056049155 28759 +5003546794758175240 28762 +191209679824377348 28770 +2566142644196997638 28774 +4032686796607078405 28780 +18140077700757205509 28785 +5628331767171772931 28790 +3067111248541577220 28793 +6470235186415737859 28797 +9252325044879613446 28800 +5945278917330699780 28806 +12296660176756768259 28810 +7890841151949909000 28813 +14867914499643924996 28821 +12457369739430330889 28825 +0 28834 +4782097081155742723 28834 +13704357261628804612 28837 +7637959394578393602 28841 +9018565693784916998 28843 +7438891449032365574 28849 +12322327646635411458 28855 +18372122412682521093 28857 +0 28862 +9802146037149116418 28862 +17233341794821036546 28864 +7775957816378134533 28866 +17475354965441495042 28871 +3444226807626852354 28873 +1776404393277553668 28875 +13021615599901387779 28879 +2353026816255670785 28882 +17866201293686401025 28883 +15201589086504449539 28884 +4268778340561851399 28887 +10673107145953242628 28894 +18106408818419857414 28898 +2356954187111999490 28904 +10921696016979684354 28906 +3820413625938532358 28908 +14452915345687914501 28914 +4947821825996438018 28919 +3492009035054354950 28921 +2210688208746112005 28927 +6200649544770926084 28932 +17718620971920654337 28936 +9062725364920098821 28937 +3450534769538371078 28942 +4702508823791081476 28948 +7241530317930102278 28952 +1981073399781107719 28958 +5641287951865260547 28965 +3754275253666953219 28968 +13581675285043748867 28971 +1881984123935364612 28974 +2245383459020903937 28978 +1981785935288677380 28979 +4556607592662397445 28983 +1809146901648078338 28988 +2187175804599477763 28990 +9758214533678750723 28993 +28996 +6362646432233378245 +6155298010574883251 +14414852539201701259 +7439421402040573514 +5987393597442121175 +1873618385859068400 +16269533438987940292 +12454108019635062383 +13467415658344829626 +5510290935456544199 +14694978023917489692 +11423146816890476837 +14241949623417465078 +10429166001378113638 +1709856218598091302 +323797827512659266 +14686115110486233844 +3897700625304528820 +13965339857585120678 +5501615920945045177 +33560368941777830 +15211766787409203922 +8054291783897991542 +16913684585448106135 +3704703209909011963 +20305683995650582 +17635272854170586886 +28766150282773591 +10645348217269020357 +11405387964662111245 +9870725194215517 +1633291708321649614 +4201690375266111848 +13819018690771099 +318138369899 +363084051790629688 +5371972696488827904 +7576852735584046364 +17255487642565172205 +15582002220618622207 +7171425869198153043 +4500349971286861311 +9870724566904302 +14101035093152583 +15585096757891255120 +1873618476140792146 +10376580649760853465 +2337133545867526247 +15381273249265509829 +11231012565665256398 +20587618715908100 +17792598838709988368 +11731158 +880547325917420043 +2275077955903578915 +4525916745200975641 +8681213026302116238 +4448157743373636222 +17167704865614680426 +5123966563938619296 +11462252108485108167 +15134842104898799118 +10369289955208081183 +361952219817513815 +3037586155689286023 +11846037961957312985 +7531690769748941345 +10720606758114626648 +2933734509745341832 +124092533660460795 +1693059477266131403 +17939922315943150958 +3445018729739990926 +5354604945682477474 +15282335365631857754 +7387885123368597633 +530653668674250401 +16459447294307932945 +6817300584488775266 +15987071511676326366 +13935616535030024281 +3918266916966911401 +2325192619342704334 +13042703118959721640 +2574671723021221916 +4199805580056597135 +7401639761433855789 +494696889931805263 +1374865351926093695 +7562235583526800081 +2055823596659950438 +15290807410151136309 +6868254539065794790 +6434126828092413628 +9870725383155899 +1572232307513715796 +9096289819267054561 +15293345540579012417 +1038887003891523514 +1893423951699593931 +15292217543753807946 +12595141854107537407 +7580267950467139362 +5095261602624058860 +9894352443289849727 +12337048699809914732 +5151347560246155634 +4952410902551142040 +1734238263209301949 +2688678228647689854 +2625039572996398430 +12824037281249575117 +15292499560156188164 +14813064176842660078 +12700676895825485621 +7516081834097649305 +5458848630090965208 +15611783113020876300 +1252168750434755448 +10670653605843064545 +17101493326052287542 +628865590885027781 +32432303331018178 +828707506565684474 +14098149776537172727 +1366033375 +7515799761807542411 +3079847384303748314 +1574770502428945403 +48431492 +14592595666132471938 +6425213859614951480 +4291298457888448555 +11822756372464996501 +18108515707513615039 +156041850 +5299098878702595579 +477658896783981559 +2133852140582429800 +9870724666584896 +11401612943088228773 +27920101074417583 +15331258472004071487 +825605291742290345 +17448309298063499188 +8816997365064994109 +942133318179492950 +1436145034594233060 +9288263702480623030 +1873618360063454011 +3801219 +18039656224784994982 +13462535834956686501 +18411699885273055253 +9625506809263368030 +15087607024162515837 +12594577834199375725 +10079827122923641374 +12983787067031968831 +7465404271946632160 +1890603817765912835 +11781590272624962660 +5993604037222484143 +8743636762783399358 +5885261859847867262 +4904404350412153510 +1627738395989793551 +32432346320939226 +16307934016737521778 +5371972717985017604 +5767631357003324081 +4541910497317690329 +13292359389385483298 +6510513428198089072 +2624757543696228903 +9870725052395457 +15291089413655697056 +12242337920945371450 +11070187651120768819 +12573073507899292334 +1733392171011027242 +1873618497636993704 +1892295941976577010 +1752579563187360799 +3792271682742539060 +933515197984559116 +8052681705150179597 +15287987246124116124 +14473139378666215143 +2979485022366097924 +2625039560098590263 +22151483 +9870725375225990 +5194855125508563221 +1795696995355217948 +7434126834695170963 +3078633675272112982 +4991817542145478560 +16664118286155408602 +4799330753387769426 +27356081166223293 +15289397379726773461 +14665063599729829 +6812861364263993207 +15292781563660734452 +13524924529209056493 +1413046550237885427 +15292217474968265342 +6981729909914862956 +6749680603453812148 +7880716380647338300 +1873618441749273652 +1349355141337064715 +6523880655054768550 +14947080002102849 +16073025074571139237 +341040532129597805 +10811668319096800853 +10082791751386684994 +15292499491370636376 +5408600003519975755 +10375505326587315831 +3866991147615461112 +3727880716634626950 +13513390332480988486 +21433663624860540 +3402960955399294666 +1159139895390715484 +1873618347165632215 +12432001886180297101 +11417618028100141014 +15682076488783521035 +18115578910873816258 +14389854901161191446 +40501610 +8450991683873290965 +2109896821241030130 +5409103899389468452 +17247780946628644032 +15290525393747518993 +9870724658654998 +15288269279722027166 +16878882991385562639 +10087306384122139914 +11065179627923321783 +6915698490297890436 +13819027289163857 +9391897706793274792 +15291089448049714991 +7342514853872620302 +4129856586587124014 +12202820942950715713 +18331401509617996 +12607290640649562232 +882239441530922858 +6436073107885675237 +15291935527350200626 +103481913 +1032570665458286008 +17079023093991682317 +2860001624376496429 +8594986363552417684 +14101043691547160 +3493395603981281153 +4502324021620638916 +12786169256393977764 +4078298749243768424 +10133602112901625308 +5575654823229803012 +11095870789673563980 +3650607194848434448 +7188664681258294377 +9870724569368358 +14904290184156224202 +8502756868577775141 +15289397366828973421 +9870726102216943 +16980449458069247796 +14543875786842720538 +9870724677005146 +6288036249833399015 +12974006819746366090 +10931444918094794233 +2652256602006231371 +6064503740189587509 +6828603253038147162 +4181978400847522537 +3708651426650219609 +6282363583088435448 +15404667579268686068 +1466296524688480176 +14448819400785287130 +15310633543684413094 +9570868607046205887 +369726672975 +16957192840682158977 +2394361737184365941 +3017170418691476659 +1873618381559637048 +17940204315149558272 +2688583142480553828 +3475071577772612034 +9870724632375008 +3911134543245756936 +1005889909089116156 +1756819563673298059 +6393077352746669211 +17772450815750777391 +15855205495096160616 +9870725107445792 +15289397310941235057 +812123024 +2663285062890641584 +15806549249001663325 +4449074077262159366 +9255035214324051790 +7867619042723893531 +2266898657653040149 +1413892608044639876 +4668531667285392529 +15292781494875218016 +18322998578411420016 +527486618148360561 +650823156059943422 +2572415617594112462 +1873619069417053759 +3691753447966271666 +8507715533846353796 +9250794005054035020 +17599750168450258147 +9870724587744865 +341040463344049653 +10849580566319470715 +13819014391343948 +5888796281315790591 +16061937549871422927 +22279721431611181 +4654233706028229378 +2159146464034164164 +12962360423422059796 +1873618519133213721 +3062219857732765097 +10503684833886227156 +2787671440263038519 +5111716669164120783 +2175836266859145058 +3103508017812937311 +1087507565178193378 +7241043917845981650 +14570771914465568497 +15293909556187765174 +4287350228250667507 +17153706162049649384 +2625321572202779346 +10102215645754056509 +13451263125959483644 +12455539079503547991 +9291494327182519474 +15167386733525285861 +13304414695607384215 +10381023484200763056 +10592171188278987146 +11743153391473276418 +15294191572590161167 +15291935458564645543 +2449021754955873895 +9870728774119739 +5942135328794819896 +6549705653207180201 +9870725081165812 +210659378559 +2286775792224972041 +3818332295662294304 +9870724606094983 +17702475088433800526 +6829351451017032969 +16926843613740873971 +9870724821315508 +103179363763095696 +643567211612363096 +5248721418517824771 +13516435399651838961 +16323423076943940945 +15135071860308464486 +1121588483038535113 +108586583709274527 +7932650565040492944 +1873618368661842554 +320269593935495736 +17002949932427779227 +16860434628194282651 +7523965544371342149 +11743236838721014814 +5723537903358642458 +14929509407482202828 +9202569951037054934 +1547628808116657334 +16285378285009240167 +16421351689580522670 +2676315656185453280 +6291625 +1041707142125397293 +6327806967817001732 +8211561486099176576 +12155591473290045091 +2900736758925713546 +16373637883993923924 +1873618312774107399 +5219221325086663137 +881393336434827422 +5245848942942492566 +300941118996 +18157949162008873831 +5780316474349406356 +8372280543110909133 +12083133568301285706 +494402426070 +1414738665851394264 +15288833308228589839 +9870725207126116 +11849360870347248942 +858842159115360227 +2481036767168567046 +6509730691945358518 +15290525359356008791 +6983055104012986635 +7422259951698522276 +12908144046487836672 +15292499555856750602 +69272016 +2625039568696978172 +15730244945629431369 +8928756238576537221 +9870725054885835 +9870724579796415 +16396392956868848995 +16345377412211959804 +5514354727165429372 +12269921124804135698 +4133240736129554623 +438514700305 +1873618450347673755 +18159740962976708591 +1150181137060160825 +2507605048 +5671848381726805482 +7718197728942437663 +5727744607132215876 +981580318426999614 +18411417864571256842 +9870725117866046 +2005312455576873172 +6100103917338124044 +15878320034000877906 +7579286955532685574 +13044533461223476582 +1873618355764021035 +4825924017323379312 +1987904546 +17418714735283948581 +12235398167260372307 +2762321927558865466 +14452190432466840171 +1795978964468245865 +9870724598160990 +17639632887023929831 +19459574600131845 +135910432858906387 +8680717255516447719 +1411918531917722459 +15160175795434492307 +15287705225422325032 +12068249584032169422 +4502606102509148386 +42991988 +2624757539396797679 +2657504247927822361 +2342713540161573846 +1557248700424803815 +7196582198047548706 +7601774322648748185 +1575898537944627290 +4883478643252995729 +14657154954176577574 +1943289737916790642 +14648987522385860885 +17955470565775510239 +1873618252584476146 +6204347601746593065 +5984954169514465624 +4660099683984288556 +3000062970512093901 +23125706158857554 +12873787510744428666 +16961952154105629366 +5567604628532762618 +4715157598322189018 +13960695904776632517 +14665059300281706 +2845029541903937032 +5304739206756638012 +8693225804604382230 +3094748918170463169 +9870724724125572 +5245848874156967447 +13497082958030245601 +33560429128451329 +425616878347 +61342108 +7352369464500556508 +11667482570719055720 +6153353818705447932 +3721166898783596590 +599078861879661612 +22279785917735420 +644023149 +14206340269106671806 +2689242209864929490 +16538629912591801891 +16987676926294383258 +1110075008311824651 +2400461242866950571 +12722344974410257439 +2325192589247651252 +5246976935469519717 +15292781503473605020 +15018353792457058773 +16711957 +9558026035278535011 +2052045723459542582 +3595101192354676266 +1992881785902860007 +491782859 +16646707010104274009 +4394978118089334510 +9870724634865403 +16058583579040900809 +5881866613803452649 +9870725109936183 +14628605590055882876 +4418619807196534492 +1242744568252940176 +5353476789791242349 +6100103848552566864 +3374073543078650260 +13819022989737517 +9515351559639214262 +1776768834721287909 +7258279919875989683 +2414921941537785811 +1734238280406095065 +9715965029733984837 +583905524739631088 +5165455481705799450 +22561746432374734 +17465760294459089485 +17103749409982721615 +6310847490462324639 +5619444469380695274 +2522029733630468318 +15369906677232836614 +1151813151427938869 +14044077120902336450 +4318600137717194077 +9818373479197200963 +17880604334696381643 +9870724653215497 +12667953721599927085 +3545799486232347962 +2792183694107936667 +18212326332965261565 +12716605781588708278 +14859771242809470723 +5776822643553813586 +9870726293647619 +17536100556496590382 +18895589085953250 +573113178 +98042399 +17107979664621267575 +5728764444738262552 +8600430310025345122 +1873618377260225596 +4289606368070101531 +5884848086072042746 +1735930348729031505 +1625947627399700150 +12614069984647660223 +2113895771773937201 +15290525423842114479 +14318753429552458107 +15288269309816623337 +6196736653374985954 +9437519285693010609 +749988178262903271 +8508972205565494567 +53412232 +702355655484642792 +356831348088 +8807355653287209087 +6152225753094686522 +9870724671565652 +17790217324792008203 +11103794187003059622 +5245848951540886183 +6206603737268310363 +1873618514833773530 +14752094554945252266 +12014667835681882463 +4226077121792323178 +5948794375045861619 +5302200977449886289 +9051123538542480673 +2625039577295364213 +3598538847361700764 +300943623115 +9870725102006295 +1042271183528550960 +1254706859367230227 +9031469484207262326 +1996539699469566727 +15924026036723847924 +8879432398259758690 +279344297339668154 +1146232907422389285 +12931142192505317811 +15079092138406456093 +7459974813222136048 +16607536221675929007 +3899809212451740798 +3493677603186412637 +733575522969072980 +13650504529854072320 +71762418 +10528906628815718922 +546833214 +17515242666411576100 +17726932693903618871 +15290807457440019274 +9870724582305346 +5281205705011572285 +206359958755 +1712194570 +17760612867621472674 +18895382726842181 +14320732808355385810 +21433680821621854 +17233854363996271553 +15289115277341644165 +3973490993339565383 +860090351023574663 +15282335357033003846 +16588826745223591848 +17346604615511387403 +2474797953316292924 +7831574737457135061 +2947421221745991534 +14694907354799762023 +21715697223994697 +4079990847661301886 +18059685014573303386 +12322713091527896007 +15882855686643584707 +12176273489789194065 +8615963981148939503 +9078699521928738010 +14932937625413823543 +16471989692638566763 +2849956885635030882 +7883686963307374748 +11076650717431288816 +6170970424002038370 +2529047257851498274 +15292217535154965876 +1873618308474690912 +7311526658628337422 +1873618501935960133 +29330183088310857 +2295646004956239503 +7040689090636690282 +17863879857806254402 +13679477551202848520 +11202772131483702919 +1891731883377437698 +3242943116712479419 +16048397344879480394 +5147383464173328278 +1873618996332096572 +14383077290699590 +4288478328253716713 +7343589259763459143 +11242784033690502082 +15291935488659252912 +27356085465188671 +17837453566692254100 +822839775150354028 +7990307559300470782 +18247967092210294545 +13814567094182628287 +651404368115864505 +8171425314112418236 +6828603270234910026 +434215261112 +1873618446048239349 +20587549927424177 +13768831554152898027 +5528767283749152518 +5652457670769774728 +6755995712349152122 +3205834693335465267 +2973047420892220660 +8547566275188109457 +17685914652015137869 +9870724726615961 +5603319953619881547 +16727456288832110441 +4449074094458955349 +9870725309296745 +1976971540241658947 +7360210704287283802 +11194736795028762648 +63832509 +9870724574375431 +3295137431799204142 +7534809518349573181 +10427987387505837891 +17252293252061875831 +15290807388654476927 +13819031588128947 +8093487961642641816 +6906911136156953272 +5245848973037092000 +17125079446753727598 +16663012318422251770 +5778348175861377759 +8031770806726111774 +15131405685764795063 +14101047990510471 +15291371468751063484 +1873618489038145001 +9038922353422523853 +10655733264458395599 +7241043887750911626 +16478367629248705980 +8139593855082182771 +12533842212589684140 +8899289012997608602 +12643185677710418318 +77937734344731834 +12237654319976351671 +15289397371127949556 +15291935475761424304 +2931000267850397824 +14264783237298017011 +6205069665626709333 +14380274162401763784 +1572232376298784933 +5743312126097045123 +31304310803542055 +17027728427103373552 +14322803714593483316 +374025640159 +1873618385858616081 +4645667113710455153 +31586301411548500 +8005028990823186937 +9870726296137989 +15882855708139793865 +17089062591891710567 +11860381556887007986 +16743946889314852083 +6364097383229560002 +16395686813512980003 +5782296457087423000 +5880738612678821404 +8211561456004126858 +15291089439450870277 +4448228101138306633 +8005428069413250125 +6476972182067942713 +17877417840690097352 +9116642200131153696 +339348442309991935 +2540913946309052840 +8697392509581213967 +3812895115357670835 +11453734735851960095 +163512984 +6155045882728942511 +29330157292694533 +9870724566418979 +2625039585893751557 +2755882956846859930 +2625321576501743254 +28202160467500446 +13247733904366117311 +9941335021241978699 +9537824296688361805 +11864904847046749006 +12912206456127515602 +3636557620747328345 +8057363313678167128 +11272401 +15093984373935446392 +3599049370403681635 +5515988940933448342 +10389574223842918651 +30740290895356764 +15210098783999121759 +1410790462007568105 +6218953989384048277 +17427490199415904777 +18427036611965426331 +2052891733976959029 +214958343888 +1042835199137303872 +7077760700895220439 +15984970341926835302 +2786543391849066380 +989867348566365049 +5899384709619796118 +15290243403140309667 +1575334522336666996 +6726715318634633943 +6810851410579102365 +2567466199987929854 +569959805541968465 +17791475224505306993 +9870724584772075 +8718576711155651798 +15661490539250864167 +3984582318705164308 +15290525419542682586 +15289397302342413653 +6535372549218441803 +8376968584539298611 +1521238554565438938 +1732546113203806069 +1873618497644486153 +15287141188316891641 +9558026018081288706 +5946113571877492215 +8967118772139865681 +15624340655093854616 +8510100318466351237 +13577364532720842251 +2359415870258500970 +8683329641419386183 +9325704466455472388 +12406108725640500820 +1988990609406172687 +305240100557 +1873618317073073052 +2529329257057899733 +2624757556593585098 +15292217543753359445 +1392560304711995765 +10054619214843877837 +5075084213408060368 +15234082652818074781 +6388664954993575829 +10585955829797098119 +14607325535293228015 +2625039572995941759 +16213106141209504334 +13868249558111507002 +296644187332 +6380846095994143891 +18322828492489301318 +17352247138841026302 +17938413954001819739 +6770786097090925353 +15578923778216898029 +5812897583379457288 +16814175749157904187 +2249023417927100570 +11972361444213865982 +4536663217425569868 +19177450717517074 +330734230968558361 +4449356149553050627 +18005251247539029895 +18276979644936029994 +549245944729641274 +2907036184457468578 +4291298457887978356 +5891800283033246419 +14737352740221028816 +4343368849768079192 +9870724666126138 +6206321759556426656 +17942850211037335194 +17818101528872619799 +13310078522289493234 +15948927642637257517 +13248148442001005294 +28202091681942395 +11613165301442872555 +10995101899318516432 +2416262088310677687 +3342460 +4278977611 +4131548706499605818 +6311975534577669444 +1337484202857799839 +15257764832492062794 +16631171720946998483 +5046395256634742320 +2717190683218023727 +7389908165117873984 +17290059944552648268 +8981039678082656937 +18613499598604650 +6144105184579818574 +5312941452083424286 +9000175594581527004 +1200046923276113660 +17292034690817527486 +17644982711755750464 +5751162350517311778 +10972603363562373182 +17062305393199239770 +15970948408630318133 +9304847443081238316 +11270550134515124065 +18895516000985468 +8264883714807844756 +15370149844931529113 +14095582753139471318 +7033448275620070919 +9097528007512647000 +9612968043659278971 +15879250924574363213 +16990371943381619874 +14101056588892511 +1873618497636547848 +8508994922237989074 +2810216882045937940 +24817757276617802 +7470715638705843571 +7089264523636128505 +846986181114282339 +1197790753362896220 +13878300547530637789 +21692726 +496763604 +16306876268462092689 +14181167144088003051 +1798235099988241664 +14383072991265839 +3812049156431047359 +3602002429360168833 +13326822308414431790 +477207683415 +15998836229706038942 +17931569688178343303 +15292217474967809270 +4535288244514931208 +5516046769694006551 +6056466444888990877 +1837917901914789578 +1873618441748819158 +11149482358630586464 +10279024731356799362 +7752852981823716806 +8270229298440049949 +989585306368371232 +2352415791 +17619792807121065300 +14512708438227029368 +9461095570455467928 +14885934237970554568 +7103619292045071033 +1092418986148125229 +9073007892707825543 +8285553882831926449 +4770547780841136587 +7570985824906512457 +18445690135630403194 +3133140144690570675 +8819992730249138925 +15290243377344683871 +5674203447686604030 +15582126587291199104 +4440413848773681829 +40042856 +2024153456133428053 +7978466852158785739 +846140170598090257 +11823452124000179679 +5382561551670903978 +14692072255160853529 +9870727141159218 +2949237918148731379 +31586254122202116 +13819027288703640 +326736294027 +13681696359427555894 +5420640272110398289 +5681866801781811916 +901973780138900522 +279444474391 +16852270840353735839 +9254124587655906088 +17919894351466864305 +318140391357 +13088295555764995974 +589295532646346294 +5111714982582175161 +2010281671118118679 +6022582740354284656 +12477385120395893076 +7151957518376504179 +9870724568935923 +4674314144236910841 +223556734807 +13273748593945895647 +12353164505103212805 +2433291595626401515 +1059645154897902504 +14311172801615955497 +8153674566643692194 +1873618381559185474 +9870724631916249 +1400104083384969125 +7742041531066835020 +13223925594885347623 +904009217991514404 +2119841800478333817 +6652728939885521985 +15289397310940784787 +12228171983476828110 +16337104745239483075 +811664269 +13921708807377078200 +7158411072313175535 +10226754407489223528 +1732546121802209252 +15290807418749076147 +7894729896261607337 +14045391212846463198 +16964987754367105373 +15288269314115581752 +2543452128325209336 +9724067420099596642 +16164030372141554204 +361675971418285609 +5251489301091150502 +1455946291701162500 +9870724587286110 +5436818039612726051 +7947871776025496454 +10391602282580750016 +2624757565191968872 +4133240804914653949 +11619890057073093898 +5645056620059298667 +13693457887708652217 +11859817489689490433 +313838480119 +14814059355306855043 +1144540787510696632 +15287705203925666855 +1873618519132737394 +6205475624366966000 +9164999891234410446 +808802771997647407 +15885957841278600403 +129912931555173358 +2625039581594327009 +9550611856885432859 +23689855033805297 +810278393373484876 +17634556600372579651 +12613788015534172126 +10178602496552158550 +2625321572202320837 +11821179236913729822 +13325587421145670121 +850679332208468980 +1731418094883652959 +4393850056777548200 +28766090095170882 +16176786980589878565 +2501592878965545223 +3552180820766638795 +5789644173607636932 +1783548230307677653 +9870724605636227 +210658919829 +1873618480455176718 +1825919316035193165 +14512892195233091994 +17944727575215482310 +13867498540261130416 +952799931069516541 +11704293171416553159 +8824679608280027118 +10411321231592669004 +10647665750038637261 +8309452141569987122 +16887636570577386351 +1581886662519384750 +13524642504209080385 +4276377712004851752 +4449074111655718840 +16226199636787600784 +8881019260503721949 +3494523678189961971 +6364097413324153395 +7742639082883987074 +1883865396301225991 +4501477972411825740 +10187268591481793835 +15288269301217764150 +8587285861105362320 +16743861907557783481 +11346717579767847433 +3103727501183118342 +9200500708936142916 +145850382332548656 +2158018381227440656 +3491703501266376705 +5832866 +10377426660277834593 +3666742335828729726 +2372569397844255863 +18154203277000779195 +16213249231578623027 +15290243342953162028 +3358948051098359747 +1873618312773659847 +17475453133986270825 +9870724623986345 +14598969592560568799 +3167709047998127086 +5566476498435442740 +8900822151475637786 +20305658202031811 +12443651161110821726 +9927197578428169640 +1734238258909429165 +339636600523 +2148672314331056674 +68813257 +170281083223547373 +7834125150625343488 +1467988653199343084 +9870724579340643 +9142532373385269758 +2504863350589637007 +1416430790061603843 +8858552368779105092 +6829167337431978471 +1094393045077805660 +13508534253930421562 +24183115 +1873618450347202479 +10459558075326547757 +11663374006463446768 +3572810933135304050 +10604883968934364759 +9870725377257619 +6098975847429179176 +5780604324279184033 +13894389110390411552 +3426195335842376218 +5277294692147023759 +17865975268837441973 +8197562920226992407 +9620311463453285219 +13936167227557436820 +2794943081434539155 +11246300118757350377 +15287141218411484483 +4373125150335441724 +5246976948366878364 +18266680753265534959 +15292781516370958392 +878291211892712812 +9870725072777182 +6176104209096456591 +335334695155 +13819035887089711 +3919677033371869835 +14934069931663233330 +5357989103822846524 +23125822227820201 +3229097897723824621 +3879742053071789830 +11515585087059010704 +10184384893691038634 +13542724581241873535 +11235855143633245343 +14101052289463872 +9870724660686624 +5995296157133256499 +5247146762582432535 +4151360929364450602 +816494382388947713 +670128646398686881 +1224407839832874105 +972444831067161530 +2293601922064928217 +5372831073987542671 +33278412725627497 +105513554 +10583075433321882031 +8985097601317028142 +15288833286734428544 +4129856539297327693 +830399540495404563 +8097172674103110864 +11148081311892136886 +13532309586281914392 +8505577045503394846 +10771188028052609133 +11705112931823721906 +17094850760611614144 +3590924555701081476 +15287423252009392750 +1839046040610036907 +12121331477108569669 +1873618390157575884 +17095559919486186902 +1891167910758145520 +8572897639257887905 +8754016916637706295 +7201922442027885587 +7705538687087487350 +8642974666848427089 +10603473839632369446 +3246774908542348438 +3189738274038106448 +1785258072604567579 +12919095062694399753 +9428437424384327988 +15289397319539174602 +17373053078950977560 +3935460153923686104 +7512385234831032959 +9951266269842203878 +18250203736178516934 +7884436482636522573 +491324104 +16253198 +495996004671374486 +970700105235760464 +9364322075060869825 +4526720883860202922 +2844446641206860356 +15287423196121678231 +18412263922377556010 +18060636885296632983 +9870724634406644 +9870725109477427 +16385520563032974694 +2861086850442987769 +5726226297114419664 +16908326308189526024 +1224129140193975060 +15287705212524045746 +2727527756201599369 +20023616004044340 +16324571729200962591 +243555661719220942 +5675796551176948530 +16470217957596878694 +6285543329431960700 +3529735398834325979 +12385429635386004513 +2625039590192715857 +10781142559576834283 +2625321580800708565 +8791804437829275563 +17895122959532632241 +1252168767631076616 +9870726122598643 +14143644136688062863 +4386154205047647158 +13838434914856544964 +15734173706829054028 +11063795148119805449 +20587623014406172 +32432320527338097 +30176206501850470 +2729283571242054975 +1789180271589605423 +4723008322416429619 +460010423829 +15291935467162585627 +9870725970358490 +3119042838539409487 +1734238224517917469 +219257310372 +2850570111682618264 +2787671392973232150 +2576363834334857968 +5406613406419587930 +16204201012116260706 +6231189996575467577 +3319340521220551796 +15229100704228128 +31586340104504804 +3597075277079530975 +1005889952081057559 +97583640 +15511117106602842 +4662355875393265869 +15292781537867157534 +4908932749447469265 +7160656041636874525 +16476905347347189383 +11498649127908754853 +14835085562484362568 +17248840901358540133 +15288269309816152639 +10462408405216470818 +3595101179456412998 +15287423183223876221 +6360390301012677830 +619982431487935653 +13783813075272425632 +5462796855430091847 +1839045971824499927 +8041180604971684947 +1873618321372037404 +13944426554416912252 +8926782179644696558 +2624757560892547605 +8886499618133001385 +15288833316826525557 +3942370170370664241 +1360642680883731773 +1873618514833314254 +15008431550346894786 +5248951110476109673 +13743154110054098930 +5833854255738587405 +5403784029299755370 +9870724626476744 +16389555928278781031 +9870725101547538 +3057445061938001262 +1873618312776140731 +17094376562205141044 +5569509413080689923 +23971673675483629 +17904069509371023487 +18252045332643866663 +15291935501556590947 +806224763 +7985649352220430303 +14428481252717692252 +7452710325133122641 +13696473583276420438 +13461987956028742161 +8276788249793082976 +2340207219455511728 +15292217492164594728 +1873618458945591500 +546374457 +16276789408439022406 +447112610911 +15288833260938810211 +71303659 +4044043635501572787 +3824500276657211482 +13727196604031525222 +8110757355753266188 +11889784335340611868 +17117138716447432097 +10280015058003955529 +2792885536610787594 +4504298192327821257 +1985606472761087440 +15289115277341173094 +16797867192214646220 +12448397914595076056 +7872291594684150117 +9870725379748001 +5366885369225688882 +10799758872163985177 +9400814418615289310 +1414738717439250268 +11398792770463145137 +2621625390044294099 +21715697223545866 +17513221492263041542 +18111648107145548214 +9940375072120521250 +2150364417046743283 +31586271318977381 +13819044485484847 +14030141267845857548 +11870961795733216352 +1392321661352886534 +9868080300888121045 +343933070701 +6634414343742511975 +3755979052345743137 +16873513682111571403 +648227029980765725 +1873618501935507224 +16632567774389937756 +7285785859232107205 +5896564468209635013 +4287350258344799383 +1482883811290919311 +5885976160280708469 +3807130416385774181 +13237708565679243273 +520094464 +1872174764761632484 +4393850086872136527 +1804985823072178582 +1244961421058392379 +667486419041270739 +106292485926954350 +287347883431913172 +17621268802185464283 +18331556279495205 +4451048192081618339 +7451676656435674688 +23407718254664068 +3344902947084987356 +31586314308901351 +4078298710552364831 +38835486526089808 +1873618398755964515 +14448826276681509703 +1609417210465502928 +16890185702926861787 +830963556104164562 +2918992974646547617 +16904182278412250319 +17311379787857219384 +5521344724254671710 +17618315173833497598 +10750398672578676906 +12094294369128485213 +15293909629271812786 +17204989276291535035 +12666755182509971353 +538444562 +63373752 +16222802744731642110 +9870724573916673 +18106259576292904584 +2245985413502415764 +15002578166377440815 +7510134793301600524 +16304469904892773383 +32432385013458616 +13819031587655798 +8507562192336206689 +9034197821468842827 +3701601055274307496 +15291089452348235264 +4504298123542277167 +17385354375790337635 +1873618536329528865 +5832726134240118664 +1073131086680899878 +6204347644738560033 +8537256878047897286 +6154763905018303251 +1254142826560761476 +4660099726976229815 +9870725111967805 +1840738117531360664 +816645035 +17467452354184422458 +2625321589399096275 +1785514032559827384 +9880584878943375071 +17588650097304288508 +4687752167817170938 +15291935475760965524 +17004781525157881141 +12270203145506274665 +18331349920388230 +227855700539 +12929432397969449199 +5682914168999271826 +10686712480767831331 +15257170146262786797 +13524078467103673372 +27920126869115139 +1289657623515380876 +7758478083289188556 +4287350189559278119 +28202117477106938 +10946559189980502953 +15325436600494473726 +6829197924229397621 +15018372275201458165 +14265248981575687549 +9870725972848861 +15950390346513459787 +15637335605355352259 +5458807700921847773 +4008957537367106028 +4662355883991631380 +15292781546465542856 +9870724655247123 +17941907415488676179 +5572365145471912335 +4131548685002947930 +6364097430520949097 +11272055241432908726 +14372290637101153399 +4713631674839281711 +18411981901675757599 +6995894784060048611 +1193298139301687395 +8147865954415433315 +109394730842460097 +13702090870859260438 +575144796 +12869109390749677710 +2156139911701670931 +13749155634583590008 +18181080380580392355 +13669583310056991229 +8509254204771426302 +12612095895622468801 +17826105971090660995 +9870724718227318 +2624757569490928360 +7862092574476292498 +1873618329970422944 +4289606320780300792 +15722382516523328440 +2481036784364901833 +3129344044965513958 +1847659202474479300 +9088103565209907350 +7509921783759585289 +3812895115357217317 +1569830315893923812 +163054228 +638124907 +2625039585893292940 +12386194603874476389 +9870724565986794 +2705315718468230885 +6148990677153952016 +10022019243587669449 +9141021669575123336 +309541536868 +6066195838605398687 +2625321576501284946 +9816939506534411041 +14428481261316086712 +13307798931131677262 +9744509175952985403 +10980772142229968478 +4776430534263532702 +10636325330389773631 +15288551278929199318 +5245848904251097780 +10813643 +1873618467543978761 +4444642754702554960 +17097227825074222687 +14652089689918230307 +3233267632673811152 +6205227167091475253 +15229096404800599 +3573803894998305775 +9882920632422962620 +5728764487730213670 +21715714417844755 +1235323449059061170 +4067675983485955177 +160954422715378870 +1517290316328812284 +16875205771930721390 +9195973940073931659 +17791918762976347730 +9288615646627129027 +5925992266307220388 +17802213821557719870 +9516197570156185702 +15287141235608259625 +10593863342582548784 +9870724584336970 +16854238106389715121 +1606616067 +5916966230673544573 +7401639761432944318 +9900655957280046869 +21997696429941043 +9232711897928240646 +2624475540190750276 +1546476616450655059 +8677060819645321149 +10256871348501038279 +15290807410150216797 +3325597568122034600 +5746696288536844539 +9870725382238389 +7880043043777809442 +1411918549114038401 +15293345540578094363 +3296928269378724829 +4158409266264553474 +13611544013539121738 +129554786413929882 +2548821390308960128 +16381138877784987057 +17085208562020462431 +2889033352725027251 +18332566496608475292 +1873618510533903228 +10873966970211808679 +5095261602623132146 +15290525363654505845 +304119505144069859 +1873618269780792316 +8508126220842775604 +1416293088687842263 +1231566539725166681 +9796067026192895123 +9870725077757926 +828707506564774178 +9498437315582768723 +15688521365104712444 +15291935497257168399 +15624820033849216227 +14837489368893242444 +16629894574078694997 +1413046563134781534 +4075478598114877641 +17055586805786300258 +5263045704806567610 +16688455482474720208 +1251886678143753022 +13195024895973724897 +15954584610971065497 +7398819554416005559 +3191712388858005264 +155124341 +7403331855550265582 +14121965427528644016 +2199921451254365745 +3754850960939356774 +11157193194708540541 +10195897022513893914 +1308238858818110391 +6174018547463361832 +1712415756995226825 +14036340911857210104 +1998795753307454769 +10906583509962068018 +15291935441369460179 +2883701 +1535706104 +3595101209550996480 +1414174624447355722 +16005333608888819557 +4676558653293215442 +3655119491684068759 +15287423213318464871 +18613499598150011 +4001183637361745490 +15958527223745617570 +5993604037221558226 +4208656533364875203 +13283720445667467964 +13819040186061441 +1696751937232771418 +5991347923196069767 +15289961343746316522 +5337229686545450161 +8371959251560452452 +15317767946604923472 +18895516000532949 +17947525619709333862 +1873618304174792613 +9870724576407068 +13762870397868069320 +7463649505804565308 +14217098370181981927 +13515324995391146819 +15287141166822738615 +1873618497636075077 +9467310877348144964 +1788898272384018453 +243555631624182288 +4401881119550690597 +20305649603205623 +3071157056603565571 +5303047086844481788 +15287987246123196006 +879419277504224576 +4248329386613943554 +12874248428374147858 +6985684972259121648 +21233971 +3653991438971124076 +1095239137276878535 +15593960942208500714 +13145510950436555043 +4722713861302992016 +9870725956989142 +1573642419621745543 +15407565573754394311 +15739206202722094240 +3576162373417262742 +5540680986800164323 +16913966567458026875 +5197393255935528060 +9190761456272085372 +15287141265700368153 +4394978156789773368 +9204802053286541465 +15292217474967357636 +13705127126074009745 +1837917901914336168 +1873618441748352742 +5352348780069017535 +11498071362476911476 +15251812739584440832 +11548429681892932120 +4070254453074501942 +5780604315680310424 +8785266901479001818 +15858614579628625150 +1873618394456540950 +3880024017885400135 +17817804522273659096 +13109663360787162892 +4479439747493677829 +6118284529645873741 +3169119117114236120 +965684883864896293 +12664851523972846490 +8995191259855153231 +2573543627316201844 +514654951 +15287141209812642136 +5152482613269518132 +2185307547272220412 +13382562873017385191 +8097653480026868144 +4303501210590257242 +6424592115552563530 +8563886248125028038 +10909696653621338658 +6536766704526307942 +7571000104451847676 +6206603754464618794 +6584171493541154735 +12258258950024085548 +12712642341532680163 +5943738332688506350 +17497721081992992620 +2625039594491680263 +2364352882452615983 +4545703241411401652 +17920038788932264291 +3743762997122322463 +5048306549262210511 +5303047073946667464 +4581227616091068905 +2625321585099673202 +8660242922972585160 +2923958282541810370 +1379320450696170447 +2371300106274037904 +11123291787522228385 +20869691007576592 +3784374912697834903 +9870724568450966 +6064503787480496907 +5286199749803192812 +5568018385111685000 +5779476232874035736 +8684618275964397490 +5304739198157340074 +830399531896562183 +223556275693 +15291371408563447792 +339912449322400481 +8040898364879097859 +17989348947424196699 +2488365593734241587 +6282363583087519637 +1786360098964986262 +8852291706359849876 +1005889956380019628 +2801821130539295080 +1873618381558729533 +17478309774690965639 +18056068209522400440 +10934615007495789698 +1735930353027541689 +8614976985008388497 +9870724631457491 +28484129580057898 +22843831620625785 +1413892608043724084 +6527070950924361061 +3252495661062499444 +1075529836362151186 +564516732980048315 +5155859771100236117 +1517854331937576745 +15287141196914840063 +4387081504043786933 +18006665715390091937 +8503320866991327669 +2242842311689461650 +18168161940875843036 +361129858058 +4202723174088600137 +16553459513265824334 +5735908250287610658 +621508790887723089 +1318045064297522551 +8818864591554684802 +5357989129618022318 +10394608330195624746 +2624757565191510328 +3599049421991536689 +4214658472504943102 +18336495713222610935 +17465760333151611456 +13759084790651886795 +10588211952420531734 +14941571200560993656 +1788616230186009061 +17958850459381418688 +17187226256175291407 +9870725384728771 +649254754942739445 +16798735162291988679 +11623137481187482972 +1197790774858628970 +985637089627943626 +4184798612164189346 +32150321320506635 +6060555536346528648 +5010312442784267897 +9870725232488551 +2495845169474000984 +5572809636517250553 +1873618463244555108 +9870725080248304 +5280077592109786258 +17956211270007864138 +6779138548876448120 +12622921449567619867 +11623400942792738969 +3973490997638088726 +7053656753322869335 +9870724820398001 +1249061871705597370 +17364509302366083700 +13624345288697658311 +11069514606243549584 +16860434628193374058 +13542136790708736584 +4532853236636197848 +4449356102263269808 +2131214311901513090 +2324121364801391676 +157614716 +17423767204507315517 +1571104233304909308 +9870724668155539 +4749682977522336102 +1256116941380662693 +1580350686246409915 +9257080277489175688 +2714341079893873169 +2000487886116512548 +13819048784450902 +5374107 +13346139703866762809 +5022064850016945249 +11180753484910453304 +5832726151436896491 +15108492788614827244 +9870724623527589 +1873618312773201031 +9832244378777444788 +1733674170216506403 +20305658201584293 +4453192986238738296 +7949964983154708465 +68354499 +1390094258664641223 +2308422057123075633 +5136942702668879823 +9256727317040075212 +5888796259821184166 +9870724578877022 +15294191606983247257 +6888657822347371458 +2156289433662739102 +2368903240497371417 +5357989060832474320 +16153465402256016721 +18328169852550261458 +828143439367262525 +3116933751362769706 +11479305196399968898 +9870725376798863 +3580795934066830362 +2785415304742908798 +1069301756133924903 +3597075302874701597 +4960208600480556226 +3810357058013830169 +21151681614325367 +15292781563662314598 +8704274751914773568 +10481987692921181200 +16739161091967945306 +7562235613620487485 +6282182678228521677 +6293435923465316228 +12605034436343903681 +766564860927634619 +194314911 +3026644748647350845 +17639632887023028468 +13967031925908382645 +5462796881225259367 +4396106248186518763 +177074633169447495 +31304272112126853 +335334232160 +11503675127950628683 +12392426871415443819 +42074479 +15287705225421394210 +1491033538627705529 +15309031742303591735 +517145329 +17465852006774542365 +14002969975243035961 +257295025 +15328597625308731923 +6830295368650739502 +5458848660184636260 +1815323817568987617 +2625321593698061230 +13859985150566876404 +18093990201642346614 +32432333424701228 +16474939080039805825 +14123679526960714188 +105054795 +1411918476029088913 +5249623302499552325 +2167817878014482104 +14816284914588142278 +19741582405682519 +279446498037 +15740334315622960494 +3602387540931928445 +13294615563597993285 +17868909830197946060 +5461950844914720448 +232154663489 +4500349932594992063 +11107018595182600960 +13492334015270640759 +1573924405930319102 +5304739206755723533 +9181555677596944971 +1806610914977985382 +14820511377841526797 +15292499534362142014 +5249797159684024989 +3766287938926110774 +5352348775769575805 +789016336715365665 +10367597559703296171 +60424594 +5577214489430608395 +16881139122608152000 +11599686562536949325 +1873618390157121062 +9870724570940976 +6934128324390830672 +3402381418741189609 +18411699915366727708 +7669231232416362287 +3541851205005364978 +15289397319538725907 +3265161841116801701 +8472111698419078210 +11615938700888529321 +15293063541372503049 +10162787574158199843 +2519729693145383129 +15794439 +14861581765101309697 +9776113053988971439 +12626916662629439596 +14895493079970167983 +1028495254787005332 +2057911839619745748 +5462796868327449290 +2150364442841920141 +9580083521411757838 +9870724633947888 +3813741220454096777 +7410122287451493009 +19741431934295971 +7563483959422762390 +813695896 +6542873830528071605 +2624757573789894649 +4902017359603973303 +13031177649551654922 +1873618527730675272 +3542979266317918089 +16706843991765104746 +1416148795154977289 +1734238280405165967 +17799626776595219653 +9870724589317735 +4450061392452589868 +11532485104076732220 +4097002672420508502 +2625039590192257028 +11360500058968497813 +354425597890472601 +3649479120639627453 +4396106179400971595 +763245092587843876 +13491868288391600166 +6087616309246444674 +11587671796682480063 +10754469081008513874 +245315846349725207 +11224688244129942149 +15920335005095365860 +1410790466306067514 +1562127305949064744 +14947110095775636 +5493553925598960748 +3698377064121454763 +3256722653717473344 +5947788564576690764 +3915446800229088528 +935489368691254531 +13708385629546963839 +15308825434243153487 +16267581173591577086 +11440327773653177167 +6205475723246636047 +4361381790955689709 +5458848591399108078 +7565709824152710698 +14946201981959088188 +5350506414024512706 +7513578521803359945 +1873618377259296192 +2895483092370526472 +15292781537866694090 +553976982239328219 +4411511503354148908 +10585794204026549942 +15288269309815697525 +11065179658016983681 +17863674033092632303 +4802996927930052223 +5462796855429639107 +356830419463 +2790611964829328152 +7119059345498925668 +10553879380855905185 +6742003279422240574 +4180850416920431050 +6796532143492245066 +2283061350295619820 +439094096018935470 +10697549361579046703 +3971798925015719182 +1873618321371589498 +13517299088713586643 +8040837036602244929 +15291371494545768220 +3130397894753015552 +14539682590822639403 +1873618514832861749 +7864513 +2106834385579423442 +17636993876761458366 +14125935662482408781 +14576212124415364447 +13728164708409754023 +3493395634074945822 +29612186593203258 +19177549599685032 +1899850279307386175 +8599479344718234570 +1406352144175931023 +17686830652820834587 +12482179369149030144 +435824003277933074 +3541851282389281095 +9870724626007775 +18413109980183855178 +9870725101088780 +1947237997648228008 +422639770331474041 +11579641141775458321 +6360842033992519324 +16857332486455696347 +10488220504998020326 +4021100618240235104 +15291935501556137671 +18331375715571214 +15274450506083753237 +9388513449773437474 +8531195815641551270 +23407778443822783 +8390705255773638981 +6440281088642268393 +16224960573811657069 +15292217492164141057 +5665932420161031539 +2790209532000291371 +545915701 +1873618458945134609 +70844900 +3598203308298280360 +2446197814 +9266962182080653822 +9870724581387837 +1993727787820995690 +6229497708349517226 +2588868491370642209 +18895382725935499 +10197025144013147264 +31586327206235137 +23689794846211903 +1221335371036830085 +5194855086816713254 +21433680820701635 +8717448632647894443 +1066855864365044647 +16875205763331852041 +8723249268863881557 +16580568122706236593 +27356042474363193 +9870725379289244 +7475600315276537104 +5565348480114828772 +15289397341034914425 +11225812687234948525 +5681860762241801649 +997791721573343843 +2034107431 +527486648242029189 +1873619099510724601 +10652362076083997772 +878291220490630691 +9853532073397197311 +1357540556341595911 +13819044485025395 +5346092373606671715 +18167337879786699055 +1873618549226881411 +9501162962247560948 +1464040410663315629 +7088136458026183656 +5193163005595955865 +32714414313178248 +3840527730818178750 +1873618308473757719 +5578757081043459657 +16632567774389487138 +14636944485776186139 +1795414983250876469 +11324997467887515387 +1730289981983120389 +3919394969679695174 +6593959610733503469 +2625321602296449309 +14289589277711884607 +13641115688290815466 +10570978866032618937 +519635711 +15288269241030162700 +17307564748496711201 +11764207343491953910 +288044900597 +15294191602683828935 +6275161907604052530 +3617232734033428726 +259785401 +15291935488658324696 +554322192689157930 +1732546194886247405 +16895261993875497310 +8483415125258482758 +5357143003026951378 +240753054985 +15291371425760227964 +16634367300845572247 +14539682522037108625 +1043117215540013808 +2785415300443499310 +1306063513052074886 +1812237461810129627 +9149649826071524954 +15289115311734721621 +6924604781897604085 +20305598014433776 +15504660649007058533 +13791878529917142268 +6633107701255639207 +17621561863500597513 +14092212388786683232 +8170556901596286129 +9023438201426754949 +13000153596431314837 +11463098204983934675 +14644601523182252791 +11949535933962132922 +22561617456282007 +1838763976917868333 +5565348467217033535 +3591923990017086628 +3991372650906588310 +537985804 +62914993 +15290807435945386950 +12884708026702235763 +11921229953031937471 +11712144679816674774 +1703347206 +16562086563947947012 +23971751058934778 +2813597739900560842 +3387142580035084345 +763921374562564394 +966310885326396530 +331034799869 +9548014972137053338 +7456714667022558623 +18284834 +1145668921907304705 +419518066532248435 +9568723490388248888 +17953567922355439196 +5778348175860436286 +7857726158080597900 +32996392023385219 +16146849156833550135 +17858565972139522613 +2945165086225874967 +5303047078245657433 +18271169730887034540 +816186278 +2677161709691876762 +2625321589398637514 +9948326991805175762 +4182135255879803084 +2675743571107260861 +17803341887167996488 +2161929761716789521 +10284785883988047308 +10913080833258376134 +2432358684579796105 +10511478011790434597 +3703594116410645583 +6457156131795526936 +468608354196 +3612166336400462352 +9675056238046941129 +8439263316645800312 +14260179052966649489 +227855238971 +11580266918148257149 +342450558254864069 +8197562950321117892 +18411417894664929297 +5812638409292143009 +10884107806137858508 +28202117476650588 +16272535536866042882 +9277442661839890054 +8756617791282551197 +13191539411651483086 +5005027832829000316 +15287423239113613877 +5247130795565859493 +365428827867 +2879479979997991211 +10474207048235295127 +15287705255515993314 +103179325071237340 +6015017985077953364 +9870724610158226 +1728215178027937571 +22279725729666705 +2624757569490471460 +12817829069477388566 +15291089439449945294 +6736977397374672943 +10681513837308884937 +15287987271918358274 +4660099714077963014 +16948804973753935811 +2231273845409334719 +15288269262526362905 +9870724565528035 +6313103600187497150 +1785796057561386166 +2749504859761682530 +14665089393973866 +18388527066533476744 +14428481261315634682 +12887467213767269700 +4580983970120688498 +2026224181956850326 +3782349952020012652 +15520597512816297356 +4451048213577354323 +5741056046464658524 +1625764268273194470 +14982980764324274362 +16434950874865749756 +5334154767022318312 +7671368224220996054 +5831598094423321547 +4733572671923243858 +7460569593843485201 +2149273943170769265 +29894155706256537 +7308167250444838287 +10574355727626678528 +9613290697240352734 +1893141982587666173 +27638041680766533 +5516892818901443234 +16699033851728452526 +15899679838169027403 +12292529144048867935 +15743959819383754074 +12473470278956370598 +16529454105888175501 +15291089473843969383 +17680425426275873905 +12068249601228026660 +9970126524816509837 +14978937671852574781 +933797824859024661 +18412827959482056767 +5517738889606008568 +12797258612730436683 +10370417960631559104 +7042731061686195082 +12064293017781873451 +6000378713100921549 +2368761954349498384 +5448958679877831920 +620798968570321600 +6795216411028443941 +1254706855066881912 +684134283687105301 +32432303329647230 +3893100303535855812 +1416430794360119076 +14978526113072169305 +14660809260849710917 +1201739004495937578 +14094186447716375776 +1251886678143284205 +288047393832 +979478429766537435 +154665586 +12350988444867431112 +15292499504267075094 +2233707304946200009 +7404223642329751364 +3399294746461939025 +4908932779541599697 +17801085738750988179 +4997605251384560927 +1715720635916314354 +14835653469557497627 +2424942 +15291935441368987855 +14481420524361232594 +14363918958383426264 +16631171720946074963 +4599461227359912527 +8781766572451455798 +17501986292153130603 +16960007587568567450 +15917416551048098960 +8718869806864345428 +15858116883009440274 +9755570856023561860 +24535861251357120 +339633187921 +17954056120348137720 +14582613446984295407 +8035430061115071186 +1788616255981164998 +7329667560521271617 +1873618544927450275 +17264237424365620472 +17017082267938674037 +9870724575948312 +16999208107126972782 +4790338092707433532 +8775572777008779578 +15379828344162238588 +8818689480678384722 +6205434751085581014 +15290807388656064584 +2625321597997025900 +13036754982088887406 +5347922253025853336 +331037290315 +7087611701083902358 +11378236832929377107 +9870725373849724 +3346269252 +10528342604607197118 +20775215 +6368635865817765234 +15482838224616116075 +2304518617096922606 +15691604843033019859 +236453631622 +9204802053286080122 +14659363226899068896 +15295896322673748302 +5810283119755945889 +17785259896117529586 +6976151595822699144 +176450185316341409 +1873618441747896815 +4195011284014798267 +7437088682075967175 +800262260007267656 +7889607765372975017 +9810821515460427595 +882742211615943298 +13226684591937108851 +8816997399457641195 +15325015632819608192 +6829167320236755019 +3920523052487239972 +1198918814674535690 +9325027096347815010 +1144540856295311636 +18060955726130270203 +4615085980062260731 +15685362330064406165 +5149529981778794858 +9284362173790508580 +1391321615130565282 +807114615430275047 +39125348 +3489214337950293981 +11964228788262537512 +15772870259952216454 +1316305709524332588 +4545139234400579849 +7945162863202161592 +2996174740720137363 +14925834994211835640 +1873618338568358824 +15291089448048345542 +2796306122786879679 +2624757578088853752 +5812584653494167613 +13965339857586242674 +14431456801422721140 +936899463602980477 +18059263644909514062 +8040837006507199504 +1468270669602056264 +1125687328531818497 +15311868345861618733 +1873619026425753952 +14491486094186326674 +8841091975921751229 +4445544331933524977 +1646408675199707868 +2089265852158774334 +23407795640608145 +6184760857354135031 +4568920266596170288 +9870724567992379 +13815527001955701146 +17389570317006627451 +1873618476141922881 +17619012718254098754 +6635542460943569108 +15287987224629032241 +5836298825805486568 +12973796087988576003 +12804866717273491655 +653191510643980904 +13964897540691468306 +7146505736374850901 +11563580929413358981 +2237639659872065636 +7156856395195421074 +4643874913829344678 +11956494364063046433 +12845285 +3861350836756825826 +9390205616975267047 +13027033421975742308 +6308157777367344869 +10247364828624589766 +810746758 +5542550368496073125 +2103039515099409562 +2624475548788673386 +5029265608133458067 +15290807418748163862 +8327325764367420682 +2307277804161935758 +9870724586368601 +1024406176226371748 +34124418943183721 +5607346967209851417 +1873618519131818153 +17179861758519957522 +17244622751296785814 +6242575413507994337 +17147561355486042229 +16038494049631274933 +4128778066778594975 +17992659823285702120 +11626061267575709826 +17856119883442051016 +2414448873112825242 +18101359711064499072 +6838194373266580432 +9347818902720819620 +6534429686359852912 +69446730432522447 +2157660070237325113 +12294570438877131977 +15711638311777409720 +2412665810316625225 +830681556898114185 +5995296127040242684 +11869124796951773107 +13518427154325116806 +3577503648416544937 +1624918184673305745 +1200046832995943245 +7526932862385405046 +17684252729367202593 +11639624945065601916 +20305615211204915 +8203186509078083216 +990293692895476099 +9127185536458370261 +5832726207324168574 +4089771542585346905 +3541851230800529694 +9870724819939246 +1551462646837745418 +6979473808788298473 +6936048796846995400 +8444237263823374707 +14386655907411859079 +15290807453142177663 +11040735009915081371 +8840823347568122746 +8495420254989269305 +12001697249412734973 +4697061119311681601 +10992311089537507860 +16006179662396942119 +17626237310165340654 +18412545938780258356 +15291089469544552274 +3574150809175077976 +15274732230144252058 +15669201573813111403 +15058453592556790345 +12904477846150130878 +10377426660276898779 +4915348 +15290243342952245366 +2302546993561954800 +6046302865367253026 +10163351606963755644 +2236213724530672835 +13885685190531763118 +4660099744172546142 +9870724623068831 +9870725098139655 +2108679791565163899 +11058493467485891054 +25099876860128370 +5566476498434524382 +2625321606595414132 +2839229256111315213 +18244208641213803951 +13224543430038593351 +1347988088962510134 +2469864005807852012 +3172286381192799259 +16177137247087759447 +5991347875906260570 +15294191606982795149 +11865320555827850250 +5910395128899059855 +9870724578431905 +18331367116719713 +283116224 +8872404204070253575 +2069534184837354545 +16004300715534666632 +1930668198955452820 +11944851147529654643 +14252852324458051560 +10345314525570740904 +5277927473404143869 +13250103297345347441 +16073122470972832301 +3862478829283857942 +245052019898 +15383290012566427629 +13247866421298289249 +23265605 +8762066054130180384 +8695136369761663690 +1873618450346281005 +14424532949994507846 +160954452809486057 +6033658086902408421 +8710197087773595188 +12137496780435628885 +15958699940383907767 +1559288237147317292 +3968978683605551949 +13614615898053882906 +899112529018292807 +230045246059467048 +13105552693218596458 +13082179844768948262 +1623790200744657118 +4394978178277593123 +15289397332436081896 +4384588605700385648 +15287141218410567890 +17756287572256050747 +1730290029271995969 +10332418983246965754 +4547181581491573641 +5462796881224795644 +16536704857879833391 +2676819007 +15638354319610752508 +16113243614010761407 +4962374828093550934 +2376064107217305791 +16951907158482301495 +12802594135359560938 +832091621715239665 +14942863891313924248 +2103603543605990068 +12051701069017456005 +21715680028329254 +1240063138945767949 +3642776180496624093 +12716253113588995135 +16170715927591340245 +16645761359050464243 +16129924382053259616 +7433986540338299080 +12424417179544784313 +5871436940920768820 +6040677747586262461 +13146357072728951328 +14934762739409427180 +279446047304 +472907338422 +3311536089200936440 +4011069751666431788 +13945283648537564034 +16488096992872110888 +6209987891108781047 +830399540494469985 +9870724722749308 +16268501676703486476 +13681953468944823105 +17953861048226362261 +15622649098362892396 +6322966301832272448 +17637940797205920626 +9940451368882430799 +14782253154402115300 +3523407702141513538 +5249797159683566475 +4397798342303360233 +59965836 +1788898212196404528 +4029511595108673762 +3537491628065248299 +17090754703204881260 +13188329144461371253 +11075097790874329072 +9870724570481756 +7822735708193297952 +27638058877519937 +16563634790306890566 +89657146100418951 +15289397319538259131 +9870725368410219 +6269686111207184078 +15335680 +14642008192357655492 +29048192480191963 +9870726058701030 +9870724633489132 +3866984390250997249 +9870725108559912 +5876226315842625948 +3599049430589458805 +4449074077263286639 +1873618527730228370 +266926994110508340 +2835998111019588856 +8420894968609270085 +14148918247192675042 +846986211207954043 +5149937435243010358 +5484249543051340399 +2238025294768394250 +4749747017966366261 +10257618447977233367 +17270577646685278366 +826733327260331806 +6100103839955298410 +5704579467834502432 +14065568603518821568 +3707523326646559562 +8255493874348203427 +10586519854003330840 +16931611838274890656 +2785415326238639918 +14194830928449713170 +12638603244465632631 +16374270197950590532 +1873618471842496322 +1251886695340066878 +10678711392369073542 +32714336928819001 +8648101753792499749 +13665655858125166420 +5568582435113995179 +18332619636094812942 +6539591629328228964 +12040003533446929142 +15289397353932285751 +6694163360586686350 +8610102810800694296 +16526175391098288468 +13038602074545986815 +1842148186646986625 +13326330175687430676 +527486661139369843 +9678450631152969425 +12636173248644999472 +1641130499770636194 +611625006008590017 +9302231339464417769 +356829981151 +15291089478142924990 +4561962166721337803 +15289961360942647368 +2150364429943641749 +13062651024674664837 +14265336182199488692 +6826664259619394182 +16298859552331344498 +799931625982608320 +4728670048079126017 +2908175286381653920 +4672226656941320852 +1735648302231936067 +10646033996819341371 +2676033351739245930 +1254424842963476637 +5884848030182948735 +7880607055086699117 +1309126485043076621 +1200046884584243156 +7717107749398655731 +16685069423980191632 +14237381820030132776 +4254959725487523541 +7405754 +5312856438487793352 +5302200977448515687 +15674363516781486307 +4744952786409559575 +29048123694646491 +9870724625559228 +1647838213 +18390671708185047070 +4148540773936140449 +10583135657171574107 +6999798970927301433 +15748598726515508074 +18613366323088485 +9180403051628991391 +1854737581649053253 +9655550476515745702 +70386141 +545456942 +15579746089396998562 +6097847738826367602 +6261827792145090364 +1873618458944678134 +4127600472561498749 +13525196865560913719 +9870725055999951 +10397817619567550809 +11615740648557515353 +17811132529008908888 +7551774206130147500 +14428784522053688109 +17441930117550656432 +13561711261508393143 +1204131931775316490 +15293063541382457329 +15289397341034454804 +14259131864331856619 +15287141227008976162 +17465165077596029649 +35191393466934857 +17634637760346539626 +5734260728554980678 +1873619099510270322 +606084411966645192 +7410122308947237961 +973098480394187248 +6079522037486276129 +11565720537308814103 +10158546386383953688 +8934990691841945137 +343932169370 +29048166684562852 +13669865326459702104 +2328755418060627154 +16134570858380536366 +1873618355765138147 +13415093810953921154 +6169020295152281166 +7699639293511156191 +2363364147186718415 +949116508245472343 +796257100978600205 +15292138696292918723 +15377963507662676841 +6155045908523191668 +1873622147625346800 +14612094343334730975 +6055728267459901306 +18275311432733054860 +5461104782808057591 +14847634415788362123 +2625321602295990612 +335336269257 +5782296426993943791 +13824860123673684416 +9870725872251079 +17587804030900718641 +14251614113454516363 +2234375982848367289 +15288833295331895589 +11076096039578839640 +11705421198335413148 +8855582523041258632 +240752596463 +14815093945352265279 +13389377355504702089 +5367449466516871455 +13944415416121166662 +17250601175141650206 +20305598013976481 +10169174093015509128 +5303047035255270148 +3057004356455054852 +1737058367049065513 +13887711574942768958 +13941243479815898567 +986178216889768977 +4509708205616487359 +4441552753714226352 +9870724725239693 +9029301367107052153 +6364097443417820330 +8958039704682958383 +15288269331311450767 +5622836974676302564 +16086914584828582414 +62456234 +14540120362423771165 +825605274546162458 +10378889506222987518 +11945415094352877393 +10164018653274592158 +13328681692702000218 +6151097657389246358 +1945545894933313699 +7039064839853194487 +9008287291672580874 +15293627556980799923 +17826079 +8964724180655547402 +918014392041166711 +3494523652395905663 +8238066788924741795 +8608091023428106448 +10429504229059410706 +17629546554121864726 +1329364678244920184 +6220869359233423465 +15625721628276958465 +9870724635979525 +9654763076979264499 +6241248994236917764 +4184798629360515518 +6492761873737980512 +5707830735068339273 +11400819049620310987 +5885543833259764580 +4128728465088537030 +9386257357243693435 +2414448843017751282 +27638110465834054 +8952397098114632883 +303200417326182288 +1890039810754962362 +2321496553295660683 +11570046614019444351 +17346138111311817142 +17564225130023161250 +4184798573472788501 +879419213017197173 +12870531944682890309 +16860434645389678010 +10416759013972843758 +1731418056191788023 +1574206418032812779 +6311975560371923804 +10069199474594234508 +1518982380353105208 +15291935467164156812 +18392867878323229309 +14873936550357312148 +15287141248505176622 +15292781546464618294 +1735930357326041509 +12071689162815843999 +3094958919380968209 +8822812889977080118 +8473905925669721003 +5566476571519047397 +14273467008585128217 +2336278511609208095 +2871077925999300483 +11806802285479343847 +7903702108917098422 +1224005498775366601 +13749155634582655332 +15292499474174515873 +99156525 +10234000824610017536 +7604467390465459775 +13306106854211919717 +15290243360149020316 +16872667624306387870 +15580874150708329111 +1873618329969508491 +5875312241905980972 +5138169987381597945 +9088103565208984956 +14429909664532097013 +15290525376551414886 +12415372413948153351 +356832453147 +2431941499524835279 +15287423183225435399 +15287987271917909762 +17150040092702495943 +162136717 +8210515311108639098 +7604559457759139611 +1248930913051105429 +1413046623323503772 +18166079997269717952 +24253720172775800 +3870997107617308698 +13694750744229012859 +3417860786310091331 +18178458048973718041 +15288833316828106811 +14181317373568167379 +13277919001515857208 +7577362675405761599 +10801802623131915893 +12229730806834215131 +16268501706798093723 +14101026495417868 +13120708400068243663 +144207266640248758 +17144416678735650248 +4900281388974154076 +9870725103120411 +15369688544068651655 +6641851290728754433 +15348814740942046816 +2665864799369770702 +14383042897794330 +2324121416391729515 +3973491001936589791 +12626161495720486851 +160954422714438859 +5661738430124334384 +15289397349632840143 +72876542 +13514550801202698769 +6095117356076043818 +8422787595873358709 +932669187467797885 +1774358550929622008 +27638041680295403 +15287141235607362830 +5677488688285752293 +8070152345684287607 +1713308683 +13106160036035691955 +16042367680760929811 +7536133444401891169 +17396272478595015193 +357439983168790171 +18412263952471228465 +11288528377159108865 +9232711897927340517 +6384455843947358526 +12448397914596652203 +1873618364363530233 +986483108743308165 +10197025096723356863 +18251748169515149815 +9870725381320877 +4823797738096040194 +14570719480859483980 +11637858186298999284 +8415243655831169772 +13065943615106997435 +7316232528953943013 +1464040419261242252 +13075740992613071142 +1517854314742371773 +6062349147633884419 +1411636476823027512 +15817318383155884059 +15290525363653585462 +2625321610894378836 +7594912150265685637 +5996988225456525299 +1029623298901875069 +525107869847738174 +7721139371688995115 +3454588646300202126 +9870724601769586 +15691596646605145594 +1518136331144752484 +9870725076840416 +13925023889216253368 +1789180301683276287 +15291935497256250886 +16891919874627365334 +3973396754874054553 +749880123003987805 +11894374866930777716 +9742034253351633572 +4468411517671123769 +15292499551558444368 +5249797176880338854 +10490356163380331699 +1251886678142817266 +11027293669015775438 +4983841778875525207 +1788898229393166888 +9182575157417765276 +11492930680149653624 +5838366543976608305 +9849384022552156365 +21433723812662620 +1895116067312514961 +7759174865054886223 +5129024196560096606 +161987113757336850 +12235826804110991611 +1188809077673898715 +1122152576032335224 +2203332310609193340 +15291935441368528649 +15289679327343042244 +4793012374325698006 +15287423213317531650 +10908568596609773272 +7596890219191743213 +9229327701095569439 +18613499597232288 +15191004913342487055 +13847260430771238749 +4378750795426177163 +1756054153440869789 +5939823619187226788 +1873618351465713193 +4961015189234130884 +4201030116675961595 +9137112300296228880 +16885380439356237143 +15288833346920199711 +6209141871995003511 +6125359092805033702 +540017436 +1873618544926987874 +7526907737779616485 +2625039848141688922 +1694703987789596868 +10799940222383311423 +7919802277819196062 +9870724575489554 +7581409537159940938 +15291936081934116610 +2845029447323880298 +2905344094639447449 +16900509547302171669 +7150833857266127355 +4287350254044470714 +4664047973809855275 +32432337723206848 +5760234531339572147 +21715589743660798 +23407808537975530 +29048106497430126 +16971624340407672918 +18128267682609835261 +14947368045187001 +15471013794591813305 +9870726063681770 +3626331853165445991 +4127600502656089151 +1464040350475706609 +14867464403482787971 +18413674017288355935 +11227112845712255909 +11161692095903435283 +8929320284278511289 +12366136910267641110 +3808100862305773269 +14035336093650086621 +12127635753858372154 +7171706723174648069 +1611483969455549436 +8501508386016340169 +13223018370102858717 +15714740449216449789 +9870725068910551 +988175189962807303 +10829475875242861879 +6740681064828771520 +5835546354155204432 +4076606646528706921 +1256398957783358867 +10649664295314066054 +374026757996 +2436256590267684355 +6894753107029672045 +1519546395961862995 +935489329999866369 +2407481980539127005 +12108985011499915972 +7209762030994667832 +9181763852457757156 +15965980033127356119 +9230455831192418019 +4511323711897082323 +15060052268358380338 +3861350793766464162 +14071624329730933984 +1945545890633893751 +266042267409003532 +6972767454878188122 +1998545942828498854 +6765948701706493633 +6984035720417853600 +576717661 +1331604903622545368 +455853151859517083 +5416894314771390333 +3595101140764544970 +17225295190741245501 +12512221777814685432 +3492297592837003707 +14108981676855079511 +2707725174173875001 +17362817165257939169 +6993058190603084713 +8900230326182748292 +17639914886230200341 +6152225714402364510 +16367553670927421135 +9453218279371722448 +15230075394122597657 +9870724567533791 +1873618476141446514 +1573642406723009163 +4495142108700873153 +7449674879408300773 +2703776880050000139 +6577969361226586715 +14104912965778160399 +1873618235388346321 +14266293381143795485 +2792885553806662041 +17950206304630091469 +15780765857606686125 +1352811586158681587 +9808823553120887980 +12386527 +1731418051892367672 +5564352154681105117 +1545208828 +9195276960474808293 +2380943364365618820 +11652168711316785734 +5924189828468650606 +12275078262635251253 +9179881776659178927 +987047180239768912 +828143409274250550 +10690462835536519998 +4181978392249771461 +7032320227206443245 +1230295447168553973 +3614256319596408309 +16491636040106138194 +5941200116278649599 +5734323617267265761 +10375505305091781277 +8722536002902040882 +9870724585909845 +15289397302343523362 +10370163636641224273 +12441988990377678690 +9373626575421644589 +24535788163456701 +17641922897637616082 +2676033356038210923 +15773636883936079265 +16965951797418331227 +9870725383811265 +15287423178926012682 +5844238504773245071 +17132010341357071539 +10863339467698229174 +10881984560763988230 +16799559277733431075 +32150321319598850 +3098695055722032051 +8070402889435849591 +16951650337051970851 +7196012065054272012 +6668396212064968844 +2525970626430374126 +11824914510820758134 +9862929489376974409 +8971880411373045432 +18331573475356035 +2442023618814087757 +4478473389647423791 +1464040371971897754 +17533990070934252903 +1873618463243635741 +12749028207049664958 +14809301323776873279 +288673066745536268 +15291371442956552853 +20305615210743190 +9870725079330795 +9259114968816233253 +10168145881510013463 +4733754480782872927 +16074735873595105508 +18063211571015988200 +13910011282498204651 +5267137934678822328 +8646318547844932703 +1416430747070323411 +11584599154212480235 +18411981931769430054 +10576074740845993642 +8991012638537703675 +8768448353528399329 +11313741884681248030 +5516046735301085409 +10185945955038227528 +9870724667240264 +1795978977364221149 +16120716880803858984 +16908076133050364184 +17734975158126262902 +17163493766823106741 +9536696265469024890 +14637340761195167548 +4456589 +12279818232407337431 +1873618360064094332 +15291089469544085863 +16271443893643533355 +17006104435530867491 +5421478547177564450 +1039733091792285087 +12997102390997571866 +9413725892423213205 +2625321606594955469 +11255875486607294675 +13185637318694742071 +6173800107753209956 +5780770817302007719 +4228046406490597059 +4541910497318355346 +4128728482285305525 +14263025731314802690 +14401909822132086183 +1817172767438103748 +9870724577968579 +11194598738638346145 +841773672491868051 +16892239439269464715 +13047676790328080621 +292343388043 +16874641795014006030 +17557843670454377757 +5162541838608978034 +14462452390860900832 +4966825486733764537 +1873618497637649718 +7198684663705640300 +13154624256008000353 +933515197985215562 +5249797172580910311 +15229126498478294 +16952496369064367399 +5492707824801367906 +1517290346422482586 +3597075302873779692 +14204954985191461929 +9026822436951056879 +15050292378613783481 +1996539682273447897 +12754891682880490747 +3653991391680872691 +15018372292397308474 +14559118948838747445 +2789363542978135882 +10821914528495393877 +820708298 +16662044516634089254 +11826142248422100714 +13944144563808774944 +16533468055605152863 +2008696678204907404 +4911408705643897519 +15289961386737802570 +8372934479918874371 +1469680721520899649 +33560386136708103 +5569296709751673305 +21433663625497129 +13292402335039496887 +15290243377345802840 +2126679879460263957 +16483453074211931840 +1873618540627567145 +15292781507773671773 +1414738700243588936 +516227820 +16174812779789556057 +15290525393748182856 +9257277746004306709 +5248951136270369667 +21715680027878935 +9089352069267280067 +1336364348443669734 +17161757034468100894 +9870726192132345 +5404348070807889866 +3080756680703891081 +18413391996586557524 +1151966120278254468 +15291089400758544106 +18116142943679220675 +104137283 +279445585687 +579208034 +2791055637095470353 +17435475042717341784 +6682063529371920056 +6204347593148863655 +2465915698785704437 +3754850991033042223 +1873618243986741969 +7882744405716323521 +1814401560339570374 +684134257893509654 +12911837688061440018 +4058701955701949813 +8879891212090107937 +5366885395019933193 +17109444329883505663 +12161875851484411279 +9870724570023121 +5661467138594922793 +9362328123013340561 +888789540238073401 +12425792594693010672 +417019152209 +1784668047839161644 +13355753964231998309 +15293063541371575265 +6401168288001638490 +2542888048229761493 +7208512126866579781 +12474564753552836994 +14876921 +12929336513373094925 +29048192479743476 +5882159696614657105 +18202071738965568798 +4447100035527416600 +3029417638365702105 +12638469408653469413 +6887529782530082437 +9870724633030374 +7721772607101035559 +7410122287450575944 +5040671887130582671 +12109395139072755174 +812778389 +17921030976248495478 +1873618334268472739 +1873618527729752638 +6233728204387150421 +29330208882109335 +12451287838412704489 +5899948725229658146 +11460215567020659168 +1464322427066011515 +15266469874597049103 +11029100936605753894 +18285594085833137468 +550373980247691662 +6816736603272979704 +2150057907012584506 +9920573682377844677 +16867198486720300384 +4820977604163616495 +15450374437813620248 +507300877208 +11563454792524720515 +10023561427691333882 +11079423192795538277 +15292217505061038568 +194449071399968520 +1945545830446734502 +1147924971445772252 +17353152791227993245 +14288223621682897280 +3545799533522333694 +14101030794385028 +16425048613593239558 +1873618471842024407 +1296185884223556569 +15289115337529439172 +29612143602378964 +14531573207289967387 +1873618231088913869 +1188527031176473929 +13680540985527637026 +8648101753792044755 +5009357308242901321 +9870724758990754 +6760626619132744189 +10323710994698870101 +5832726215922117138 +9305500182402185044 +3205777419087914481 +3477475969707943484 +14383047196763813 +1893706049784269897 +15294191572590812146 +4021100575249420953 +8687135310570802336 +4291298466487494787 +5904754031791792575 +96207382 +16672819197307002564 +9870725081821177 +15287141239906321506 +20869630819504977 +6366353535946667878 +384854279115066908 +12852758387335649277 +18034169515038817261 +9870724714360669 +5299098840009812579 +8935931329680125136 +15282335361333087630 +11340219378265033230 +356829507638 +3494241614496880251 +21151647221888042 +5411521030190797423 +4161110871646413111 +7571000134545531640 +13656198837711887297 +9870726094942443 +580719416979647376 +1135234542250048451 +11909706579500098721 +17868299572712060977 +2040219294663912170 +9763237054719266042 +3384591734000403140 +2781470315819700877 +3493395634074046638 +6946995 +4081118921869828990 +2677443726094576314 +16248578108880349770 +13742516796882302908 +12801735476481373042 +16095291319490520345 +8521743514451855153 +9520591546666076787 +18613413614466175 +802797787154442787 +8794768871099929845 +300941774693 +9870724625100469 +435824003277012890 +16747573924607956361 +2347563213132482164 +12704210928514572794 +9870725207781478 +7239351853821397993 +5779476262967716639 +8688386475638076185 +9116328312170887240 +17939521450163267547 +5352348797264856883 +1873618458944213386 +15292499555857417880 +987893190757199398 +1146796961722731823 +4996834386472820099 +16922140512298297982 +17997565656170653863 +6088764643428952970 +15787693227923478188 +1138122942483878172 +4449356145254748082 +6487950981950482540 +4448228028054443387 +5194855086815790184 +8856014216854897981 +5565348480113903112 +13624190097404485062 +15289397341033992855 +8610102797902432241 +15287141227008518039 +6045857707735386835 +11225812687234025733 +7844311104955487498 +6312050029664145666 +9870725118521408 +10884115453075939730 +9343161375464892454 +14425661019905001872 +14277274240823152326 +5405598728725530322 +16642773989029323338 +11284191008138615143 +28113639747775729 +6503203029796462477 +17494515130705787661 +1893705980998736246 +563348302 +6737259413777363870 +1988559907 +17757265882196420734 +4916851323092803961 +15293063506980071265 +9016598433989541979 +1200046918977805409 +5512098583047253999 +15288269288321066596 +5860516583380236932 +1730289981982200908 +16145254715686923826 +1650544599554867114 +8299123345010271819 +5302201011842069692 +1534553945562304545 +5251489275296628470 +15586729198849175965 +17607182983839491819 +17788557728461048940 +6103488045385005428 +518718202 +5595927360125351454 +288043968127 +3484370924324082540 +6365615579888426074 +3736715515094517489 +9870724661800751 +14424532992986453593 +9162578985868615513 +11444274194798942390 +5903263664606621313 +8059210139317384815 +23689829239308356 +12306875953402040481 +2625039555799823451 +1238533950482115879 +15290243428934107445 +279448066970 +18118866318777726584 +1732546186289433815 +18201206770988181652 +12815175355945474148 +12245079979069750999 +10159442889421514197 +5893869020147817114 +25099962841983765 +5246976991357900606 +9870724724780936 +18063157717408551975 +6579627558481907644 +4562124381333884039 +4329752029258000778 +7117676251706582976 +8349241488771006161 +9257080307582838652 +61997475 +1391504332079263113 +644678512 +8718869798265039248 +5832726181530583055 +28202074485838701 +4299887215357537066 +18016680638239477883 +9402235429466616490 +3919395004072801444 +16890696659907862498 +17305911844681159112 +15326505426505779564 +12433992920687984579 +1200046906079984469 +2207492642904016905 +9870725110591546 +15288269275423267063 +17522009527301588782 +3206637242895985007 +16525030237164545601 +574051279841470734 +12059258463049299556 +339630437218075045 +13223613646767922236 +18255616540534459116 +14101039392778095 +5459976644113605225 +1043117249933098941 +18213474575806129867 +9521144054713885615 +1873618239687317713 +8290313614069079110 +6633286351216577743 +4098372813060260573 +8649229879590726088 +1786642141162851992 +2429880022584541298 +7340841566643173615 +7488276713951281702 +2411070513 +9055090582039434015 +10050930774305103427 +2652485244263486451 +4013648993057590495 +7144510393883315278 +3416792166407886824 +1893141995484569177 +21997756618192712 +8507454653825497485 +14713357318707623428 +9870724653870859 +15287141248504711054 +8565132145265961631 +5884415806340734458 +8507863221840473372 +18144287363223282244 +10721161424573377313 +12562775776235954738 +15291089486740862438 +98697768 +15287705255515078395 +15290243360148581140 +9870724716851048 +10586777929662156509 +15288269309817278640 +2950805418578418705 +8694008325645422938 +22561789422945001 +1733674187412366589 +1981544248950995657 +17321972846729644459 +11967097193144609408 +6946246893335956649 +2429420595 +18200912098503827893 +4166737404916733906 +7444008460096842296 +14106274658387563563 +309540177932 +13819010092574400 +5940179888249720650 +2862387654187304710 +503001456810 +5510538272098551989 +9441526972670217903 +13825821270231637863 +16028738000198188495 +14101026494956501 +17079203553796647020 +2960499213716759594 +6843808561223973786 +18110512306980868775 +5782830601337193568 +5349649358596680923 +9872783012039774219 +2521073773051974874 +34406504131418783 +31022272905634803 +72417787 +882239368446615905 +15287141235606883137 +9870724582944742 +15288458206618601302 +1792876788337233597 +13728324673941083452 +2979056014524680527 +4742860620108752219 +295544243748734701 +13682529360913049311 +14943464741387183785 +15289961356642760825 +9870725380862122 +5890793127886867281 +1847659236867119188 +17097534090192445073 +6426841233678607355 +7179138111753109877 +18227331323348867470 +12123869581741938667 +16174812796986342469 +12548740933419274649 +6741512458587945326 +932669131579597422 +5515085278788979157 +102615249274421565 +15507970477422818442 +15287141179719167772 +14962741833948553108 +15291371490245432735 +7722831397021554279 +1408369638 +3822589237543248079 +1839045958927789761 +8504448919704112752 +14756240381612726532 +6912693590870532554 +1873618501936615392 +14650961607110582850 +4451048247970439004 +830399557690793490 +1042835233529477932 +1363739614 +14161425375476601604 +1584155116203033977 +359800716494834349 +2625039564398210305 +3477193936108350256 +15132533768571735315 +15226642433008151949 +7244428084583338163 +5302024133457163397 +8337520351109207354 +1168553442637406344 +5458848621492773078 +2524806001290315567 +153748072 +5782296379704153810 +13196286156161044509 +6155327877635776812 +11741165539085600629 +16538960950409455574 +5942892201797100947 +4549651449554095658 +7303853211420282796 +5409103959576812519 +434215915459 +11703729099918231141 +15291935441368073760 +2845029503211148942 +10421310547708950869 +5299098870104394759 +8373125230602367398 +9870724619660954 +7196294016970080498 +5504436110766644909 +10809573709942639111 +15522713715103591149 +9870724727271323 +13331692090551241408 +3491985530565965829 +6257473593472266614 +17082847207615301902 +14209969948601109751 +4728670078173253528 +13054139310281268103 +15387963603965001329 +11238262650285723765 +14273081993166850387 +1197402941616759643 +6851316690097564411 +10011340650318806547 +28484099486589805 +15946746029805753679 +746149276692606268 +15288269284021654486 +16202158629731845201 +8861450724091844331 +1147642972240168498 +10189735511971410787 +11572882286147809468 +4664047973809400251 +7677136632586314346 +14543875847030063664 +797977540607610221 +9582104272814168707 +4020063595197763264 +1863871710920395425 +3808100909597135678 +1873618489038801706 +16593745093459386214 +1873618248285707147 +14108728405997538008 +7622195581110079775 +2429880031182916564 +13863441965626497360 +6082836309127671075 +336810221601053689 +14430071485544800924 +8389902452401772619 +9870724593380971 +4495042611869018742 +15289397371128592836 +15749634229646805393 +20869648016291288 +13994042902743824106 +1938490399 +5461950793325031921 +8043446380490468540 +13915739326544166372 +620888934 +9910951986547005844 +13884327330821187111 +7024942054566471874 +12419459183190355130 +6148949632213994696 +1873618338567431936 +14737684059501059272 +15293909616375118624 +3722579929450430138 +11742834345081909602 +16485991196040957507 +14171682847640261360 +3544107387816266958 +1230054568341820884 +13585652207185310330 +17926949171264688668 +365430386518 +829464357341846886 +2953422709169335951 +15288269271123839957 +15290807375757334636 +15291089439451536247 +474241401544511743 +6195844719251705597 +13819018690968165 +17646390544367167858 +15291935518751997523 +92085405090074302 +16518567576671373610 +5509410163496651347 +14101035093349320 +5460499803636172954 +9870724567100913 +1873618476140992880 +17531458386106016764 +9870724674711383 +23689812042071512 +6310847486163558115 +5744522418110155251 +17199514878479911347 +11927769 +10421968855786398858 +21997558857491021 +996672583265178175 +1041143148010548642 +9186160633315748461 +7620722688898520758 +4589634380797385896 +14201833983555091253 +12301425206993168905 +6342120543023882536 +27920113972417770 +2561635767687591026 +337192052979801270 +18064849871713820053 +23407692460155649 +5569296735546844565 +7946390907386933019 +9870724845301690 +11303849204815052278 +1836789909388404733 +31586288514383776 +7652620472412365556 +12753199627454928960 +880547270029892523 +1144540834800691942 +6205475671656957491 +1592962175509346053 +15293063524176844027 +15289397302343045748 +614294321649356945 +15957289875565863093 +12075580116663748295 +16365628939579170150 +14915500229859548782 +897075226584112047 +17749475296527206018 +5098070090331469849 +11440358559102548720 +13079455229790662419 +3471730001284178550 +5347351719937377689 +15288269305517836796 +15287141188317563756 +17774138996614452848 +30277976 +13755724337176522440 +10046052103206805384 +5456833590402028675 +2047638292458727231 +15395240886249603687 +11866143662182908403 +2037812384993383762 +1219784942757425317 +2008078727273649305 +18123426012605278303 +2688678228647889173 +12057002331826554305 +390570242754365985 +9136088178131354065 +958440276318952279 +5986744235957310696 +296644851208 +5803642696037581345 +8879858573940433639 +27356094064254944 +371996013021700353 +2789363555875490728 +4787251587801811388 +17185915332719958598 +755427636961042194 +8881333644924831497 +2116474955010756132 +1763208255305444409 +4274168588514694763 +532291916112267238 +7421457429828542585 +4291298457888639229 +9197666107275622647 +4176050972007403579 +15292499504268655900 +1720270693429491510 +4074350553998956772 +9870724666781506 +30458205708099633 +2785415261751618222 +6153353788611041242 +12530071023350666128 +12213342020741313976 +7151954308638449864 +2359415913249073160 +3997830 +1873618360063643902 +9097135786792263775 +15291089469543621691 +30740222110467489 +5438906422044199526 +4660099744171645246 +15664532190584380172 +14129319885108437474 +13879970276934902359 +4368433122605611183 +1873618304175912445 +9870724577521189 +438763253562152357 +292342928491 +14368049892416968749 +10334111064466788713 +5888081980883929307 +8209526949857074481 +11152341702416420079 +3492267499678995163 +19177532404009207 +2060112025473393618 +3862478829282922163 +17264773178461982314 +2625039560098787322 +14235153898493600768 +15292499547258571411 +6047549806151685124 +1873618992033310494 +11831633449943854269 +4287350206754660660 +15290243433233079278 +2573543683205058559 +6713212013325603963 +2343872394433216568 +1731418073388109110 +9168364367443084461 +8318787240946905235 +14494654614837472785 +10702120626454221280 +355478385118765277 +4822105643979527527 +2584893974043585130 +11031722156509445505 +2849674907923790971 +429916491947 +1873618441749474001 +3104131065037548000 +6793473961461815385 +1402930148 +17015260376673238374 +4020335693189097640 +14225928276687012662 +13298200086887016095 +11873481009218350070 +4127600455366297348 +14031324889532010512 +4005236394444919919 +15800256793861187049 +4076606655126647999 +17988024594579797691 +9870725070942172 +8139456321376435097 +18056758355458722638 +16399671652190216876 +826733396044965433 +15290243377345356091 +9637240656948437712 +16228351585320577847 +14653054815482754558 +5267744932752014944 +3927382993039071852 +15292781507773227173 +14004639635132718887 +12383840277459450842 +10370417990725208293 +9870724658851609 +3647927653858683049 +9903409772850397369 +2373415502940997016 +9870725133922377 +14654464260815930840 +17372488073645146571 +6060555557841350749 +6040677747585334719 +21715632735596418 +13401072334082434280 +6206321690771522709 +17634426736176872847 +9870726299283720 +11161703111965360991 +2463043967519380062 +1572796336020473517 +1652530368464710959 +5492409503909307157 +4396262987143921254 +3413853493138515424 +103678524 +19741582404302162 +8064175486935830591 +3495651718006987847 +17956041976174105928 +14101043691742657 +1873618243986282607 +4117705300223273083 +12594177041502708424 +7215857415718714446 +10505832651350295385 +10779787610829374929 +534119176 +5905801786435639915 +11129919313518549237 +32150286927595340 +7429691915925400828 +15289397366829178209 +9870724569564298 +4358433398544099181 +10604506699394340774 +5774046330214626570 +6259289631624210318 +957876187625242267 +3225407681812522938 +7826218326618893084 +3180269998450878475 +3545799490531969879 +18068492228830380681 +1466296524688659367 +17639903947322715540 +14418163 +5411239052480179324 +9870724632571619 +9870725107642403 +7758150819716277056 +11424491477468201186 +4144239374822824444 +812319634 +2760911798254578970 +6842721525454234919 +15290807418749737224 +8221823040559402258 +11154113042859304095 +15287141196915941525 +102615266471184862 +2989761681675848960 +1043117297221975824 +9184831344527305633 +987047132949996643 +4248329416707171537 +5932136316345662987 +14428924804085192884 +9870724587941476 +17462509665872383079 +13819014391542092 +313839140449 +10535319512420663408 +1518418338949057597 +2416715528337843681 +507839197 +560840021654526591 +11863494709145325394 +5339835897830268774 +1519546481943722201 +5368870524658006689 +13572961606769854018 +5155012453095319128 +5995296135637708437 +2147544210029227771 +1251886695339141397 +9069694239906155401 +17229611893419817462 +10229516639352395304 +14426056237757121238 +12687678863684406861 +7017221506060727776 +15294191572590354905 +10532987940533372886 +6361518319333476776 +2499265820185353350 +5356297048398365877 +12124533569129098638 +95748625 +7017077945682573887 +16990917691867684554 +451412690018 +6153071780807051278 +13079641761630740265 +7914358239942878488 +5623392699018645334 +17374858374604661677 +15289679344539362855 +5755891984756706784 +2153057073357729264 +3238281434976902219 +1629148447909297306 +8898725005986172359 +15291089478142014583 +2938682705183920715 +9658025172157533839 +14674511337415721035 +1873618368662035233 +15541469894605812115 +4437379979283358991 +1779306973746509801 +8794204864089104742 +6891056081346644368 +6915044776065254182 +5142018967824723062 +15288269301218421267 +7517987891047567398 +9526029509156427424 +1199901724427699754 +6488236 +5722409932328020950 +13730402036462676033 +933797278873237543 +9870724624641712 +12982659031513510826 +300941338834 +5962582003719889932 +14819383329427896536 +1873618506235592411 +14290478428135514686 +2165193900450861264 +1854737581648121692 +9870725897613522 +8839492891961072988 +16979021637711454156 +544539427 +69468627 +987893190756746910 +5833854247140857871 +2625039568697173651 +10591889158979004941 +9870726480294162 +5845649209709173406 +292345425752 +985637076731256947 +9132035970655720839 +1860700038481053299 +28202143270919316 +11694815825177560358 +13525196865559988902 +7446140880148639007 +11366272409954836475 +1746827684005494043 +11304695215332481509 +2077627859197311654 +15288551261733067340 +10337018751703083408 +6365225453139920066 +438514899009 +15287423264907861265 +11149959913285820989 +9870725377912983 +24838480 +5303893093062347743 +5432665585007402644 +3967850721172220648 +9870725118062655 +8579829263013853640 +3755169211678276399 +4417872376026174796 +7564209663952897913 +9387385422853515233 +4738806703305803578 +9676581144234039209 +1873618355764214090 +9427840011978689588 +6156455943247300775 +27638024485082944 +9308649427281187128 +1873618549225491555 +12601357289973114157 +12621564515514064821 +3872570509714410059 +15325213449971768588 +10166171770991094868 +5941764153383128192 +9870725073432543 +13862523603732617145 +4683674441593984983 +14361456990268310565 +18275311432732125927 +27920040887457503 +6431101369878924883 +4211213383 +335335331579 +18340903466379266643 +3648351145309245455 +23125822228470029 +1368333061234431057 +100641190344268260 +11065487220741573048 +1992588707391932346 +175322119705936961 +2924288473891935188 +17404805271632435646 +1707901714615787452 +2949113337358463777 +3757107113656455338 +7936489785816852938 +2276633638193338487 +1873618493337770102 +9870724661341993 +2906259905603396428 +4451048239371595465 +10590553434274598958 +4029907647008036355 +8465882951412437058 +295416529576546534 +1784112314702629632 +5136942689772181853 +4078298757842341053 +6158568107615066873 +1083960774566890773 +15368335131707914231 +5063839133985812281 +2547975392690003306 +7058279794388589158 +9942463108347865420 +5698698140605244212 +15107364757395484742 +14383068692501033 +6210551954008446762 +301492599510951575 +1732546186288982238 +3757101393395996986 +12235398210250479342 +2791055589805659358 +25381953449504409 +20587541329243413 +8872404143882195420 +3652070829616481736 +378325248012 +18412545968873930811 +644219759 +11363471293370033386 +4661227771091440067 +17314493017498667418 +12505494035987837938 +4316472195461620609 +4660099774266236410 +16770481620252187938 +27356020979287273 +6689444101208552754 +12363581407752430538 +6996542550812993150 +15287987284814798068 +15287423196122329666 +16856204438042074111 +14487876837933724947 +2308422087216275128 +5575475303883756272 +9870724635062014 +10158597567983923499 +3599049430591032665 +19741625396694921 +10662960070830926616 +4447099988237630308 +1842430168656921876 +15289961326550194642 +13819022989933887 +11359026223535908163 +3704985230610535217 +6167467600343423517 +12552846396214610071 +1042835259324657024 +2628875744624529452 +10195897095599501453 +1873618480439956921 +14101039392315501 +6842326798207620326 +5726358144768542273 +10222252911390772734 +15306211552483284134 +14024511452629260057 +17855181732316470573 +313841615983 +8096912553078448054 +10557285345955500811 +35258719 +7213784354503024935 +7794629221247622482 +9236423921819604600 +3404370981523180974 +1518982380352194416 +985919114629820079 +5784522618070110456 +15292217457771235917 +13877305484601734748 +10353833040685250667 +10835901056727991901 +14273467008584202120 +1517290320628889882 +13143536835617301776 +4316699111049817218 +12448397927493554500 +2300282530051146940 +15292499474173610070 +1998521381 +98239009 +30740239307269930 +6101795942670075923 +16064731596255467870 +1783065579255063769 +9870724608781965 +3862478902367441196 +18173781368276863163 +8721971944302453211 +2625321864544389907 +14238537293151559770 +16940455997476965252 +16699231963845585807 +9432668843762406292 +14130457194541352666 +16049291150576465683 +22561789422490497 +5245789596497153220 +4098005533760053796 +13735950170324146485 +161219206 +12548813974946260682 +2170133758076012086 +9184152415375661115 +882239424333882679 +13578406362161830721 +1801651221 +11672220357238074380 +15229384447889896 +6631979652842005292 +2625039577295560219 +17897281803760515553 +1264386645717172562 +1998795813495268889 +5831598141713748423 +1626046306171619904 +5950902662560624384 +2454407151718767281 +8710197104969453564 +16992529520932312565 +101487235253216837 +1188809090570808002 +5245848895653355811 +15288833260939455529 +547029825 +12239027656080518066 +447113281510 +9797759154703647629 +18613559785951732 +15289397349631921063 +71959029 +19459639086422593 +4127600472563058730 +794463501072750569 +9870724582501956 +206360155053 +12334404145596749153 +14995963418175877266 +935489355794564889 +7587276533633673474 +11972890457008116608 +21433680821840505 +12448397914595725641 +15289115277341822702 +12303867489606655937 +3221177500258494473 +27328854 +9870725380403367 +2749444124502813902 +15689904569685396542 +9236423853034069167 +83092815337956034 +1735930335831420231 +1838763942524962323 +10963296716734079173 +19177592590724036 +12225574620834962518 +1413892590847608134 +18008106256778996287 +1411636476822109238 +6447496643360080468 +9183456002463122133 +14918917774726742326 +15275785602585929090 +5268548016692268507 +15619686604870600700 +15291935544547162799 +1520923136007739036 +2484158752716048307 +797695489810761887 +1042835280820848053 +5516046829881339658 +1873618308474889782 +296641911872 +3718564680202076826 +6262122720842038754 +12396824202220159530 +13544402356149179442 +5995296165732297944 +7565377332552802403 +3413980006980278932 +16323339814556360234 +29330183088506125 +1873618501936156760 +4791234671180600342 +13573259713283691188 +3919367422827585071 +10585955821198917976 +9345312261662857339 +17720086737501446132 +3762172474877107403 +10490356163379415648 +3971799406515144411 +2625039564397751781 +4463543734349879362 +153289315 +9181763921242375701 +9870725981434079 +1818913878670141988 +1788898229392253282 +15831049634807228785 +4449074150346866099 +3697652679465249495 +3019990612812059249 +5160383069858250577 +9447006889942918764 +2895942480079766182 +10935693924746138122 +17160166614835092823 +3056501639559780511 +3545799507728743167 +4888419829561169807 +12318929752413839603 +14472814467718461927 +14403319904145531265 +1603303097579278471 +15451114565764672597 +4052462105812283553 +2588445393211119744 +6473712386164548012 +4395824253280204882 +539099930 +1200046914677923912 +440801816299392778 +9992164304480458802 +9870724574572040 +14499662365359893736 +7846294442110569027 +7572692168475239092 +12058130328652565349 +1147642972239706625 +5993604028623836478 +1678535306338508369 +8901578402287858335 +10161648566813677509 +32150347114297636 +4740657586573293994 +4085763646718228506 +11669272592120221167 +4505144202843403836 +6181187326080074396 +16893287376696974663 +4021100648333469594 +1731418120676989114 +14278986611810785067 +527217511716372417 +3221177431472946854 +677396625942126749 +18040034251410924408 +14101047990704189 +13290374285542320582 +4200651629264718954 +6329348166615198615 +17697688112147864710 +817300400 +17425160200172235157 +13939914300570935803 +4127600502655165962 +14361095630442006439 +1925304626382531434 +12911315469544938519 +6829167367527204602 +5764989283106762698 +14383064393064557 +15294191589787113526 +15291935475761615606 +1522648610784372840 +10174105658061634031 +17296692986962850841 +13971217767459531807 +7872981588796837405 +95187555425669157 +473967541563513300 +9878610781320908814 +6500635606105812095 +4127600446767448848 +8333149240508035980 +10145345834749022916 +1972656986609304235 +1873618385858816450 +296036563846043842 +9371707452376956202 +9096726393093965197 +2399749428907566118 +4935397869899306964 +6311975513081663953 +4131548685003600806 +15289397315240412120 +4727296740454696303 +15066610596431412029 +9870726296334598 +5265910562483348840 +3878895965170646877 +5463642917535233382 +421049747515267586 +16509564814676268582 +5516892784508541171 +3704703209908743819 +9870724611272339 +4393850116964900730 +18164832363680984319 +2637497502580823461 +3391090887056636174 +16910582417916240614 +13819018690507845 +3531133647988141900 +1508049959548431378 +4023356749461143167 +9870724718882680 +8841103020833595880 +18174909438187803322 +6856532310576475439 +16592324700378837531 +9870725884244176 +15582002220618362267 +7259582250067905103 +4792960056294845338 +8752628696345683633 +4011213668588806797 +5461104757014004985 +16753843542726424515 +9870724566615620 +13673028021617049145 +3488883294248379410 +29612147900877606 +17620704769380140477 +309542200904 +6828039237429120883 +30740290895560081 +1796696420632193891 +422128538275228738 +7727798225651114970 +2509567599504268748 +3064170645115329255 +11015084378272638296 +17624664052529519706 +14396270988023965842 +17875217632177437800 +214958540605 +12266818901383319638 +14261669986161200629 +15483444638967338465 +2454071876842567578 +6064503731590939183 +11511147933887314248 +979359483336219783 +15290243403140511593 +12412626186082462515 +17015954219525038609 +4127600433869645885 +1149335053459205995 +15724358126852786958 +22279768720672168 +13291513331578464483 +15292781533568394095 +1414738726038299138 +9991882262282458353 +1948366020268471494 +8931012386994547074 +12411914243250345239 +10578330811880647151 +3052704978359426714 +18067824624277086913 +4151361002449609911 +193555791362546527 +10702965397904831522 +1756442695560209160 +15293063524176369230 +15287141188317105643 +5699317859939724649 +15290807410150889716 +1202867031415608754 +1786924097377608366 +9870725382893753 +13097541028165479666 +18331427304976937 +15293345540578748957 +4123042324893807021 +15802209657742308291 +14812347282180225516 +18077901738905053821 +2624757556593781940 +12767897460364885604 +18116424960081923281 +3588668394385650155 +995384715303207933 +1145668896112782621 +5778348150065937218 +12166201838644829116 +15948615389837335409 +2625039572996138229 +15291371442955631674 +520141034337217978 +2278900652359827634 +7190941895787615606 +1873619004930682096 +9870724603342458 +14887050050011418882 +13750930062629363276 +18206110965885197007 +12845740672770591862 +5648546902921260493 +3971798864829686868 +15293063567166300137 +32714319733142215 +14798960469630204623 +4234100296790982790 +17173735689874510984 +15942320976585893297 +9870724666317797 +14020156713990709951 +3822179681402096264 +2329883539558973182 +1873618360063187096 +12786829100891188007 +3539071 +4279174221 +360260147196158445 +6382842088531118644 +3812049066149498738 +15340580945861565711 +3090551779704377537 +6527884510368841353 +16390319169797508774 +2137610448022170905 +15209816724605790297 +5250860225201914704 +82548115705515583 +852534097651063955 +1890603817765655806 +5142018959225851771 +4297578887629445575 +1785796087654584477 +16831311376036937662 +11247389295286559457 +5991347923196709309 +7560652789174135741 +5058464982337405250 +4541910497317426885 +1627738395989524389 +355504515140823936 +9870724577062433 +8230535678146141132 +5083601569097334188 +1873618304175450836 +14388630039427635560 +1685722535145180234 +1520956495172099667 +14101056589098168 +5459976661309925078 +1873618497636735605 +11869124831344398414 +12956951568855343572 +6614909541061835532 +19177532403571772 +950543019372128298 +11007606190932773204 +15287987246123857031 +9870725374963844 +16750645775090725636 +5251489223707413096 +5349649388690804239 +880547347413362716 +5895503452529114786 +2827234676919571923 +6305726908023380286 +3265543275046183766 +17993920042478097885 +5464916018441891160 +9299531613884014992 +17632571483632043275 +3069948027258151225 +2367574150131832325 +3545799503429307846 +14301995912913181004 +1873618441749006513 +3076659577648718153 +3985586538674416274 +584643995251787686 +14424532941397243275 +5344087239302997524 +1839046044909653045 +9845278791466379816 +12309852946450942075 +13177769289477605720 +21433663624602513 +17357265447970295499 +6844712567841834674 +12237654272687235849 +15287141209813294176 +6155045947215267356 +464715404621594005 +312512850573735697 +16526029853205226557 +2700763002781584867 +21715680026962459 +15290525393747255295 +9870724658392853 +3865299040600080535 +13819027288897351 +4747653742013059096 +17232159964597010258 +13940690380052044100 +4448228109736875969 +18340374733258630712 +5153885686375599724 +8557399560384876200 +103219765 +1464040393467187852 +1840738113232588060 +5345810284120461940 +9322958429729407275 +14101043691269058 +1705645591991446491 +2152216378620980965 +318140582948 +16879729062089873130 +7827783370919797860 +17302333254828493968 +18372582300935866966 +16112245318015522492 +1378952147494267147 +1038886969499737321 +19177472213935081 +16432982272152706718 +32150286927160853 +10547011290218049818 +14060082314617569429 +6595009189439298318 +9870724569132534 +12057002297434579882 +5304739198157996979 +1730290063664633444 +12611037637091987791 +515047984077949291 +15897859282581860740 +7190869723846421766 +6936954771463165279 +15470316746207155437 +5246940184015686612 +15228101296501034534 +1198918801777826445 +1873618381559381367 +18057691513095995571 +14252178103269202844 +10864467494618336853 +9870725107183646 +9870724632112860 +4254733676255931073 +1413892608044381687 +14933324549757951044 +1838763959721730276 +811860878 +12297532705006039577 +16174432731240477886 +3731225395645532257 +12139398813938828337 +129168850403198609 +10914630862541309887 +4039694191486056023 +1149886558087295178 +14041956548615489833 +15509304376346679379 +2704320663850341641 +4784877285882220185 +12424056059810440891 +18412263913779363880 +2608903504717031930 +14111025329475503019 +601478743459630732 +9870726702985503 +1149728625034933486 +507299956084 +14264208142382995214 +16144773700870105743 +10257285887572208444 +23689855034002659 +2625039581594524492 +5623956688833028830 +16639809534942532694 +2625321572202517145 +14046051235721190567 +7874396428657308680 +9291494327182253673 +11476585613280362358 +4239176596338452013 +8032530953208678904 +17918522524213187936 +17168749270732070516 +15291935458564386339 +451412243424 +12944621759895449650 +2626514825137096412 +210659116497 +9357293803487770634 +16538192980636352818 +12424382439595706534 +9870724821053362 +2229321848839410376 +10922691394792464092 +7301671987551883089 +9297735470756268616 +16863746392386442498 +5723537903358382028 +18067928153034001057 +15511108508390969 +17154008209968486527 +1239662016091940572 +7571955457723472658 +9096229466658725857 +15212072920312933317 +16869765485327434295 +18320878410953792555 +8700494707207576093 +2150364421346368460 +6029477 +15290243342953355742 +3707523361039199267 +1873618312773841721 +9870724624182955 +17632680791996577460 +4234673198106030810 +2250769230759076513 +15290525359355745719 +1200046875986976809 +11970387633123902335 +2545948228170697087 +69009868 +5833854247140395797 +3852143464667702955 +15292499555856486090 +4634359033389207619 +5476138965309071478 +15288269245330244259 +9870724579538541 +1873619000631239754 +1873618304177953630 +7904080928389862568 +1416430790061812283 +11864904829849720027 +17587245658421542909 +21715551051800955 +5707451655310946509 +4813046607040036139 +14075246203217536945 +1837917910513363085 +15287423264907422587 +828143439367899804 +9870725377454230 +5368306521944906552 +17717689991811240998 +4512528339548788710 +11398695641569569069 +10527536402680458856 +14258567801432380040 +3530088527162001736 +16266809582587296949 +16526175369603198620 +14127376344190175555 +3861350810962305468 +5679882735784101879 +15292781516371138705 +3230523007169815998 +1086068750891497333 +9692124098164367129 +27638024484621167 +5152193570763316745 +12235398167260122245 +6156455943246842659 +4800458776006628190 +4547181581492695663 +25381910459140597 +4452740346386277188 +16484582940441012908 +14866552854313655052 +16101055855215331277 +17258512310888182147 +15104099179857577674 +16145254715686011774 +15419972694028473920 +3701601059573925529 +13819035887289966 +19741638294065357 +1836789883594818223 +6500686970729357603 +23125628766733962 +2786543318764299039 +17607182983838566334 +15287705225422053585 +517800693 +42729843 +5941023259389022658 +3868119170234330726 +7321723653744448403 +16795611013703226981 +2790209566392457394 +14282592246431766254 +9870725135953998 +1576462570760775687 +5460499820832501654 +15291371473050227717 +9870724660883235 +10255261970529934788 +11017766478910543434 +326738983133 +3271455447591631679 +8697674543180565592 +13237708557081051143 +3546645479552735628 +17633893336703900183 +9549673313268941585 +17470703043924664223 +17631725400032158230 +15804734059994287439 +14354166005692247868 +9870724723863426 +14951848861293492008 +1201738987299816581 +1909800124633803121 +12314414645940922269 +1946662538275015178 +4693454884206488096 +14462121002204464918 +6114892994815862155 +61079961 +12011108604119168993 +2859340251004805963 +4821823567389540717 +1605019678889548941 +1873618390157767697 +9353507151806870132 +1786642098172011284 +1041989235911439217 +7479448579244052237 +829835550680769892 +1414036927372402641 +16449809 +5246976935469280136 +15288269322714170500 +9923357203018242310 +15293909620673626454 +17089062596190872199 +15287423196121866559 +9870725109674037 +4520807960171794865 +5782296461386581535 +9870724634603255 +814351263 +13526334602624314211 +10939233345785957508 +13819022989466485 +1873618527731339041 +9761262978591440878 +7364698481609487391 +6366071455058494624 +4660099718378039551 +4647911886895722712 +22561746432121848 +13885455422226639444 +5463792384398548018 +13705876817113270003 +605155997307595803 +6050251077808900247 +3362915967962068724 +2625321580800904945 +2284412389694974910 +6357261901724007883 +29894215894049306 +4628893222601041345 +15710497921254575313 +3704978477546429399 +12767621272639976731 +3250255263384221305 +16271603831338378020 +17612253793079287129 +6019004269345000711 +5301355009924597043 +15758933542865886985 +17130766381153262820 +12750853257602280589 +4610390808687752314 +5197393238738928914 +219257507157 +12665415616966166285 +2729847578252630067 +5569296739845366987 +22279579558363363 +18214565962260629441 +5907574161425122742 +17577217616148313165 +97780251 +14212253575230457510 +8697674474395021270 +12083429430260422183 +304119565331407320 +5895436419795065435 +15290525423841861785 +18390131773883357416 +8716776809328151764 +11149120716834549988 +4867413200845346706 +10290327232817928044 +7772879542311337210 +14527608124574944558 +7573820264178864432 +160760449 +12611249807723810534 +4465823248743488111 +2624757560892744250 +13301154954869227981 +1873618321372227263 +9037294711064976139 +1413046623322133998 +1795697562835573983 +933515215181066237 +11921886842851633404 +19177549600348690 +14099248970672776201 +2625039577295102174 +9444197008646279740 +15011107079779069256 +75654384455868141 +15693612750414042031 +1998795813494808952 +300943355523 +1467142535205638129 +9870724626673353 +1036600671087302372 +9870725101744148 +5105457491326885524 +6843808561223067686 +18443164073222090141 +10156853965084755435 +15291935501556784556 +17204145507159263679 +6280132046092784315 +17198559071664221922 +1454358835225125443 +13523514438597306466 +5060157149539230696 +931541117557954897 +17847527399173661404 +845012100688124089 +71500270 +15288833260938992469 +1873624795910722329 +9211816054424881991 +1873618458945784014 +8715009073166039251 +12553974444628906492 +15292499508567174457 +31586327206892674 +1401410983910724177 +12370327100086626771 +11039716201406998853 +7677136701370927115 +21433680821360840 +2276123859217172615 +15275014538889159184 +1873618364362138652 +16802905489466548944 +14138252754113600230 +15676397510313396293 +2031582545197944275 +14462895139282632200 +16876615896935174446 +1732546104605167280 +4018433204563632271 +16751736523360901826 +12364647742264072830 +6062811689063169310 +4211410882021367265 +9152863560558389127 +15290807401552031833 +3967850673882402794 +3307734082 +6428362150862138142 +2673769396100872364 +6383124109232451020 +2361671975685341515 +9999102107249960354 +9196286117992881886 +6196126735654410887 +1893705981000313686 +16913966627645381941 +13850612818404510827 +15292217535154695457 +6604811737535946712 +18398400527636974354 +12406930521299355297 +14101060888063440 +1840738130429351999 +1873618501935701960 +5535304556822082464 +8206203200242407015 +29330183088053054 +12937214923035251841 +12120084196327709639 +8839653144498427073 +1873618261182599517 +7291911964063057255 +6409844049019757539 +12918763905937719569 +2133739888339404958 +45220217 +11229884474259868248 +17048117256962785923 +6287464079413752872 +5319918520868026566 +15150908633513420981 +18138447141047125970 +152830562 +8039966368522790453 +31022307298727516 +2729565583346452271 +3811203034137895540 +18138194366612392509 +1413046554536593474 +15287141269999996336 +13410410909734823762 +497934079908657609 +13518427137128994272 +8316320782878325762 +3906140061179595746 +1092418990447281439 +28202130375118464 +5299098870103476096 +4078298710552561524 +14071726079227084076 +14900735768854942802 +6925759830950740072 +667089872855198685 +9870726994096426 +1587112819500008189 +9870727101706544 +315050959506199552 +3595101200952803588 +5884848060276172984 +13516735030113872436 +1730290024973689074 +8502004638977104930 +14581169549127125939 +9870724574113284 +666275479867513417 +1774230712891556633 +1007582050496296181 +5993604028623364405 +1343319747452287094 +2932283198727147369 +13819031587865969 +15291089452348434267 +5900230758827899723 +5619565529195548337 +18940198 +5138018131179802910 +2188659472260600140 +5403008449516603011 +3344434243 +15131405685764546881 +1873618489037883086 +5833854277234988441 +5953949364415519572 +13515324986792952540 +2106423660343538652 +816841645 +15287987237525004580 +8421410001496271292 +28766107292140894 +17781311649283647736 +15288551291827207719 +8717448662740641241 +1570822242695862889 +17482714249993130841 +13105031987622073743 +23125762040869283 +17700310410149118607 +15291935475761169305 +3229413760895293608 +15289397371127665406 +1465168459078698840 +3418035913429949307 +15287141257102174914 +2365498129463187503 +5249797155385272343 +13754032200068375759 +1041707215209637505 +6097847713031849822 +17465760247169486262 +1629148465105609468 +1223976979390989739 +14754337416648806241 +3494425236342986221 +6664224291765686903 +2530739313276357975 +9870725973045470 +33278352538680621 +12237172509275331668 +1144540847697572533 +4264363504801684472 +17693457891902892134 +5904753993099908039 +3784724792312663401 +5994450116523473804 +5566476571520143628 +11788554737121499537 +2577243856547160495 +18061747669787300013 +17182791002987642799 +4756274120448561576 +28766150282061919 +1092418921661738636 +17638786816320349848 +4237484450632381697 +11788921454419594187 +16427873138458772786 +17420425315412098603 +1873618523431898109 +16092197751302723831 +15287987271919025734 +18403611992173668684 +5673149743271654433 +7646567114842649322 +5570706826158678237 +14036209199681590803 +7840455042879135382 +9870725883785422 +6847384073334766776 +7241043922144659849 +5943738324090307255 +9870724566156739 +3439535456067014804 +756895924681137053 +2625039585893489428 +3008222802873102169 +730753463109892104 +11988195862648473148 +3420009998155268509 +1998795822093195658 +2625321576501481701 +1254706867965334426 +7084944640355884002 +1467988623104499643 +6974459570491570985 +7809942364278050695 +4021100626839292985 +5390858144684862018 +19741565209097627 +11010253 +14311736903207233960 +9328189234909363818 +16497957031496133067 +883367494244387208 +214958081659 +828143409272866505 +17387144877877775974 +11737551771721553072 +5728764487730398405 +3316802412287847658 +17009624892008786515 +17088205536462052729 +9870726269595901 +7397691523196987077 +4177607647708070237 +15020871988477509615 +6351416861983921760 +2857593332350343326 +6154199846418140588 +2858721449550631067 +15289397302342127916 +5516892818902094935 +15293063524175917327 +16365628939578247566 +7403693845200446291 +13414556888631499816 +15287141188316642390 +3865299066395241892 +2968185489195546785 +1041707146424112991 +1756208976234305413 +9192619904757489133 +2786543335961092804 +1890885821270996710 +12994725801947705303 +4500380131690962516 +4844858461531366514 +10007938695021419390 +100641207540587960 +12014771125630346337 +15083654577992982560 +13521137851733523494 +16300460795691814909 +1973785035023591184 +12881745539904647401 +6209141837602109276 +11529114911348966001 +6570315963541227654 +6474545510181176536 +572110149897422243 +3082518495917122243 +9563139044454777793 +4267449658638490646 +2572415553107265488 +567411536 +14184131959057829154 +9870724602883704 +5939508026460615190 +4187198244195016815 +13843831966300002785 +12875717458541220037 +8207312494236231994 +1873618454646370534 +8598210553860004877 +12974919760129952993 +8348067735519773188 +11510172448171493799 +6742621540469595263 +6767393152337644543 +31304332299488776 +9870724665863991 +17058406926822367983 +4510195663483452080 +9649086479758069023 +17008002427446963552 +4221564906640121549 +13327291319013231763 +18104401478769458822 +13586095437453200186 +4278715465 +17957750408840481687 +5731175873637866094 +15291935441369643937 +3080312 +14958319878224365572 +9706882037350667058 +18280772498690351374 +649695064654563451 +18059585865335521009 +13940729091866576280 +17107722821695715912 +15287423213318654230 +8779011389703469705 +8777599963281822392 +9511403338599564690 +13460494288513420884 +13784027103340669278 +12932096278594984562 +13819040186256967 +1626892316688601295 +5353476806987745228 +18895516000731964 +11346975092430426223 +12495122962811275294 +11287969482189991224 +1873618304174993423 +10709931951062071692 +2996806038868090100 +6255625320163401136 +9836098777800724618 +1873618497636273356 +5459976661309458015 +22561763628895784 +15902165039790908665 +6166185757668434492 +4256306398286143975 +331037940548 +15289115363323696255 +9774054990929462949 +9870725374505089 +7721139358792297577 +4088262492113296623 +931541147652543377 +8163729444118076591 +5801361178389724727 +15133110995495429597 +8622393591142685322 +10167581853004539885 +17387549513422103514 +985919131826136945 +12190639287257746690 +819332033 +2273253019856677066 +17913783277156712397 +1873618441748546884 +3308693132090347044 +16536747807833264027 +29330122900898936 +7824637840407291810 +15290243424636263373 +13882019050381987914 +14650572868605052119 +16399671652189298876 +10803922177017068356 +11485232201928089751 +15292499491369929272 +3750722974927105168 +9995749965818582729 +12748069930671215306 +21433663624132742 +5198803530374459398 +13322565243915621309 +6992030253977248959 +5240846595623881868 +14105033447215934243 +13069424254661316548 +15287141209812833887 +1328088233508559343 +8386818981010026147 +11196428841856484189 +8406163815338679758 +5967447917778832244 +18043785742712509192 +12743882002561631754 +17377223576551892163 +18366473155322333577 +6439646011077774290 +15383811409788483097 +647654602099666989 +1950279995150446391 +15728759896146255273 +8959988790532128451 +2625039594491876613 +14857096493510912660 +1252168771930235790 +5458848651586451670 +9511403269814042874 +2625321585099869531 +6044165609318992941 +12850101806785958926 +4502324021619918399 +1777227698684564560 +9216135162625932030 +6041909495293491733 +7246879094820520013 +4195293343407762191 +3709150372114150344 +18331345621169647 +15288833278135765839 +1203609471854912768 +9870724568648556 +11949535972653271176 +5304739198157532096 +9870724676284249 +223556471268 +2843361226522040704 +21433698018140379 +16844544045322217845 +13500652 +15289115294538152991 +13147027133105656413 +5881302572399614979 +369725948316 +1873618381558920762 +8910110154532664955 +7268009968829878685 +2031879163504970027 +1414738734636227086 +11007456247132006280 +18411699906768535578 +9870724631654102 +9403591670014227929 +16097636049106512569 +4934147624042828816 +12517749605344219251 +811402123 +2520707475493369815 +15287141196915035634 +17960553538223748849 +5993604058717966549 +15770404803098461468 +4228630217817078930 +3707241383328558670 +9870724587023964 +1368965173581925675 +12448397875904335091 +31304250616125145 +3493083035910933027 +23407838631172865 +2624757565191706895 +17013740960873194156 +5942328186188203485 +1803322457346497719 +1873618519132478597 +9174086388610721809 +1624918240561681987 +8053906304528297123 +1156779955689757418 +2625039581594065532 +13513612221106363942 +9759732344438736725 +8424561207639690808 +1788898246588569124 +5194855147004050764 +14426056237756189706 +4268269652082116993 +10241156380279780233 +4603566563091883113 +11311918831493920830 +4291298466486107087 +1780963011035744062 +451411772583 +16270286698862743767 +14947101497580378 +12063684487233747554 +17935692048408596670 +5780604337176709161 +13356775724777611061 +13886301484332366104 +12918763867246778748 +935489360093069188 +7340769052744554102 +13663608723274679440 +9135138120990860925 +3652299379246765181 +11077353883404275839 +5123125151186169390 +4449074111655457343 +8793606454115247540 +1873618368661104547 +14480706134748776318 +15786289415696313003 +6366353527349383718 +3919395029867042293 +17595811302774678856 +18161641425241527966 +12214133062914871704 +14546547440901043959 +18290600291679871635 +878291224790251502 +9870724668354384 +6762177167581392787 +15288269301217498962 +6202689002271028488 +17951052289351761620 +5304739129372005906 +830117592878312184 +13679090983033849899 +5570718 +2722209420655599317 +15291089469545213394 +13819048784648354 +3666742335828480523 +12016961784973248475 +15290243342952896183 +13118393500344130371 +6152225744495577231 +6436612627583880205 +1873618312773389603 +1255270960958039604 +7595769061852008229 +6829854314988124363 +9870724623724199 +4029075855889210079 +1717145660605818938 +3600741460221310913 +1043117275727351399 +3019470435717963124 +7294584453512443049 +7645347347796285824 +9529635637273782019 +5461104787108142286 +11911785394654831522 +7377560999235175492 +987893190755829685 +68551110 +7573538209084300085 +5459935770831763734 +9870724579085449 +9870725054164933 +9227878689908221236 +18413109971585663048 +21997588951156739 +27356089763897908 +18331367117366891 +11884431389557002272 +23125779237654825 +17351919677054730087 +1410790492101895818 +10743316419472809416 +1191116189218071283 +1747004031218566098 +1873618450346936800 +9885582925391817879 +2553424187287811550 +5248258818184404955 +17723158096939849940 +23920969 +1801912353835932159 +16445524565657926454 +17858283895549410928 +7397691553291585285 +9442785367033145113 +5779476207078612204 +11856981308108841034 +10162212535132624437 +23407722553828187 +58095843265703020 +17625228089634003792 +5579015431972283625 +8197562920226741543 +17531069790818612174 +1873618403055131302 +7395266559825294151 +4452051070527739472 +15102633365988183834 +15078155758602821287 +821822415 +4661227783988316231 +6671286404421658767 +3599895423910751112 +6049123076685500705 +1122939678162437467 +7513097048729857993 +18150567652128338723 +3001971585049045434 +12772870734931498836 +15292781516370689314 +17989125776529297428 +18362271882252341840 +15287141218411224324 +13105026261602754272 +5169146061284970642 +669582195 +12769025487284210679 +2840809200344841826 +20587691799702214 +5888796302811270750 +16403337826733730155 +14782687056266798493 +13819035886831747 +10591325139069898507 +4452458274095703823 +7418593764258038700 +4237766484231541290 +17787115109969112985 +13968724050119231192 +14588005881871935115 +223732767411753551 +1943289737916080925 +8752329828693399742 +2625321593698257851 +9085403929909877633 +373011217939051324 +830117524092770881 +11597430504399393104 +14254502550571402315 +1468270630909273806 +10701168386933022578 +10542040581762995986 +279446698926 +105251406 +17123406249941479296 +1732546186288048475 +5124918939365818423 +3636680783074309259 +3489775507215684756 +6483565209768376281 +16268501676704156156 +1255270892172503150 +232154863071 +6797034166946582466 +17954672406052483731 +16988750789099345015 +60621205 +4506554284856848309 +13297435684634051976 +5737752820656328175 +5625593289148533238 +9870724571164155 +1786642098171564870 +5148570486540950658 +17206111748367333708 +3695202118163649419 +15293063541372707980 +4481840936535989680 +9870725369065582 +15991050 +9950019064427710530 +13912241950506556851 +1726130217707119305 +2607001601160665340 +15287423196121411187 +10767791215706061475 +14618188106505525821 +1808894516123993997 +6179473259481994769 +12410654537281528880 +9870724634133044 +17625228020848466252 +322436619414 +14284004833163944863 +2624757573790089331 +14593427669827589307 +11075097734987253589 +1836789870696543402 +15291089443749579202 +3599049430590104071 +1873618334269589856 +15745101183391522911 +16858178479776553444 +1873618527730862181 +3542979266318128101 +1145668913309099707 +7802916584145630901 +1200046897482707182 +11995964232607543556 +10516680436458395377 +4583174912438124332 +2622783716920071416 +2625039590192454208 +14915332313250075354 +12020690515259835066 +9863670592665100925 +313840698753 +1873619022126983623 +2625321580800446453 +15060886932490820657 +1983843766236895837 +17588650135997473183 +12668812598284862433 +32432320527074663 +11724236875095159845 +13787094270562147765 +21997563155519525 +435378996542319876 +13439045562453801515 +5532932791479705496 +219257046468 +11844132458475177238 +2148672279939257436 +2573163330984550809 +18411417886066737167 +4947704488212260659 +6044165549131839033 +1873618377259506490 +3764334357959809380 +17352530741077947018 +572392279 +6943478024618387198 +15292781537866886661 +16253215886083360174 +5164964909743172335 +9870724715474783 +1732546117502518595 +872411720930700375 +7730749911729375728 +5371825572388218584 +3845866828150881351 +4662073803102881076 +17990638739726996054 +4074350515307087985 +15282055699228796108 +356830630887 +9409295256684857617 +4742067599801215719 +1815161925519812355 +4397798273518472097 +4408361145807279572 +6589811821595414255 +10392730275106281647 +2691365739791454645 +2624757560892279898 +6780068445184411404 +1873618321371780270 +3971798925015914220 +17885450446377521457 +312230761085945505 +15291089430851774680 +1893423955997844389 +3489729412241382725 +11842965961515801342 +8061124 +6204347623242078713 +5302200977449163627 +8854886129749066875 +1289112916384173599 +3775072285107036312 +9870725101285391 +5991347884505304103 +11978837795286960391 +9870724626214596 +12332399388406460126 +805962615 +15291935501556330944 +10275863795921806690 +14665080795768773 +12987787523269740512 +109676682758466278 +14343856351853829979 +7239351853822514603 +15292217492164323694 +6270532813273122711 +1873618458945324208 +29330140097699262 +546112310 +1774151540290709442 +447112353519 +17062770692051186891 +6097847738827018602 +2446394423 +71041511 +5780604332877294488 +1977945944815200441 +16892159766155701840 +1841584166739462850 +4127600472562141528 +1838629547509769774 +5611336678769901619 +16377539657155568218 +8935535651359431595 +3899940802756897765 +13515158333216991695 +12376984968939518126 +1318209973524589712 +5163836826936896467 +9374458755688828226 +9870725379485854 +11353495994446520231 +15292781524969078823 +2146416178810333443 +4580640756537771629 +3476065922086222650 +7190935748309441865 +12601357298570564354 +1784668022044650256 +15223822213093283939 +1963429840917577628 +5337229690844636253 +15291089465245773684 +13819044485223341 +6846568028972915233 +5938943985057016221 +1986666427421953426 +9413007478785859015 +197001895 +10227611240237505072 +17415379285319952477 +8629185870477397806 +7086038682136098143 +1873618501935247881 +17143499116244645951 +3919394969679893392 +18412827950883864637 +10612509452422300098 +15861066529396107080 +3748082399607395221 +4522443956382864343 +2011949215506761725 +12921020019962763688 +15288269241030368076 +1251322662534729443 +152371807 +10532987970627045461 +1411918484627671073 +14369757693900689585 +14319322709146018878 +6219166796281763120 +13088377121872301726 +7093479009436067293 +12061796533289903355 +3665614278816111038 +7419439770474783349 +1317733333 +9185851942203036604 +13059312550143204681 +18331556279224644 +12810241854781339686 +3545799507727835440 +5141454990908001772 +14464888480988739772 +16874702537456224943 +15289115311734942588 +15290243428935229660 +17670190242069503758 +1329348703615391729 +9870726993637673 +11939363345221103299 +17151619313115093425 +7084316931154455957 +1043399231942579166 +9870724725895058 +5516892844697260264 +15290525445337585828 +6815326486865723924 +4022228666655184079 +1521238580360338781 +7070680818924347802 +10601499724812998397 +4292144519993437564 +63111604 +18056021758499837700 +15293909629271559865 +538182415 +3595101200952332996 +9870724573654527 +15910819292402564133 +14809741919954168533 +5997425888291401088 +23971751059142500 +1147642972238782656 +1454041666728626384 +7717191086162907247 +7877020788540264856 +15293627556981466438 +15291089452347970834 +16893176914261927720 +6011408714502659049 +1873618536329269004 +30740204914804024 +9440398924256582504 +6958123848205409670 +5496092094718744306 +11876351523621314951 +829835503390962960 +6666489622904311915 +9300102029053467867 +18157608498967830349 +322439100557 +14997983108320944395 +5303047078245827995 +2625321589398833886 +5533162748479418288 +13710077672074463132 +546966169530360838 +10594427319500549767 +12249869020278044862 +3704985230612113101 +4541910480122227459 +17171040667384553374 +15294191589786195129 +2525663005131298798 +4959080487580687720 +905701329305357348 +11697128807632540856 +15293063592961002078 +227855438117 +4581098893827452794 +7048799098276438100 +15290807478935501913 +18101863374136745348 +10481420442142795147 +6733292533464906829 +13248972067712156734 +17289282588136465240 +11040187342788369288 +2146416200306528455 +14598969665644812357 +15292781546465290377 +1144540847697118382 +15210098741008475851 +15289397315239488341 +45398647160839775 +16594184992388434350 +3235563331419065207 +18331487493701097 +7982583793721959605 +3597395118854313646 +12891075652320236430 +15294191680067940614 +9001701177466488459 +9244670024026101953 +3080975449913307894 +13726068525522684375 +5248105074164044965 +15290243360149689569 +2661960728632185210 +881393353630893177 +2221414353249835888 +451192258981599052 +1413046631920066170 +2624757569490670764 +15291089439450147591 +17939033630403662240 +3554388240579364748 +4995529639851944705 +3759645248383640549 +6812506322838687192 +14332904734139158344 +270697233107261891 +18178176032572004671 +15290525376552049297 +16592324700377915015 +637862761 +6052331366806199141 +2390363305267055068 +7432602967203907143 +9870724565724646 +9357846880189036041 +17970810742252067399 +5722409893636163959 +8912366315847026281 +309541285279 +12641894410681987027 +9936010144048631653 +15804734090088421190 +10225919154718574351 +17208585699695140378 +8223265189353624549 +10551496 +6152225705804649322 +4112704763271605646 +16321209561971495727 +9284429671513599203 +14288223617384594559 +1873618467543725574 +8872404173975872687 +7026070059989940932 +3757107087862401328 +9238115968646659766 +18113886812457616422 +10749611060945308630 +6045857724930788795 +18136473064919741781 +17952771218760996037 +15967564293481176404 +11911353550167017696 +3690475704146410991 +7406761759861257441 +13108405724425311321 +654876144556927138 +17572705310714187168 +3758799212073074688 +8712654422587494510 +2692626423892761474 +12689160128032616538 +11299491706080416482 +6262673798362501819 +12931665209780487678 +15287141235608013499 +9870724584067263 +16608774884222588289 +6154199846417679345 +1124690646272470380 +1183641060959084185 +9193038141925773210 +1996893529057865513 +16567374854657149772 +17955731434090942324 +14152551158828787749 +10911952793442192048 +8987866256879807823 +2782533498403046575 +15290807410149955253 +2624475540190485705 +17364662051350853006 +8664755185414837316 +9870725381976244 +1836789900791143682 +15120308795588242411 +3910652327921846506 +12644080653952551280 +10073651711872150634 +11892563532966418466 +11666939698674012508 +13940397499392475756 +360260104205317870 +6616724738934191142 +1943289755112858775 +10845610678628936991 +4452740307694870388 +11950663969479279738 +5252208937337102483 +6062811641773378321 +2669883121337376726 +6060555527747889010 +9714213900971354835 +7016310497406234704 +553502027104595169 +9549673330465268988 +3275515734983458658 +7197031008673098271 +16340493341965880015 +3648351106617384790 +11380495470737893139 +10882226880706975040 +15292217487864895277 +18012437175892397451 +9610711886643153347 +5561348123192067576 +9195226522645970531 +2203317337383576547 +4408861808311732424 +12388813793526560205 +31304332299023020 +15236272502867507458 +5300810506424882321 +11301006809185657250 +12975397956847037716 +16393709707950253703 +5580167167356980091 +11917150608697025323 +2789363547278219380 +14916423074418074232 +3729679701517144409 +7401639795826693611 +15291935441369177217 +5887104182899575287 +4278256712 +10114691898813265138 +2621553 +3008657884777497814 +4979381721411440255 +6181633645920142455 +15475002888547338265 +7030300301730665584 +4074350545401693244 +18613499597899737 +4079990843361137143 +12876872215120462875 +6402191896111696660 +7804775994185095034 +17011915733784398286 +14337503240805291380 +18412545930182066226 +17689646148640054987 +1873618544927656871 +16844726366016705790 +21997636240042380 +1884114807036983796 +9870724576144923 +17968144200870880777 +1706034183 +1125314915933235152 +5272120000921866956 +4287350254045103750 +2625321597997222413 +16744441422828161415 +19177532402635364 +11706805043137558584 +15287987246122933248 +10184983752153568805 +11866314855975426231 +9745666689313747760 +8093487914352585720 +4728424801765107648 +12060104477863063655 +1413046597528541417 +2691780374684392378 +6176793320558582496 +9429532903146080853 +13096880850319844253 +9525028417658891342 +818873277 +8250205168748149420 +3225407694708957266 +15292217474967096749 +12344076903517864736 +5784522635265967958 +13166364162431525545 +236453827929 +3115088211497395894 +1023278102017432520 +2220004284133281810 +6251387289329549098 +1873618441748091808 +7481181112110377013 +1596798666559279433 +8503320935776595512 +1944417803527600642 +11302721156401415422 +1517290337824763063 +7731987298600764654 +3547491554555814729 +15290243424635805855 +10667162361920506106 +16757552527981219651 +2108397809554513238 +11886618259302000081 +13526321820705763655 +8231778572020497662 +15793124911092261 +828707437778977108 +13947797851620463628 +8551191639545231234 +14426668629872893011 +15954401447545490459 +12422839241108435012 +4085390061409360916 +15287141209812376939 +514392806 +8853758085633284195 +13577317620364748423 +1401410958117136587 +9290648316666403481 +5813899559267165928 +3833067707584961850 +17653420728958602692 +1873618338568554236 +326735571426 +17142588721119759321 +8326149882993533674 +5513817389218729740 +15291089448048529865 +2624757578089052166 +3780916436231348958 +92085413687084388 +3315661715940248009 +2215158406913090772 +11718910014443699523 +1256962990588767323 +2625039594491418482 +5445039747279383643 +17793797185333053295 +15290807375758450338 +1840738113231655609 +12932441542189278501 +684134305183500639 +6527914489421776657 +4074350476616163373 +2229804632046437624 +16889046626795394417 +12559272071108586816 +16096632096226300770 +4384825372822496047 +1873618476142107711 +6599737765818675757 +9870724568188981 +6866452100366089543 +5780604350074062990 +6204347584551150605 +11858665861782591981 +17133093094688366386 +16591082850650767510 +15335648018190521987 +16124665067451140483 +1330643932 +6004033488508294668 +17937948248414687457 +21433698017685437 +2541195915421354200 +13041896 +9824275679680867259 +1873618381558467245 +252705225799065272 +2782962599897735296 +13693773735359556808 +6311975556073149467 +16222815465750730651 +9870724631195343 +17639350922210393673 +2623065440980590466 +5697191329765530252 +8531061018971031409 +2449021711964768402 +5501745141036427744 +9714916620294556051 +11364576519499679975 +7751349835071773419 +5741020152366180768 +17415247587990578107 +11227802023223434221 +5686137334704577009 +7139740716347059647 +9870726486847763 +28202057289702193 +1091290920536659415 +3599049421991258448 +7724696083912537378 +1873618519132015281 +15421132922287825077 +10052892219695050035 +779709915707757062 +11681251366039406792 +8386285046382085854 +1197790774858373297 +8196139355654608948 +6062811650371757460 +15680750867527452084 +6272538193942163930 +3704985213414884248 +6337342946992267164 +12615549852244257310 +15082773189987803904 +13886079656139432535 +15741861301866530650 +18168229267880104599 +10040505446818061990 +5969680716718156076 +9416912531774190001 +9870724604915326 +9870725079986158 +11461030838125681872 +13232275560705704341 +9161450958949453571 +13845453869259640741 +9870726137737460 +17586958020383494220 +14820909222157837458 +1043399249139360119 +7007386298569992979 +1041143135113862839 +5557910247962138442 +477658896785282169 +1574770455138422111 +3704703240002431061 +4501637405001072806 +9870724667895628 +2015194113276527971 +3068049046899138601 +5111959 +10163069616355948964 +8176978237591478389 +13819048784185780 +18269625005533110702 +145053285754225842 +8483828720841721486 +2106141661137491384 +15290243342952459617 +14584230921965031229 +15287705238318957532 +6470597267645140619 +13455169279620702550 +9870724623265441 +300939958085 +2206152513327337347 +1614810228552311534 +5357143063213838208 +17330274815424157021 +321142484957147104 +878291168902069563 +10399694839059648330 +10986956829741958584 +2435475427475262665 +12508782032563758510 +17592316336334579281 +9870724578635307 +9870725053706179 +4894813478942037348 +1416430790060893825 +21997588950686073 +1465168476275034814 +4239458647133920727 +245052216050 +1040297124597682590 +6203742652669041747 +7315063482205286802 +9615761822407136114 +1116095528048406128 +14261670016254881709 +9870725376536715 +30458248699119542 +1873618450346477252 +5262882328632649843 +7941786779679006624 +7380690058883176241 +1709856283085515856 +3219385372089203233 +8220694992145763347 +3219350749903932512 +15292781563662053416 +9232147873720377187 +11243723090649876783 +17077757103034286597 +1349355141338383469 +2478999941885869733 +5679882735783208463 +1523684153200482327 +3566940961947213721 +1322843273083501809 +27638024483702949 +11151193448791287763 +341380979977236601 +13069073579652294725 +5720095940072783647 +4396106248186244653 +7211896323698999070 +11152898898405641254 +17782980006090968555 +8083932538096212916 +32432389312159136 +9021496992187491331 +12769025487283770623 +7851156332894489575 +14764657101031880268 +754689218597375368 +2428928028263453025 +16373475007148605895 +15287705225421134827 +860979836469270858 +4452458274095237609 +1793158787543487842 +41812332 +12718336251608304605 +8713782466702828630 +16779606114112202332 +8970693070809082593 +2524775482 +6177363118375897150 +16515461946336436220 +16661576594284500525 +7364953978590802482 +15291371473049309268 +2625321593697799226 +15289115359023818617 +1731418116379129721 +7879019275372550295 +10032515421551276955 +5322697710519586302 +11499872915541208984 +279446243485 +18613585580197092 +10822752763191504223 +7787509824606656407 +9870725090406402 +10869660245044517105 +232154404111 +5783988542606429343 +2018567665663627053 +15292499534361856724 +2912231556061553217 +8650474279445475081 +5881302580997523790 +2073653179955023919 +1873618390156861710 +8502756868579074451 +9870724570679212 +11812496720744823843 +7774096409180069867 +17408884739334742727 +16226199658283088491 +5401056691908075820 +12500215995775668779 +3541851205005098226 +15275296555291860567 +529742740771051534 +15293063541372236648 +24253827651931669 +9193038159122543190 +15532291 +4859767484456778895 +7174351089234045429 +12052265166309777917 +6206453508332796790 +9870724633685742 +9870726058897640 +9870725108756523 +1627738426083195355 +1517290277637614437 +1572796379011503106 +2624757573789631950 +15291089443749122540 +12597874196251632477 +10944945458828956987 +90526560417223745 +1873618527730408843 +3542979266317669433 +1271298201944985276 +13701595356116683915 +14464972181249216782 +7529716633433683725 +683965395648908415 +6508490313918600431 +16418446140666495939 +5579885176747282807 +7938532420313701533 +4450061392452331879 +4078298792234977417 +5578192970854504694 +5903201844931996758 +16112072687360689080 +1146232920319025762 +15609540945289959127 +3872125181825392781 +13383775544570763069 +15281207274226792967 +12685541791068874526 +11305519054433421356 +12062924628993519039 +1873618471842686260 +13852487002647783882 +6879811782694235172 +2779629465371634446 +7887697063845506877 +30458222903507361 +4272690297183477552 +16854527014566439688 +2795970204732186474 +12060668540762400141 +13269698054917013886 +9870727242608949 +17186370630874106258 +15291935458565959602 +571933524 +3597357340772992368 +9614378104176274486 +15292781537866424850 +12200908954393000442 +13776701421853960017 +15287141239906970552 +20869630820169004 +2974323816123992770 +18143793461179472526 +17257283845880874759 +6409817306512437942 +251835195170048744 +18613516794685431 +18182996233199173333 +963414975523795449 +6457156067309135154 +11199980773228349986 +9870724822626231 +10280620561171947315 +14444632933017343252 +9678643295612393674 +1416712772071733367 +1308238820126909505 +3511510786883337179 +4062309504826288263 +17097534094492519343 +9678732647555543334 +15281782717596783791 +11347748985235137792 +159842942 +1575334470747175762 +1873618321371326913 +1948083978070811918 +8378659008420727629 +16114501436340318739 +2676033351739442523 +1103856707237340121 +8021658837514196333 +10344377673806141250 +16855640362244783634 +1873618514832608678 +15289115380520012217 +7602365 +15288269253927725919 +5601007295916619148 +17178370643127781954 +922131805602145219 +9870724625755838 +6181453440329391994 +6954522878053915940 +12109095703577237436 +15291935501555880874 +494403743189 +15288833308229913045 +2332012875764801403 +408189752105253668 +37425365820532653 +14551450938398809714 +17800857886473327711 +11310405428615336748 +1873618458944869076 +13030536866458380196 +29330140097217635 +70582752 +545653553 +4654131488695196595 +16961033954905306114 +8140646021471143544 +1990666252850702464 +13252643833684965224 +8713506781073597102 +10913926882466471303 +21433680820449950 +6836927455243276852 +9870725379027098 +876713268353912120 +15289397341034668211 +3602064475359681206 +5304739172363937080 +7734678113259293802 +1286785605941469268 +9727254702585289070 +1359796670366835121 +372126913394983081 +2718825232421753807 +18412263943873036335 +825887278052168906 +400787775792368292 +8226399347291477663 +3021726519649178437 +15291089465245326995 +1873618355765336477 +5135521567145153479 +15950055708248061677 +12681515288569536764 +15485431947535009619 +2842209283295817913 +1945545860539506577 +6604811737535038467 +1464040410663047065 +11900417579467410869 +875513892762496032 +2504057782315800059 +7596208623840216346 +1784667966156463957 +2625321602296187261 +15293345523383077603 +9341762833708177161 +1251322662534274260 +9776875163555677910 +13712725028290898635 +4149205691847687923 +10011485155807160208 +288044632364 +5354604872598824931 +17270725783305599323 +481505912444 +14735929132254119820 +5994450030542718433 +10421557493394722747 +12281373727635362932 +15493159512336374213 +240752793187 +3225407699007924698 +10644388936944673628 +2482175869093764907 +13071884203512375215 +828425425675576002 +15289115311734476793 +550243203354865310 +5458848612895039989 +16360064261253045824 +8192767926013271548 +3660444556051220001 +8075621789811552447 +7582565111975526978 +9870724725436303 +5245848874158263187 +14002482420025397461 +10808002067170543560 +425618194456 +12796716796845106025 +62652845 +4229718203826509406 +3595101200951877836 +9177782870671167922 +9191903736941789135 +9373330745965357734 +2150364451440035988 +6098975787241332708 +5570022803592198298 +30458188511970924 +12662636664722033563 +28202074486476236 +1985636446265628057 +1873618342867526197 +6874933480867504782 +7995590628516769162 +18260149117431531557 +1873618536328796556 +18022689 +493093586 +7884264785446971246 +6958123848204954771 +1624918257757984830 +1200046906080642067 +7513319905748461913 +848960295932213026 +1451443510660458695 +3488883307144824331 +7040493930667852867 +7178154463761028941 +815924131 +13304414760094803073 +4287350245446269477 +5437607872594055196 +18343389461521525952 +9515351559640519705 +147027456461845616 +12923090951297785479 +11623329650056962133 +4449356175347491962 +18312554758124418276 +2023673399296147584 +468608091255 +1691478437133292202 +13939914291973666343 +15287987228928195349 +18413674008690163805 +12851509922494416016 +5085143808375860190 +1041707215208733915 +27920126868408668 +7676326001635166459 +14597841595735882609 +6449296250093785305 +10199563295936960214 +16530489490799745164 +623200902201565595 +14125453851780129689 +933797197191000793 +27356063970318712 +17242404988905478442 +17238920448818956975 +9870724654526222 +14880882624768253234 +3680303762217118270 +5356297009706067526 +18331534785058951 +10242996794244205996 +17362157216814944538 +12024068814560967376 +9538952396691934382 +1309344723 +7401639774330044844 +5566476571519223063 +15287423239113362913 +9568319453201387650 +18163407184810550808 +17942028690448258557 +4074350523905037603 +18111648128641034349 +11190777329810695836 +1891167897862106112 +13543274307735524264 +13634697161079809390 +15229092110096747 +9870724717506415 +7161848749051762610 +2126950250258703774 +2123790068807115218 +15922078936065197096 +10608171886705513220 +29612195191337488 +6606181221268809420 +9870725882867917 +356832656487 +15290525376551593956 +878291186098857803 +11246150232308465623 +16627166760254318579 +2673272213187142611 +17096003496647472124 +9870724565265887 +9870726098088172 +1264102571785731244 +8093487940147758892 +1254706867964438952 +8791093639784847581 +23125796433958238 +6153071832396467338 +412712986376037715 +14270607297526047926 +15288551278928483185 +17050559842468447010 +15420834705366982007 +1873618467543270645 +1256117001567095554 +829767995794997934 +4585539075103464755 +1519546477645413108 +17009624892007847658 +9280734854635476062 +1991460710566616163 +5833854208448542489 +14383042897996876 +4171825745861945121 +1873622693617885233 +4528778414580385833 +17781311580497205633 +16579843686302692854 +8483264718130336579 +6739699622450779293 +5570988786672405753 +73073152 +12435236349789824105 +548143940 +3758799212072603652 +13019802725201498173 +5152193587959184171 +4449356106561951983 +8721125860701199477 +11122905463301675668 +9810233678125339149 +8300395871739655823 +1817202454337169259 +15998697568090670479 +4024766818578801672 +12712806621559934209 +5865324320844370685 +1808499437239288162 +14934625691113444127 +730216019010017829 +7220668476868013644 +9870725381517488 +8455366527925181662 +15855332315905657597 +4204607528756075462 +4287350266942457603 +2625321610894575340 +17128487303121020 +3546645496748597151 +3557733846377899653 +6622268473810839862 +5443255459785281758 +14362448674145788343 +296643025948 +5198803303557629187 +13547746171706492984 +3103808844949034980 +9148242404692995545 +11937155776729718797 +4935588326251713937 +3723926558949199532 +5357989065131181517 +7041904038474902553 +5516046782590617836 +17952462371365197626 +4770547841029572913 +6827279971330573181 +15240725682617399421 +6874698970945956044 +6201941232991219666 +21433723812847698 +10604037919726528007 +1682680391474030809 +2160237676197596019 +1872396753529686363 +20023495626545607 +14882607364446958652 +13327144638523596004 +9870725140017238 +527560919568951902 +14858224533326348264 +15292781567961019436 +8910392170935354895 +6055621791407683385 +11457959405705238195 +8629091087366837723 +3313969578832561394 +15291935441368715580 +8971220120960639888 +2162794 +434216571036 +2107833759553768160 +18411981923171237924 +17740080579981820985 +1522648576391468267 +7562235617919186520 +17104304187076012098 +5246976952665126989 +15287423213317732614 +7003516464553396964 +2120506315221768517 +5710389916955191050 +11198801698632438724 +5461950758931665967 +3481112672057242377 +1873618351465905720 +9896616181508082455 +1626892316687676333 +17997724048351512065 +540214046 +5310072653704533213 +10608849539867486139 +9870724575686165 +15288269284022293410 +16156684754098128751 +4214598676324629374 +9950583114428779661 +70482867666761896 +13228094635257761587 +16031823836168873793 +12171433886629047500 +3649479137836146282 +2625321597996763849 +4945853326040775218 +5251489270997860680 +331037018572 +17946441695893602233 +9870725373587578 +14490988199065491680 +845012130781801795 +931541147651624607 +12397839396927005619 +1873618489039455401 +477206488142 +5300226909920168653 +3755978992157866073 +818414521 +32714354125780742 +11835980833797783985 +3758412351937847937 +6913182737342282629 +7728603114666338390 +6368045612867395386 +15229117900282373 +5831598115919241820 +18108263961901346685 +16116451904130395245 +4900524407327827799 +985637059535129685 +5514354709969504081 +1873618394455820932 +2383852656425574797 +12161761417117700949 +2549492329236335496 +15290807431645702838 +38863202 +5406976140635235214 +2479487385694782915 +18331496091634454 +2000487911911396593 +12667327424519483540 +21151664419314963 +1785796122047226452 +6829731327246887229 +2359415891753526553 +11122727754716749522 +2737644042509096777 +12202286230899024895 +19741436233005841 +17307675940448188190 +17956659416822331889 +3579577413 +8876352377820048300 +9240218570728499595 +14221361191285903605 +6827475239015770930 +1884114794138700522 +1873618532029371358 +8713716078300713011 +8306487687482922741 +886444938757749462 +15290807375757980241 +16311679952720386084 +4300693215162943680 +18413391987988365394 +18061764950907441672 +1413046584630257742 +4828437688977876767 +23407795640359565 +20869691006850631 +712839370036693942 +1873618476141669829 +15288833278134849100 +18350984080067483728 +9870724567730368 +17952180354961578798 +14313388855583266450 +16876908885164897056 +6304430915175607012 +1873618235388541884 +1467988623106075027 +5938217001569427566 +947561152284409222 +12583138 +18010208493826022202 +5831598103021434031 +3040438293561880687 +3861350836756566582 +1041143148011205643 +3453178577183857660 +16335408683566056547 +2730411636852873049 +13708217708636225505 +18331530485643911 +3600741529005943281 +4394978156781136226 +8474440196615580311 +18332726249486956025 +6208295848581203181 +810484612 +9538952392392514433 +9862452567578203827 +4539654331703518282 +5299098844309427097 +9819019095107000790 +3176558324386258344 +9870724586088430 +2204229959906899850 +17859691850682797212 +11640717849549429173 +14866462842593414402 +1576180601638430949 +1873618325670277155 +15568274631689570656 +2676033356038407648 +4090501458954952450 +5545124298656399434 +1873618519131556994 +506004186 +4049902545170867874 +10479338299865448566 +6924604854981829274 +2860415230701019147 +14919763862626719225 +13889891850651122740 +4238330517036600601 +17054458744475489394 +7564330021528214172 +733573627137252898 +6685115190144339564 +15289397401221336700 +15287705195328578110 +2531400574590277189 +1027638212255962530 +5246977017151237789 +7558005371879033601 +1873618463243837950 +1519546473345996430 +2128280999410805477 +12463417266756127924 +22561729236457475 +296645509145 +3723052473697642430 +11381149777473638498 +3350348129897813479 +4301015285267897045 +11204987448696317882 +7882744384220320851 +15287987211730954775 +3004215200300484856 +11339001847360142680 +3038114471257581316 +15901601631935214100 +3172873343893834792 +2284523772570322916 +524354306 +9933890694532382399 +814173546822714932 +6366353527348465645 +16059376742435081718 +15333420168733740958 +9870724667436875 +13521401176293192918 +5097180892292456644 +11665020933738218399 +10606012068937939208 +4653200 +1192315303887243384 +15290243342951996714 +1693374133281707500 +9870724622806683 +18159864630189633047 +4302417954841634009 +2625321606595152102 +339635406848 +13069653027796180234 +14801779263383299372 +67633599 +16357059045846881752 +4448228075343979738 +2435686358393365975 +10957106443808623994 +9870724578175465 +5160665112055666338 +282854078 +5886629261813307955 +17334296795155017143 +245051758004 +95187572621074922 +12000129505823702951 +1873618450346019367 +16633695840000739887 +23003457 +15999543578608100422 +934361277285878381 +847832260416058602 +1517290346422681802 +17626356086458298000 +8508126160654916518 +8238517427652355759 +11437230683233134814 +2547875222314434273 +10991209791798077031 +5579015431971356180 +9782447205960129671 +5356297026902840997 +6209141923583494372 +15292781563661599720 +2672695638434129203 +7562235613619754139 +15287141218410303298 +1252732744548178288 +4075478537927021965 +5754917510345274904 +4447100048425437352 +4844489965106389421 +1880166564500951973 +1251604747722962799 +17504806456181139858 +13865094533357984694 +15987248322570378997 +17202838231355446262 +11119281408074929851 +14508438241108768127 +12171312437261114909 +14090798302164118730 +9384393054003228121 +8070528080642443989 +5921878718459558744 +1575898585234826362 +4716039948972739552 +5015996636573993090 +3911216365026367153 +15290525393748376407 +1200046910379615804 +3490011428644081259 +6361667333054079238 +15541758641581541383 +9870725134574524 +6824655070690553228 +17467452358482684941 +17588650148894357259 +13681696359428851594 +3671173590192573904 +15155739821524723128 +7347235929733680369 +4129856586587984584 +7105928398775276459 +10371546086428711762 +104333894 +15291089400758736311 +16635300419227771930 +2474756861223577256 +746260968648946273 +12268592236069281018 +17899830361464777052 +1873618484740051734 +14269577460254794753 +13076193478088073580 +5183427648261267905 +6206603707174558609 +13946693756345591362 +11043873737714389842 +150480202803719569 +5194291058309402607 +16268501676703231103 +12965462547964580004 +942630908539259521 +15292499534361413490 +10377197347619277484 +4705487070834273879 +1162004929974905417 +11473236644706868921 +12345093809321821391 +2129240136896237806 +9870724570219682 +29894172902760575 +5246976982759708142 +13992119617988728835 +3008657914871621382 +17206111748366405549 +17621268784990000287 +15293063541371783048 +9870727160820019 +14971589244285042214 +7570753539976079512 +15073532 +1284455503083424298 +1245834158110107111 +369727528043 +16491624797135850527 +9870725108281239 +11659718887782234407 +9870724633208878 +10447833892469825143 +861073031813342332 +1873618334268667129 +775311949795778258 +13991391243742241605 +15460913628359699216 +12270241411263107389 +5459976691403131036 +8552934505565809135 +1873618527729947395 +6209141854797957852 +7685426415875206820 +1693170535549584593 +12043852227667183958 +9502022867880074714 +2012231231909482032 +5782296452789312768 +20587670305056387 +11130875047727013522 +313839792447 +1252168767629911019 +1251604678937429701 +937181475705675187 +8251104878595165922 +2527988386249721162 +7137191519510550016 +11108455537719452607 +11439579601193475914 +12103881278437666366 +2787671440263884761 +5296590591744171340 +14101030794582076 +10380606045563348359 +1873618471842226479 +15426482629288462533 +11906248855590275274 +1251886695339813099 +4286273432988095584 +32714336928536111 +15289115337529637168 +17999550790107533784 +2901261320539743401 +1798810182005253326 +5939887919898383659 +16127951378661458014 +31586340103334678 +4988085222084261115 +9870724759187364 +6067323904216224792 +9117550437658669933 +17410350896437664061 +15291935458565503546 +10357637806106626268 +1522648593588246456 +15289679344540004030 +15290807461740291155 +9193446454560896894 +15625750694116682075 +2365056219807569448 +10476515790411361055 +16074403774197679586 +2807316339059480414 +8716602665122146917 +1839046019115124804 +356829709634 +18164535293412010261 +6101795934072354628 +15282910834796608806 +2528483182055202620 +9138963602338286574 +1584595969 +9990082472892847044 +8483488033272054368 +12931814223500743418 +13016629051942660284 +5158972996443383685 +15288269301219070931 +15287141184018793559 +2676033351738984017 +1281295571478014688 +7143606 +2221348088688434892 +19177549598962439 +16089517929515999248 +17164290134860515192 +9870724625297080 +13464164481390611573 +5991347884504386492 +15398488671254292928 +24253711574121236 +1842491240272906857 +15740334337118442611 +10376351324205306716 +5153885660581077371 +3489447339950359677 +4021100618239522549 +15711638307477744317 +16436195824824429803 +10558226819440006879 +1873618458944406678 +2148672314332361804 +18090436408231612679 +1944417820723915216 +70123993 +545194794 +3598203308297566160 +10320637572337377287 +11463316995690665239 +13451263113062537502 +14427726838325064146 +5458525736108307465 +17796820708673072383 +15530271666638163275 +5391068105015970980 +1818166298 +5726925958801597772 +1417558859971389566 +829835572175595475 +4239458599844139107 +4076606663725688271 +5550369740109210280 +5776869636241580630 +3653145419856627967 +14285945429257893560 +5344573059049417899 +7300032638221961681 +5511666277521099409 +10447833913966011707 +15291089465244866520 +5354604928486104195 +10403206179899333708 +3581347250154185742 +18327754833465990515 +1873618549226149856 +111866465377726517 +6812788339241393755 +5516892801706431951 +15287987297713273803 +874667813461571741 +5586100449248425521 +196084388 +9813006656186419950 +15291371481647239176 +3152540403668446487 +15290807392954748797 +12274796319317564568 +11682240327296901934 +10615766825721738112 +3496011030151319021 +1836516380 +16876615841046071902 +2311806284048703049 +15293345523382623264 +4393850086870956774 +1183164095669153000 +10655291933708585535 +4279680362438870161 +288044179770 +9870724661997361 +6908465339653183184 +2171887661434814039 +11500631658516907905 +12477949191893683608 +1796261053954744181 +9301397981180535227 +12804866734470012702 +2928740603217527580 +2625039555800019951 +7029736333412803820 +1197790749064781785 +16987676982182959246 +1873618398754778688 +17781311606292352503 +8421176950619857819 +5887235996162331220 +1628584415103969803 +9375259065463616337 +15680692762684576932 +9870724724977547 +15270402497188411859 +14240769115040137062 +3101506949823539069 +25381953450161739 +5299098861506209736 +62194086 +5198521321546339800 +5510538194714848623 +16073122410785428529 +4651906966372099758 +10155047267998776925 +3876075848434848344 +15057295986472462742 +30458188511514971 +825605274545893892 +6241531040732371129 +5141454935019373063 +2496004068482770324 +19741440531974474 +9349334485489314500 +3597075242686834232 +6163656220451807039 +28202074486017639 +10381427610856195682 +6151097657388981866 +11644549546703853084 +11865750840365754125 +17563932 +8075071877499463322 +17685702531321646143 +7884436482637851716 +4394978118090186822 +9870724635717378 +7410173966093388838 +4145429824889439619 +13226010606693795570 +9471574342993799039 +14633483086300318059 +893597016754166735 +1002618918004871782 +1989768573458923831 +15288269275423461987 +18413110001679335503 +3581077576582568310 +18143576396795039787 +14701580385335131657 +16125685364044024665 +10594427319499622429 +3297425404401232744 +5349660425003808524 +2687173060467045766 +1581464476454432549 +1873618480440611797 +2219722284925988539 +6064503791778736485 +17357088237073868675 +6097847760322301853 +7452748519230229261 +7403331881344706604 +15287987228927726176 +1873618239687516713 +933515180788171804 +5837815401971330854 +2137124098070106849 +1167683055288673474 +5249797155383876509 +4078298744945207940 +14027650583924460649 +2901677928694377463 +13460349110998223202 +2054874474321825123 +17203588249717599613 +8694774372764686238 +18212531493831058629 +7276444590248454309 +16014863264193847863 +4597129739270760585 +11977104894336375465 +502018164104236844 +15292781546464355403 +5400939667408952511 +3935742187522887052 +5835546345556562972 +13983903436451111409 +9248819860142430144 +12323079225200022370 +14460196276836836204 +365428082633 +15292499474174252020 +15294191680067032781 +16060663868037025393 +11319642457612359004 +12450653994227871939 +17635684622993004052 +21997662034740336 +2320966141234075815 +1873618329969240407 +9870724717047659 +8500218703757992945 +2573543610120747362 +3109223125292309569 +9630003881633916927 +3608374765082259664 +8889230321129230008 +13748270104068380443 +9203109954870332533 +15290525376551146555 +16457060609338067393 +161874570 +698165752660237789 +15411228461394451899 +9870724672417622 +13819010092772611 +12245972163505972616 +3398151194196524568 +6265506917674477684 +805679481430155815 +3415946130097519757 +2556770708356015224 +18328169869746329928 +11672220357238744348 +5628018632356291500 +17424331172825998631 +32714379920951209 +8122508159220259897 +2539503902986489857 +14101026495157099 +1873618467542803945 +2995297343137731978 +13297153724119725427 +15525540822578436283 +6404192671754176089 +3968978700802083530 +5198239326640152908 +12247781674335742890 +9385515070197615006 +7406761759860329997 +5728764487729042195 +8386536990401903148 +19177455017806524 +1251040710617545413 +1092693155076331411 +15289397349632583663 +21715753112570631 +8299267801830737045 +4166190382674173655 +6262673798361580735 +8461230827060608330 +2044349384238508021 +15287423226215073909 +2324661969940922728 +6653120774337159248 +1357540564939267531 +3706395295428323217 +12065959035826692562 +1873618364363258217 +352530293317 +9870725381058731 +15819605076376167447 +1413892590848258336 +15289397293744856242 +4450202177266079407 +5745004228812346905 +5778348197355914873 +15524056368343439558 +18271552455813385351 +5551497810020144098 +1067921956322684869 +32996413518841137 +2523959977877778216 +7576076365307645650 +8864982516290625762 +12749251324732838831 +5996988225456246061 +17925617714761656186 +2625321610894116800 +9512531412808567772 +9566909396982184558 +23407821435508343 +8759785668822383754 +1873618501936825331 +11977864089922068399 +249849483538007723 +2202768277804176333 +1788616212990552335 +1464040363373259653 +962402734361961130 +1194167359230732945 +15992175662002017897 +7318928098821086667 +8694008256860067911 +10530167802300925091 +1788898229392915970 +14007593402781945554 +153944682 +3189738338525529817 +16881139139804209394 +6747478875779044116 +1575334556729039364 +13005486433000900249 +11248024162254332812 +6954815909998510645 +101405088373681487 +5567604589840172352 +5137506705381611594 +3810513857158605524 +15291935441368272855 +13532842988028448493 +2623347457383283860 +5996142189145707162 +3008657884776564221 +4814616572851874948 +2332993943266087343 +15167687298960071093 +1368312660932304056 +1518418412034221171 +13089504328427068224 +3972260889842303141 +15287705277011475681 +1899651045998075534 +10370729796382049548 +11862355620116959851 +1873618351465454995 +4183106513747975357 +16206572794655018777 +6151097665987347595 +1964966944 +14282671233461718187 +14735681684957108581 +8912304245417456675 +4262393995373538690 +11344414726101221726 +9511403330002294840 +1502804306755411933 +9870724575227407 +2104167602206888291 +3968978778185994528 +4997369339010881481 +10640060419764856607 +12361766690509312183 +3895628516440365091 +9870725373128822 +283744734959 +5995296152835133448 +4996002263590310647 +9128213117780706302 +17422075106091075868 +3808100862305528120 +9729444457185022138 +8503320935775669540 +13784303663910239941 +17736403321834007944 +15288269228134118536 +13687043876405978667 +5831598115918776853 +3884829281456430465 +13626565541769404786 +14398145622438723636 +15291935475762280911 +16043006346467095681 +9870725068648405 +27356072568238439 +15769828118059749956 +5907010115722427445 +1413046541639892255 +20869648016491818 +6847978093791634084 +1982143551242846314 +3492267589958459037 +11076095979391437558 +16378639349584391316 +421318312068 +2877868386743177151 +2000487911910945045 +1839046036311913108 +6100103900141742543 +3190243207268414933 +15456401331524408557 +20023667593655051 +1275246500367387295 +23407658066328590 +15697667865067147070 +1873618338567628509 +1029093624509175620 +5356296962416257804 +18412827980977537092 +24535801060994513 +10811950326901201704 +3080411395612691343 +3342608342736257242 +4706581101402996566 +28766150283183290 +17185961547367584577 +3491703471172619422 +9890718886864439550 +4023356749461794195 +2926597302484617679 +1254706876562367285 +3881727131120386385 +8222739834920308976 +18424247431471827427 +15521592592940681917 +12369348434015894595 +18313170975766616069 +4975041133675044864 +18331586372911557 +5995296139937321392 +9870724567271440 +9005649368412405902 +14101035093548169 +5875369286209378922 +7932116234800667341 +17874919538333468531 +18430745393540238720 +11657462747962350608 +1873618235388082381 +5898256648308074302 +1508117076984554542 +23689812042258852 +3609094385226180038 +15598545835235896553 +15122676476569913436 +11063795143821695535 +1546925423577153293 +17087641456366598521 +14295096835833094196 +12124379 +18364433819292019234 +14383051495925741 +880547325917796999 +6313103552897421927 +15513121778946889526 +10369289955208480360 +11859253456883111246 +6178399515959760738 +3665614253022074990 +13209471093094955030 +15327427542729052699 +8648103698601818152 +17948543784312914609 +6367324841362000185 +5304739189560259896 +4076606680922461683 +12275078262634991095 +9528906357853986687 +15293909659365234709 +810025856 +37854772483079099 +16276789369746905904 +1256116954277302592 +9538952392392067585 +5299098844308986584 +9714916620293637762 +3565993066884130683 +6119257085165849643 +5192881006389626514 +14154364749179472304 +9870726378320141 +10729274869808064528 +11937069779717876532 +15290243355849347529 +12569464285503175501 +5890488379732937666 +9002294370558361359 +9870724585647699 +5509410206486767215 +6604811754731355144 +7723302382736449605 +2146416140118468724 +5371408676581039755 +2676033356037948725 +2992195201400050078 +12920438568781094160 +9870725383549117 +2999903426787762406 +15291089426553920468 +5251489245201783703 +15116355218574752982 +15576486110068357897 +14319322726341872694 +3523793819354604317 +8611086590374322987 +9515351542442823702 +743599530638584200 +6818097810163722661 +6337342946991349381 +3493131337076923485 +15291371442956299547 +7676326031729298383 +11739356363550636352 +3481832755205449325 +3127312818991737807 +3431825179470471963 +9870724603997820 +18175360344887353999 +9870725079068649 +11858125374076832016 +2195247887786910877 +27638084672424186 +1043399249138445524 +7660072835933880424 +4428349248203136825 +7785807333642228489 +3542979348000086324 +2925174856428167067 +1413046563136100705 +8990319004230708245 +5841774667923476088 +12126967088853309091 +28484163972914115 +11131339476000724429 +15291935449966651492 +7984280505607084247 +1148763750796122646 +16118290484606480332 +14513633516116583262 +11084138473134491150 +9870724666978116 +11129193728552745983 +1574770455137500480 +12772641161582545873 +13853164599648329805 +5160947085467667211 +7560543446418736093 +17105458968818117677 +28202091682814579 +5193163057186017280 +145053285753312301 +12611531837023406214 +4194441 +15231165731766495456 +5354604932785051691 +12919891954352349915 +6157302026847398879 +128040758999206437 +17284656215747940191 +667834752649020290 +15096032016463431129 +5092441468690770633 +5297722299928240259 +14267039342724252928 +4766599598493545337 +2364851878346974596 +1693561394611823497 +5248105048369992134 +9870724577695189 +13802551532558438689 +12288919130397748262 +3308118261904646304 +13721318416648587430 +1873618497637398979 +10608171860911929039 +1995983940538747530 +1410790492100501364 +14879852489931824877 +17700768987284250366 +1465168476274112730 +933515197984937912 +17665479438249908243 +24817757277471676 +1040297124596769174 +8262357255499890072 +13824576674685406716 +9559615987485529152 +17058406969813381502 +15140097999495498431 +2625039560098984145 +7887979080248217348 +5303047039553965447 +4290422939243320571 +1996539682273172421 +18064302014949692195 +17405847196410326333 +15292217474968658508 +1201738991599905384 +15292781563661138827 +12895405287573838128 +4713167435525210945 +1573642372331230163 +12737110686819632543 +1117193754934917478 +18002371010021839860 +6755042822933341398 +17461812116410492428 +16846695548643709433 +9519529920006076844 +15289961386737559917 +1842430228844254420 +17954056163339804514 +15290243377345538721 +21433663625238360 +5638800197448387520 +5144036706252955236 +1785240333023004697 +17378823037334152210 +12118995007347033900 +1198918767384465237 +1873618540627312312 +515965674 +13512484172692724483 +1842148156554158522 +1122152515844921155 +1623790144856210076 +21715680027609308 +15897908900500866947 +256115374 +4654977494912738211 +4069792311750431833 +11871755854141803594 +11343333327046715464 +12698591837734586216 +303886330487979048 +3648351136711063481 +11918973787416958717 +2359415844463731100 +15291935527350592104 +5885297337779773131 +1464040393467836841 +103875135 +578945889 +4066210227668666775 +5916966303756852786 +14647867937879429707 +8773391357768130744 +5515200686092457011 +4123430813947412857 +3268239167290234893 +3493395603981665996 +9434267504452904782 +7700859386958983577 +5533048425600462150 +1873618243986479700 +14383060094314497 +7061324217198909230 +2678289775302688782 +12607290584762229341 +5637072609524124450 +5688992925586899911 +10914208898869168291 +15161742732970896031 +9870724569761068 +8294669686619703163 +18036023682942002445 +12362570276035975936 +9870724677398363 +417018879858 +3232498753 +3055128297542931079 +1410790423314977702 +9193038159121622476 +7806125477758378199 +14614773 +3056459253786569742 +16577617590021068731 +369727052750 +12912667315151788711 +18412545960275738681 +8249591958531218834 +9870725107823365 +18895546093939766 +6101795946969716806 +3905480084311659711 +5153885729366158535 +4449074077262565538 +812516243 +18044067802105917305 +11183855665341140449 +14847109066750388878 +6155045934318095559 +4542487066964600780 +2131496268116805341 +7146202988317988190 +7784244409686712653 +1041425117123784853 +17822868562129018393 +4450061392451429988 +9183609363595210442 +8717448701432259589 +5991347897401741770 +13819014391738817 +3435917027951338122 +6113028127645120566 +15288833321126801563 +4129856573689694799 +17575525539227654904 +12800702288147065431 +11799030747492325425 +12569695609956274211 +308468588452912862 +1945545830446489872 +15292217505060775909 +2306165990386983525 +5872638509966829226 +1988922584437243934 +846704164711513500 +1873618471841763870 +14101030794120274 +8294888080286306497 +9870725126189124 +15289115337529172389 +11378177027593806036 +5831598146013367591 +8207049249448941323 +4277348121211061206 +1682680408670366182 +8697674521685010161 +5364347251694003497 +14347799742465860119 +17909559707891872430 +13307798926833551183 +4921857766629381818 +9870726291550466 +8261953394296631904 +14394429933690565072 +17588650080108353268 +15957853835287077325 +15291935458565044797 +95945236 +13982868562968269922 +9870725081559031 +10971700108384153387 +883085452046262607 +15287141239906048386 +9305858029919208637 +5197393230141203312 +6551820931751497869 +1254668688967820538 +9870724714098524 +14498644579613827628 +103179363763488430 +31304293607146613 +3062555758590845492 +11966469445775088618 +3216310690166285352 +24535878447415299 +12448397918895345267 +1873618368662231373 +356829246563 +88690214933583825 +9206049416896323154 +1873618493345916033 +16434259411671998476 +17089062574695332658 +6364097366033183066 +6684847 +6020446389058087249 +3603465177996480530 +5245848942942891745 +1817732079526156439 +881393336435238960 +15451632658215101101 +6978558302127657421 +17600557245052438857 +5177513308798003449 +9257009389331494395 +5153885660580611393 +15964860133879204600 +4629567379896162765 +6368045630063709703 +15292499555857146513 +15633277994269422939 +69665238 +544736038 +16649797224948896072 +11423179059739316736 +2625039568697370180 +9870725055279054 +28202143271093720 +2207210695286917386 +11910386680860055402 +2057875046416341853 +11830742842443701572 +9870724580187096 +6410073205273205767 +12261219845299185686 +340412865724573691 +14696408979092361262 +17279695936641176174 +9336987527844929891 +10577967338929928434 +10913926882465549337 +2292825785040636736 +15289397341033733961 +25035091 +17515402600154164149 +8856014216854636141 +17575525470442101346 +5299098874403555921 +8988344939515883266 +12375010918606839624 +6246188877658208873 +12714140372012391109 +1731982088997070430 +12770186260766338838 +3323445275731759491 +12480382703020105917 +102051233665390410 +825887278051247231 +10952503966979398876 +1517290299132896716 +14808495226400952373 +1575334505140282526 +9866850803649177322 +17177069327928414345 +15215179494928287321 +12431659849778813034 +3810030574638220803 +4828955760075290532 +563086155 +15422169371038721618 +8243595443602667440 +6155045908522469290 +16404747968933421847 +10637706218149207920 +12821325162865580591 +15287141171120512786 +12985842620643895548 +2008324218353228241 +16204741244690784525 +15290807392954295047 +8238091506283862083 +10894765727974243920 +13682442460564308481 +11427597672493879401 +15287705225422709536 +4687824774223042967 +518456056 +724667011080929187 +7612019564176302853 +17154997177014702929 +16377907316977456089 +1042835272222654543 +2205024383230807879 +288043704912 +15288833295331175167 +16254908014593330290 +9870724661538604 +1873618493337968671 +6329310123471477159 +9575662890191707873 +5570706796064763298 +14000973486384890906 +11076891475999675409 +2625039555799560465 +3650607203447232311 +279447822690 +5782296371105503917 +6041909456601175922 +15289397375427749290 +9570985786226330892 +14776830432800888973 +4290452361391118252 +10371546039138928886 +18172096623373846790 +664770317550639977 +11974217323296927124 +16272167851247214770 +61735328 +14947075703063340 +6571996857207775134 +6446727831346960020 +7024942058865635035 +5058465021028538884 +3541851205006661496 +1093547051758001101 +2886556384174223009 +968496635821779469 +331033634720 +13217980679449939250 +1414738695943890555 +12103608816008839642 +492176077 +17105177 +30740204913432772 +9625506792066529630 +12209625250763002259 +7526907729180513713 +6725186916720843613 +6293435863276992084 +9870724635245008 +7703763868330518920 +13370939011252236052 +5837251394960512824 +254606299090610779 +10233718743719545342 +1731418112078799780 +9686605439907420275 +850596550537794454 +3636571292134085458 +7058976945723481865 +14101039392508624 +15287987228927269458 +20305632407272463 +3682767152562457987 +14046027923586223423 +5168538779687134501 +7535287459680629285 +1731136039788687417 +6689628974207875568 +1956288376179939253 +7132172416165372703 +6829167358929035290 +12827636231990301981 +6117295360757941334 +4451323545700405949 +1996539712367763784 +14383055794878875 +3541851247996589955 +12318365723907459763 +11949535968354966569 +4351557608409556397 +17087923524359770181 +9009022494402690689 +7239069828821632004 +12237654311378360581 +15292217457771425298 +21997756617932578 +8527958829943117555 +6322334160684848931 +98435620 +2344673137987642231 +16628340694136406464 +5744236492394808867 +15292499474173809525 +3018298531592738116 +3652299340554453283 +7595953279435999504 +15287705255514820663 +9870726984331559 +9870724608978575 +9870724716588902 +11572804788779487083 +10906583479868327250 +11818157132458100908 +2573543610120276856 +3862478902367620470 +18079002677793150784 +11704575149126332350 +10956724774926813288 +11461539228058211933 +6994666403407274928 +15831401131450128206 +161415815 +5741055947585816645 +15688212475568267368 +17648172293253323053 +31243219716159971 +1323575988261440172 +16409823229268203512 +4393850108366709734 +4013043832091579983 +13851254574720705106 +12167502394355566378 +13819010092311417 +15093211856736637499 +1636787949454119440 +8854892867934441693 +10296839827164892306 +329624680433339659 +1801847830 +16938953305224077568 +196067631845350968 +17636993876762780387 +32714379920475611 +4500349962688407547 +16089505907859940395 +12965462578058694440 +4399490397730263735 +15457106048138097586 +2399325703848471025 +7034510074967320660 +5728050182998344941 +16522582727952309522 +4449074163244874496 +12500216025869324855 +15289397349632139392 +15690867497329059533 +72155640 +1416430751369015914 +8340515885408198954 +7241607920557319056 +155863925042275590 +206360351549 +7988194205078459495 +6057461422984880635 +5692765500615846248 +14665622013520788568 +3237330832107509147 +1201174898606751637 +6151097678884704848 +1873618364362797809 +22279760122497864 +17466322838137297461 +3861350819561347386 +17345010118786555352 +10700535707997253239 +11082860798947177794 +16676907976779847674 +4289606355172670101 +13193833999799117075 +2005594480578020905 +21715697224403927 +15289397293744393060 +7418593781453437537 +1732546104605807972 +14971929132800683857 +15290807401552693071 +5996142146155323568 +6276846228475434773 +6155045917120857525 +7891322107040185144 +1980635170485128877 +9799212782495687746 +5991347927496329957 +3484420089198031970 +7410122261657174803 +90505732 +18062046967310140521 +8405295912409566731 +1091290903341000716 +15292217535155360072 +15016451663009507957 +7197556598095885551 +5592392921167110687 +6639116847414064690 +1283692271244348427 +2232150464650106167 +1730937871 +9870725183729755 +322394392196175258 +6795000521538423800 +1788616212990082765 +1873618501936351339 +17952462371364276975 +1042835233529217026 +2625039564397948278 +12612941919037312065 +45875581 +153485925 +2601924029971176991 +8156858663174558033 +4634990085322976079 +9788151191380841872 +3653991395979581907 +16485145185525783241 +8840711497449476701 +15291935488659645179 +97657756776031703 +16981093940147602975 +1522648623682370475 +14097513009910471722 +1574206439528279133 +8344857136586045859 +2834720242980699012 +15292781567960094189 +3812049113439014303 +7257145821827573231 +11184417804925417432 +3364340290828178817 +4631616963835214099 +11233051360444553064 +6872163030320507733 +16913120591335478988 +13064791643241136895 +244362261851235702 +9870724727009178 +5141454943617292671 +17455868238103916892 +17540067799862824743 +1873618351464989804 +16382818492672130234 +13282877394204650687 +15580874172203795679 +23407864424968763 +1041143117918199046 +15564887666574190431 +13135711852817966420 +2249447373383036040 +4079990834763864052 +2631305799724044514 +9870724574768649 +1575616517243230117 +15697538660546336637 +15288269284021378462 +3757953089780069718 +10363781489462488160 +2898198611300995800 +11522240116805364794 +6156293112194871001 +18221206638495551704 +17461812064821715905 +17975483384902736469 +331036111837 +10198717281121678618 +4196703391028741586 +17413801334096815766 +19595563 +6475404510375405487 +524497408978 +16414263464339002088 +1800784322619069241 +1360360664480967619 +12809057257237978713 +15636380217689986141 +15291371468751464290 +14101047990905642 +1873618489038547197 +3547491601846258622 +8486084916549194712 +5458848655886518922 +9086531922436766513 +817497011 +1873618248285444685 +23689824939607125 +18895412819338902 +3469645734917391073 +7885152524183078888 +17012102176444986050 +985637059534212049 +23125762041533568 +12237654319976767623 +14428481226922941687 +3438167358949055525 +15292217466369813668 +16979965930424590215 +18175636583256635876 +6208295861478106522 +1906986264008723742 +4127600446767639411 +15462041676775249287 +7032320240103527454 +5569296748444387676 +1839046036311457221 +14295234308424288638 +15267897209188334498 +13540186489505325327 +3490850703291659651 +3810357040817902009 +17490170188584258190 +13670967028039291659 +9203956064266185004 +17117511006548543099 +8352737429529840962 +15292781499174567328 +791527792311675523 +1561715782769775017 +13453519300172068118 +5567649171134438346 +5293970477664263332 +9573472878263032328 +7778377092785983457 +1254988914461709458 +9231301876101890038 +13819018690699419 +9198943117820502150 +7031882959323142706 +16946712006312988943 +15291935518751743553 +5509410163496390689 +13537073221172802026 +16543161086522506225 +2976731579359651646 +10692085534723159846 +3445982126355516078 +1146796978919269675 +1873618476140725820 +14101035093076151 +12737823250019932200 +9870724566838765 +3597075328668689283 +7410231625909407077 +8258313999682319589 +2208983649182948184 +4023356693573622376 +827861392871149962 +11665621 +5567604611335918137 +5059311031545981313 +12733557042542092587 +1041143148010282588 +1544487931 +28332732957606753 +1730290055066424698 +11941637280283641452 +6889980590987690245 +9870724845039545 +4127600433869843335 +5458848587100981064 +17088205536462716955 +15290243403140720195 +5522024731759098349 +10583005676211813198 +15291089482441180874 +1786642080975447582 +1836789909388150596 +2149273943172060879 +10534537747099102345 +825323232349940491 +16755866031951056585 +18094160539292143509 +9870724585188945 +10905737396268439677 +15289397302342789538 +14775421719582558132 +15290525419543089949 +14915500229859295497 +5848025033160742862 +933515266770035383 +1893141935297140144 +13515325016885695061 +6486269452320973312 +15290807410151084013 +16897005078969543429 +1873618364365297370 +6863396644812185370 +8589681883221465311 +1873619060818585786 +5261190217318411243 +3370817464176371906 +2161929791810201371 +809714377765120504 +5887757391910481220 +17488950423847769658 +3188243813819762766 +9568883447315500158 +498701783919 +15222694203370132915 +13524360535096454027 +17093682152237638409 +14784593753674377461 +13991673242949402554 +9995197535073999384 +22561729235544290 +15292499560156111584 +11757991238143067359 +8599440168485009635 +1943289707822142186 +3808100883801263468 +2625039572996334217 +17941625429179262781 +4222974949961697922 +11499096412339249047 +4143057843413346956 +1252168750434704293 +20340958077218139 +12863100968314682754 +2375065621518183444 +131977391029893553 +17255422109221872057 +14196954099981247389 +15288551266032235556 +3812049122037423255 +3542979347999634590 +14483279403038423916 +12322808742938302323 +1732546156194122419 +5363783180197049007 +15291935449966205833 +11672803028900862035 +4291298457888381336 +15648158056524419212 +48365955 +9175734784286742342 +8510103668314541335 +3590231580044710743 +9870724666519359 +17564433085802830500 +27920101074341046 +8777571881436933387 +1643044461274009316 +18266077987870757625 +456122699108795762 +3597075259883135526 +10178661148508044910 +3735682 +3758799199176373865 +5876985300140517840 +3141472507348280627 +9781319166144108029 +8906482608725304934 +4662355858196871886 +5566476545725192442 +1719386810459560585 +12531357558345502274 +14677446765974412940 +6815608511867596597 +11656072371967579505 +6780625301062365154 +5825995788684775688 +6101885543930729026 +1730289986280894849 +16366488941223503133 +14898327257011415060 +2949328499430351908 +935489295607612526 +16357059045845960667 +12664287547056671899 +777500619329117100 +9628263353044198808 +12568778706007767328 +13725680859840137792 +6991184239161054128 +2521520202677368918 +9870724577259043 +8736138753147939804 +1873618304175648720 +1396895336850409875 +5726358161965540530 +16936580133559292404 +1873618497636934678 +8561876806648738684 +273937202870054158 +1274986655379629091 +15287987246124055424 +10229733804179524009 +11718292303335336419 +1873618256883837981 +15292499547258298053 +18319050408960733629 +22085946 +1326262472021654715 +5009194185446670639 +1360924680089726080 +10111511925103091101 +5541699227146797962 +12797441986456867020 +982297290675327992 +17281096843897433226 +819987397 +16198687013052361633 +9735614383619788637 +13630869015309273070 +15292217474968197882 +9627860010529874583 +1873618441749224036 +429916226796 +24535904242576870 +15292499491370584040 +4504298175131421894 +17128505473059728984 +9870725070680026 +21433663624797930 +4505144254431895177 +14110673719381681167 +3609941100058653759 +1251040684823950813 +8515756473230955739 +5917464186933494217 +1183077101237454645 +13987828013161661115 +6153917830015175700 +16316925779443997456 +8474548068670575685 +12236526275862211823 +2371362618986228885 +15291653510947751780 +5835546306865150276 +3492267542668644223 +7708896953899302969 +5727273437520538691 +17725132228955162691 +12158950181129446646 +12663073838025025070 +14851938262865553919 +6603597504845932113 +13819027289097282 +12070179881384307193 +31586254122608243 +15291935527350134140 +882239441530854339 +5357989095224852189 +3491985470378568217 +2744044884391311790 +10918615408108784154 +15847962188265709762 +103416376 +15421731514577599413 +14979133050723905591 +5461104765612609879 +14101043691479929 +5578757063847518203 +948517604503789446 +5368859492642336025 +318140800363 +2212018099300538670 +8283673353065293214 +2529611247665025248 +13237708548482859013 +12612941901840076705 +17650528360684215482 +5325844482111182320 +21715576847610787 +12750379368847708249 +12642214096204620920 +7472581941515534605 +16484583022124545090 +9870724569302153 +11694336983993944146 +7538389575623453603 +1201738978701618157 +11932900081838348867 +9037837838336599845 +14156017 +15875910495053025031 +17255160887740223596 +1873618381559574720 +7119681633317579264 +1996539660779023497 +9939529044407959504 +9870724632309471 +3542979313608113626 +5380153644422472341 +18271243459993294412 +15289397310941170468 +17484406395699410835 +13542136756315575430 +5633406452177246896 +15288269314115973795 +15287141196915679144 +13958288683712203699 +15293909612075428541 +18106259559096526935 +15097442145767479653 +8663192652061358482 +361130700520 +12344530386988384418 +3532982538532104263 +8282597574244126746 +1413046627621746987 +1836789862098807698 +13819014391274073 +2192639020 +23407838631830225 +10724371891952163841 +5815982120803774257 +3755979022251550393 +1873618519133132477 +3918549015050851466 +16270401397805371758 +4505144185646358995 +15288833321126356971 +6157301992455427499 +4975041129375143053 +16480559093000586781 +7692717626264324682 +5370706211299075922 +17581471284398792545 +9520309487273064152 +13391406225630445823 +4078298783637724878 +4737837392452665524 +3094190453106412515 +15293909556187710541 +6368045642961064147 +12273023305233484308 +15289115337528732916 +2381156568958573811 +2634088600477192756 +2625321572202713528 +1993152740197687269 +4226024969853483179 +9165456129352944196 +9870724758269855 +28766090095566586 +9404491625174754515 +10381023484200688544 +10592171188278931287 +2567719470492110713 +15390446620301028178 +13926608690125027285 +1522648593587323232 +5904754031791062207 +1783548230308095373 +15291935458564575495 +570557265 +1578847602777600502 +6208295891572699815 +9870724606029446 +13357664682955713339 +5671848394624537368 +210659313158 +6835382700213233813 +18414206479632115920 +9184782919143135063 +5600195317109706225 +16543297426514470652 +355553603313674631 +4709504560342973326 +6101795934071424788 +12753199623155224946 +28484116683122604 +8382800723529835798 +6364097413324554826 +31022221316607604 +17335214638657647547 +1721691172903727627 +4399490445019127072 +4094565860123307385 +5732303977939736978 +6226088 +18413392018082037849 +6603431412468770177 +6185740956063784853 +881393336434770087 +9046832997262627693 +9870724624379566 +1873618312774037338 +5727354392818878727 +2206152513328456717 +6507793312822810298 +10967469888139169662 +1410790500698447626 +1734238258909823414 +3754851012528525790 +1890039836549402187 +12315494108807774964 +7401639701246655794 +544277281 +2625039568696911654 +12569524664470299804 +69206479 +1944417820723012251 +15288269245330432678 +260967875911430845 +292345154665 +5948301240013242138 +3541851273791755475 +9870724579749428 +1045595339304158864 +8558437182944257773 +4772521887063036860 +14428481244119705632 +10046052043019407821 +931541108959759357 +11013863376993411715 +13787973713253638324 +15288551261732811952 +5564049544093898057 +5959684424945912700 +24576334 +1873618450347593089 +16327183209838150989 +5776869636240658831 +8486084877858250809 +1628020365102771639 +5779476207079273820 +5511666324812018604 +2671293203349912887 +8139518016048683364 +14657391675119392426 +12918763854349618029 +5938944032347018166 +14287377499390562839 +12092413546983730120 +1873618355763947324 +5778348236048445465 +145335345147610979 +15287141218411890522 +1873618549225229533 +1126071385316269427 +18094944514036012263 +9870724598099567 +9870726023311586 +15287987297712362397 +5195983173922012672 +15290807392953850391 +16112193563348462110 +27920040887196211 +11706556613611643754 +274265168475985386 +6520986101609793850 +4664582489863646584 +14698821431547140646 +14367577705899435115 +5247593352907000017 +11888218815509961368 +11225379263765232056 +3812895132554827917 +3971798903520383446 +9870725136150609 +1873618493337504776 +9870724661079846 +258146996 +2412665840410059057 +2908457255494766963 +11973438391925231076 +11057894865362622859 +1873618252584397609 +14934762739410735596 +2327459513223287117 +105906772 +3225125699802647146 +4022228713945187062 +12346762090311779845 +1732546186288713624 +8505294981809577513 +3070298320040770289 +7063168837434759983 +9870724724060035 +8716776878113885241 +16075433655997932 +6274490301166066826 +7470284155521404014 +8429383870481838122 +15655911281441925494 +9360868043862329516 +4134368866226365611 +61276571 +7646254130275770244 +5299098861505305594 +10457150340041939120 +30458188510601098 +10375505322287828754 +13895981972509891899 +10284111848541071810 +1264349888250070475 +15464046373880882066 +6242575477995423293 +3189397158060824653 +13615927846551034335 +15256632220155390976 +6826629164013340419 +7193860624759865230 +3687549925545173207 +16646420 +5938379956551107264 +15289679310147577215 +18331491793766525 +2413015933370517673 +491717322 +10589843901125582792 +2022770915872874051 +1254706928152686680 +7941288312863335171 +9566898384989738686 +9870725109862950 +1667601868113785822 +2739136145374732948 +9870724634799866 +4447099988237371873 +15291089443750232792 +15289961326549934640 +13819022989671182 +1697571739709348150 +3646692057275241978 +1893423968896312685 +7406197765746857083 +10545770284787246665 +13033551064391618042 +12099752036348415168 +5779476284463187670 +1873618480439692390 +17865928047256224789 +16473820935308061972 +10679345922147557763 +2785415334835848520 +879419260307851977 +20305632406813955 +1400663473403601735 +16221687400139864915 +2266136578109695217 +16058583523153112383 +10209197843192373381 +830963590496079354 +1043399266334745649 +12474598310175191111 +8717448654142463999 +8488471386384721828 +10694515171064744788 +10280579133800254203 +21715766009483193 +1410790466306909148 +17687676663337863017 +17092728740639677029 +8550520059753138843 +3545799486232272915 +14268351140509274949 +5763297167492996292 +8415686009472032589 +5981968545310977813 +573047641 +16257233937394703438 +97976862 +10178038541130489356 +9870724608519820 +11719741672025771064 +9828008900787136782 +8634458684264370771 +3973490958945497576 +5565348445721659362 +12593841123447548555 +15287141192616269628 +6060555587935690493 +13729452748150744727 +12749251337629742502 +12285252899965909811 +32432363517642192 +17205553309097924581 +9800721942016449289 +9118638263387907524 +1360642680884120610 +14598969601159352514 +2682053828164341889 +1873618514833706652 +13472254491101634342 +2560318637201253297 +10908004576701656253 +2625039577295298450 +916908150583661882 +16576177485964980659 +810104214357686643 +18006667830076388035 +1254706859367145795 +9870725101940758 +4541861655513422318 +2393930398991924676 +5545048192883892697 +5246977012853376412 +5356297044098694595 +18218201858820746438 +2507602384638316866 +71696881 +9870724582239809 +19459639086163462 +206359893379 +7333300547414813090 +10570457972707115214 +1284455533177083999 +2558626555980507356 +3494241657488548064 +15292499508567349724 +13133845519496071398 +2900415181051212191 +15865913240105804641 +1197790714672341321 +11391362031143292020 +9520513349872608058 +6008809191785054696 +17180814341930379164 +4397798316509039896 +15779458025647786289 +9870725380141220 +8698802578697685482 +1876289204741233624 +15292781524969732606 +17514477056034423722 +4558676129209992411 +5052785364214352114 +192461576460777608 +15289397293743953237 +8856014169564843464 +5223960103625967355 +1455946274504313841 +8474708919978190867 +4423597313232022518 +3599049404795130682 +15743156949551359420 +18613602775614830 +1873618501935894495 +5102277352796347552 +15185951166044858018 +14536367456042817928 +1361662533288284576 +5304984342732681858 +12598756356538049396 +17620704795175491408 +13671250022048230223 +11234565534460024744 +1467988648900324078 +1197790757662251288 +8854886116851922892 +18054940165407450553 +13722477621747998434 +7124407753507227156 +6147821631090348766 +2950001785237822830 +2819142239193153329 +16114328775591675747 +5915592292141435844 +1318388695 +10269743533867817081 +24535715080268341 +1873618446048187126 +1118144208449201019 +17940106069614007920 +17785705027955412205 +9726821003425237764 +15755410586754948034 +8554937478172655015 +18226162598631122446 +3863606920688567965 +7571745973084755043 +8347129564118722041 +9870724726550424 +2151088368899410689 +3477471148185365653 +1572796396206901829 +17678682231365112886 +538837783 +15292781512071914715 +63766972 +17625510101737610026 +331075883716988111 +11526999220155450649 +11791459571951087987 +4447099996835753151 +827294030293313760 +13819031588062601 +16951907154184179133 +2372569380647405649 +331035645286 +16885944446365418925 +14906504238728631588 +5140044900295909053 +5832726134240516044 +2561876449470734837 +14868332773240477211 +2906754228240934797 +14460252044543940560 +5726358153366674444 +15491610098165568953 +1873618489038083205 +14101047990444557 +3144768531629106648 +1414738648654092870 +15293909573384495542 +1787770146585734390 +3547491601845807953 +817038254 +6153353870293665804 +10432184963839765334 +6151661664400914257 +1962412068909367486 +7430988207035273973 +6814198459947818675 +15294191589786856131 +931541139054348489 +8421458984219327425 +6345468803119661686 +9298565156323659422 +1873618983434204598 +12299775547791052311 +10159392396900178880 +21997571754581685 +23125762041064631 +15289397371127860096 +14956089009447726294 +4291298483683528513 +18441542378571183679 +4021100592445478960 +238820817369715423 +1837917893316325767 +1564301638357239433 +15292217466369352510 +12315392137643780423 +3791701430868647771 +14996177237533021579 +4039226577613972979 +28202117477514525 +11507341268100646834 +4127600446767180418 +11078764008410000593 +7718679577431851926 +12556512549261359200 +2566449444308211727 +17244619236104486773 +1200768187715178742 +2200512120786595193 +22561604559319707 +4594049832084526540 +15799974712971976680 +5080213706511504256 +17480875037442009614 +11134642936640392278 +1432832873447179862 +405777490924750576 +7984291945830553254 +15331874334187599494 +5462796864028886535 +18322828561274784113 +5599475423915352673 +15294191680068602318 +1251322692627469417 +9870724718620535 +15866601967913541280 +3652299293264662163 +17714387943175775009 +11726939912230878946 +13217855330721537892 +10143775221151711504 +1042835255024970769 +8511510417674950187 +9870728842015041 +9870724566353399 +163447447 +2625039585893685827 +5628066852269803122 +2625321576501678129 +2127002776273443239 +6043037483520502311 +15173190500771719481 +1467988623104681895 +9905574651248855152 +10365486602168839949 +5513226627161855421 +2678948519328752730 +3614281497899396571 +4777671515854611087 +11206864 +15288551278929590003 +7242736046355514492 +10223260478367337870 +4291298470785725512 +17855463744419150215 +7727798225650865029 +10539826877291373878 +2528053666090407950 +2863526721718915789 +214958278120 +15680489859993767209 +6045857724931447011 +18205838378480510158 +11445298105660951231 +3787277807956737737 +15897020169117584693 +2359415926146144860 +17007398772982440658 +4609105883745816550 +15290243403140246149 +6745049267550765268 +3600741520408663207 +9675101341122115307 +8977434527578001873 +18895439155058300 +9870724584730189 +18411699898170343448 +615761599254307699 +15289397302342327383 +7425392019208220904 +15290807410150612723 +2867756976357464096 +14457806711540494509 +1808341863893971080 +21997696430330065 +2542888031034295191 +8181015172977552843 +5371408676580108247 +15288269305517132110 +1785804365828067215 +9520658007113347285 +14964329801459329460 +2219404100148201532 +12957163783496614578 +1939498712175285566 +9889017780822159424 +8005795704488150821 +14884442398431847364 +14409153078548760239 +2624757556593516056 +17299513159588006941 +5193445004803188303 +6209141837602300310 +20023598807211336 +1943289755113512406 +10657683217541050443 +4078298775038873378 +2625039572995875159 +14975681650484328793 +6723683046197828905 +16417300493272486054 +15291371442955369860 +2011234877417155593 +15179971149767526427 +17799957677439269749 +9231301807315894216 +6675940112908700006 +436952068887820722 +882055441458868328 +6339566160181549257 +17098380113606942437 +18000107103088036728 +1201739004496782892 +12060386507163899485 +1473119215 +15530553734630409457 +14947092899386984 +3879741967089416693 +8750256560896098667 +4561772026923015125 +8941625236594977236 +10862662132233736355 +9870724666060601 +9131442138763059881 +28202091681875145 +17825755834712736593 +1320879066 +3276923 +1873618360062913457 +1784103963443674212 +3702447044295936566 +11076225877980887072 +7508020770676298034 +11289377747429971788 +883085434851056042 +15773142454203926396 +5993604037221946573 +3650607263633455624 +15289961343746725883 +4695711032624502731 +1041707133526499943 +13819040186455702 +11745439288294197541 +3489165388034422168 +339634040114 +2366626164980330912 +541328159 +6589811804398821530 +14338844047743260291 +9870724576800287 +9398797421263332444 +10588235898704711049 +1873618497636468806 +13517299071517212855 +10354526296759282651 +13642614608784341965 +1873619542316440858 +13515324995391541866 +6785332869306596052 +3308118261903721908 +933515197984020764 +13576944581059430458 +19177532403290333 +776533704493456018 +11347667336161473214 +4160407505383660988 +12881008057796345778 +18413109962987470918 +5565348518806175598 +27356081165698156 +1254427993967831634 +1732546190587669317 +17299513090802458217 +575239712867629506 +17394514541459485213 +11919617600589815574 +1873618441748751657 +5783988546906501883 +13223018370104185760 +3255501078082447176 +258168278732918090 +9870724595150446 +347984565637089693 +16125497538611986872 +8180059292076356969 +2596888135805188534 +12266240835748827078 +6366071515245381876 +9171237170422568989 +15287141209813045485 +1842148156553249171 +10166171762392000905 +3545799447541339561 +5941764144784016877 +13513632858283052077 +1719586138185743247 +13819027288637364 +5746569339698556250 +7960221585811380236 +5886835138979257493 +9821766011289487956 +10416046993340574074 +5683634553747167034 +882239441530397882 +7746405201714873917 +6005160492526158220 +9627993464492075316 +5576979434843872215 +6313225371874249884 +4051631991401298988 +4347361800310690646 +1254142822261745606 +10805893400805270067 +102957618 +9042493923911232283 +901973780138838841 +9870724613500567 +5875369294806846690 +10627282602772423372 +17114220222375351230 +14427656477939225400 +11867544312546282568 +13296312592403999809 +16516307938144512639 +10755598245106034875 +1694703927601276069 +2625321585100065781 +7726826404164424822 +4393850069675286990 +17307564731300334754 +12767897425973104059 +3811203016940874756 +1200892899400693884 +6548876554420688693 +9870724568847541 +5565348505908348542 +19459462821655675 +11233051390538683745 +15894193108039635713 +7706831487936633924 +14011327664327188175 +223556668959 +10593581334778944146 +5286412558308240447 +2073730062937123050 +8876352420811073824 +13697261 +16216077255096689406 +6088875966159460116 +9426516354858773573 +14617157482205821842 +9679119274662438494 +9248255801542390172 +1873618381559117214 +17802290221379499692 +5331313568063446571 +6101795946968785039 +6205475680254630357 +9870724631850712 +456064287627760765 +2191050267287568862 +10800972720340344835 +1873618334267304324 +15289397310940733188 +148719554876752825 +2864654791629877004 +2191210670736366129 +8503320866991711924 +23407645170097398 +2950320511543228853 +4958982650614386924 +2624757565191902264 +686182618244269898 +15291089435151389612 +15683648441873948785 +1873618325671405265 +8106641299786586441 +1075102315582015176 +16841603375389880082 +17575525539226740205 +16771326916068990233 +13200215017988578689 +6428369903004183013 +3875511721049279260 +28484073692729059 +846704164710598193 +11617490488535421725 +2625039581594261653 +740331179229255366 +16135130645543146961 +6948944809309130459 +15578876434901641482 +6220587304137675743 +18221304030651312175 +2625321572202255304 +7430709205550591424 +5541399129527887674 +3599895492696481265 +9379282676664378092 +13282278299793579846 +1914578626310716146 +17620140702182349935 +15029186875295090324 +7876195651955200969 +12590065597550709682 +8645295954767262243 +451411993550 +9870725080641522 +210658854139 +9870724605570690 +17751297209763505938 +4127600476861768206 +11704293171416475531 +10710209930604469219 +18411417877468545037 +13131763631778120064 +1735459858 +4297913044651223114 +1873618368661306489 +5184055445716343855 +4607977882621195002 +9085403852526144522 +50397573 +17632571449240269724 +5598348119618186023 +1418817828737864589 +15123055643937362239 +6548876485635157883 +9558026013781808581 +15288269301217714681 +5767329 +13131763575890395411 +214905639621451743 +17626237310166188633 +15287705238319604290 +3244265877950902257 +15290243342953102530 +662970958174115042 +6534861983688646456 +3650076267004371064 +2624757552294094138 +1873618312773592815 +7872981661881076049 +1042835285119561011 +8484110737244761121 +4434956933160178299 +988739317348308303 +4145558199658421058 +16112245339511462682 +15288269245329984088 +13119788014580282317 +1785514049756993999 +10069623086375316844 +5512098540056154377 +12918763910236883468 +1467988653199289638 +15292499555856225260 +1412315415600376743 +15691596642307041887 +18195793804734051453 +9870724579285166 +10550587301332017260 +5567604641430068054 +4613852900778664030 +14337609258513343299 +14665072197587732 +1840174024538608680 +7273674818118698627 +12807983216407612990 +14226820641826365909 +830399553393155130 +4734318530784485235 +9870725377192082 +16490193613310533446 +9399866244694622751 +13009654029345362790 +1597536137780990901 +16711028872153745866 +1088324864916723814 +16355715749192360826 +8821966780582857359 +3595101205251969996 +9233288855970074706 +87097857 +7562235613620868784 +6368891619085265217 +827351178595273968 +1730290029272832778 +10132928008402462394 +5944020267407913774 +3935460166821434962 +27638024484364310 +2146416170212136670 +6233070486582071858 +382626445117 +16198608137903151635 +1982150087158744268 +1727529996 +5569296709752988827 +1007582054795451001 +8911802252947886855 +13819035887029082 +15209408714912187753 +10684090243060806883 +3628529271274152943 +517538547 +865502499841140949 +2571204766102858236 +1873618493337055857 +10673556018868606402 +9870724660621087 +16701715496128959872 +1997667722089860216 +11284699229478867173 +3522810826906880189 +5198239352434405453 +3675285199721414769 +105448017 +7561780846186994398 +1732546186288259465 +17956738668036105974 +7261184916336422741 +12893049762838873864 +11619960646289209373 +7671164144648525126 +12876737308331240621 +11559421710747048051 +9870724723601279 +5225840204315905895 +15087583807095522281 +15327427559924911662 +10222252868400133857 +6221715386946441231 +10690133606679855835 +6153353818704911688 +60817815 +7560543476512405086 +3880870067092472180 +2840921393219382457 +1574206422333081932 +9987061831489363066 +6047549745963805656 +12559189997203446199 +9876885857671211265 +10479655241544972047 +9488641746345811974 +14659639861312835005 +15289397319539108968 +6283357645274620674 +3239382674005954444 +399564657253443177 +1528977512248004587 +21997713627107668 +8108333368108273587 +9870725369262193 +16187661 +491258567 +1314978509747546703 +12753961153547885118 +4861149623842704773 +12494749567753606712 +1210109745359046935 +24535844054962062 +4732726661406205328 +9870725109411890 +16005897645994171506 +9870724634341107 +15230238344891344371 +5353476789790720430 +15224950334591939876 +2397265941311084256 +814089116 +334447484152128418 +1396769762 +16305369531561176273 +2625039590192650428 +14057723192909567301 +12266254898671668862 +2625321580800642978 +18020127324728613906 +13064755378373086398 +8298139671732506262 +17634838599578887214 +1035372644846411126 +7067500762396239570 +1432480292743306816 +15355830791983801703 +12374154561459205261 +13914917958137822549 +12318365723906541324 +16911052854443797415 +4959080478982475006 +17459728642357945742 +2544027132959405982 +14541340640523322842 +219257244681 +5779476228575003910 +2542888091220987578 +17858552114457937219 +7736166170195795313 +5140326852211711492 +16008435793617579185 +16264927447734165741 +52208545578831654 +338513833735101055 +9665870200200057999 +97518103 +1837205073089096874 +6311975551774360856 +808132802808793397 +15292781537867094294 +9870724608061065 +15716164858010483706 +1737950228 +23689713160770996 +15419996303615471240 +9870724715671392 +18164739397353881926 +14022690072277501850 +15290807414449591232 +7301398441798682831 +1667647249515965912 +7083408578980029585 +829271474884594887 +9201135878743280891 +527958790 +2456519161131512969 +2672421311952601556 +2624757560892483619 +15673521516696722053 +1575334470747841568 +14003328469234436778 +1873618514833253179 +1145668900411495485 +6206603737267771422 +3087006342024874218 +11879474312451680574 +8257735 +17121086937487986231 +10050354110762805390 +19177549600091012 +6825219107794151722 +10663929565947440494 +5495332074530230513 +15288269253928377612 +4275101731088313870 +1283514807532526901 +5833854255738521265 +17166316876055971050 +6061683649247784833 +15942884970699437692 +10185381952325633449 +9870725101482001 +9870724626411207 +17849763801575199834 +5357989069431256153 +16873292416751573159 +806159226 +17781311627787177985 +15291935501556520680 +7276444624641068235 +6152225697206437786 +71238122 +3151678678197807791 +17063720851181364593 +1410790453408641974 +18613559785243422 +546308920 +13762636771413618085 +1873618458945533888 +1734238211620022443 +4397798363800430475 +4085427989274454507 +9640290252143613428 +9870724581781055 +17627202174358262594 +6206453538425545700 +15292499508566903973 +16678521331103384464 +23689794846614153 +14312300901618944289 +7603297094028501911 +11507671079075472268 +3691885829150871222 +7174049681739358294 +15289397341035304080 +12931665201182296684 +12271803412857299038 +12903498736355395908 +10700535707996344652 +980424125039340232 +409981680210363910 +16829212118577211870 +12039042285074526545 +1359796670367475087 +9870727127724337 +16167625211035600735 +2624475531592297065 +8854886172739175692 +3967850673882162991 +15290807401551769565 +4447100009733117286 +9617909510799299824 +13819044485419696 +8919929881589603207 +7462757623451566903 +2481036810160450708 +2405040227814808686 +197198505 +1464040410663690567 +15292217535154433415 +3927011739620223746 +4451048247969255093 +1873618501935439425 +11103300151687644832 +1895990673212125073 +14424533001583674251 +4287350258344731589 +9144793589536080955 +15325213402681731098 +9870724815351723 +1622184526995349532 +5171245402490492013 +18275311385442062987 +16389071709237226472 +6426677826083625463 +5207941461657457127 +10505850878104851680 +4596001690857120350 +14426764184308696994 +11529678957052497624 +4684203863951428456 +7037372724239275258 +10989495787934664038 +4909899654639407559 +18110911350818677419 +20305598014832420 +1517290342124383481 +17382925585909957997 +11611082811632080321 +1873618398755896784 +7863455623530293671 +12606726612143259416 +9870724726091668 +7045454437121286689 +1873618523439577360 +5565348467217401524 +10224371324217794979 +15290807435945783520 +63308215 +14871830661500654337 +17417861760051526435 +16265367920604766834 +16038806134117977321 +17800239749730163078 +331035207630 +38835430638296864 +5727354422913010657 +6988505140584267871 +5923010239074953315 +14840831597640630332 +16524111121374798365 +12927193975764819948 +6209987942697935909 +10194106742938085053 +4303542368191393912 +16546579671803956126 +13164975753063960223 +15519826062116461366 +2625321589399030850 +7621298384226504889 +816579498 +10901388344414326947 +14892847696200341240 +23971695171627993 +12076212418582425403 +12286098944874400800 +16910582374925602953 +12632736833808787254 +27638110466671725 +5991347858709879058 +10595142175420326528 +1735084286622321688 +12271694091597463689 +15289397371127414030 +15291935475760894763 +15292217466368911732 +9386257309952712844 +3754850986734924715 +1890039810755816080 +227855634712 +9248819868739453994 +7171766867999276379 +4983435235708920312 +453534070979972414 +17954056154740045113 +511099694252775338 +7846695775617885416 +33278352538406314 +13553803778815445178 +9177125716739904368 +9870724655181586 +6279040677488699354 +1144540847697314376 +1703818897525260780 +2964221686879110417 +5566476571519883605 +3865299079292792741 +8054291783896998399 +5899052013081873868 +6689142315154739245 +4237484450632123723 +1254988914460810685 +11998383052401952945 +5672976425841603207 +1873618329970371553 +2624757569490860143 +3491703471171249532 +9870724718161781 +4289324330172225068 +3664204166709847309 +3324580943442478547 +829835490493360681 +16320309946182735854 +2196419055069645693 +9870724565921257 +2625039585893227251 +18162843194996378292 +7402940406922556584 +4904404320319051856 +1188626863348459287 +9230753948926543533 +786775059350629497 +3899392740918323234 +2943977945465701959 +9192055953634585461 +3364506306553725752 +530117487457144076 +16755784985233481017 +5447828002516505684 +12539898821926015874 +12087291446523411102 +1987794462939089941 +5835546388547569431 +5123966563937619894 +153940950685139119 +1882949436288866539 +2610595274536532259 +11060132106814300221 +20023508525006466 +335239252809044190 +1083255096133697658 +16874923781322655256 +555732300496588898 +18118845014944790897 +15196731271015579685 +3863606942184311140 +14268731462635835310 +7029767686712727946 +9282299543755383181 +997442897224489085 +16881139105411317737 +16795611086787463511 +441307967382701656 +8859398409388581253 +5944020284604679310 +13977959430917735204 +3076236680870122577 +4470657602908663472 +27638041681140591 +15289397302341865954 +6154199846417865884 +494696889930829767 +9410331508428187240 +5668141196331063538 +2019677677422387436 +15265537683500448003 +18019354998902238803 +1873619060817669028 +9921546946803879674 +504169174 +2754776220975571466 +13885685194831575356 +218681408484893135 +525512559217695939 +9664889374910385451 +10965002685862061856 +9260311924979736449 +1093547025963967228 +14910807821973065701 +12613223999924870152 +2783097505413618668 +129168833208211546 +5154167728572864655 +10095714893949129210 +16795745821907566470 +11855470331474559273 +2340885180733334878 +18315937183618446094 +11179083829641558023 +2879565311197059376 +92078603 +13991673242948482025 +7888341834039964101 +11085332710469999063 +1711177619955799893 +8998114985810158353 +13666367341730161952 +6350640494756627870 +15288551266031320179 +9497099967956271717 +7398819554415963519 +827015326466324207 +12309820192572779119 +4181978426642143091 +155058804 +8216490020261614271 +4505426184853542949 +1466296550483119833 +12786169226300891178 +17523522443899066537 +3652299370648117482 +14010751333566012336 +3686437022462641529 +36579381098924359 +2440981222361942015 +2387236853258009685 +2818164 +6366353518750729401 +7197122574507782134 +12272060124834508586 +15289679327343891521 +9397943603109195002 +8095412568111868461 +1256116932782215785 +9625506809262378259 +6199257254709911932 +4394978135285572113 +9870725096042501 +15287423213318381315 +9870724728582045 +4298759106756944589 +17530637808014602901 +2150364412747267227 +13819040185994423 +11679300041473092890 +13070886371127466436 +15086433578510400251 +17090754617222956318 +1966081057 +16535576818062605726 +15288833346921049476 +18895516000464525 +9957100519350948328 +10531295842117158093 +159826357104565418 +1873618304174738961 +9272877412921600473 +12981572156189650659 +17568124697245279708 +6205434751085982166 +11136049654559363757 +17616192489741364918 +6364338522051512284 +4065061556721887518 +2158263522687407421 +16419095558359767707 +5303047086844421738 +879419277504163249 +331037683980 +4333982245204396969 +15289115363323436098 +13629450251100557485 +9870725374242943 +286257514616544264 +16589672729946118832 +13726982080795196402 +283745872626 +13517281405869306983 +21997580352491703 +2360543918672731580 +24253887839286570 +4021100601043394487 +16765082209473936091 +477207135345 +9388513432576593267 +14962849097619039962 +1410790483503242190 +236454024971 +15292217474967279063 +251295105094408286 +1082902285171638192 +16204201029312979947 +1873618441748286746 +8818864660340170138 +10375505326586341685 +9870726019903712 +4606849791216068900 +16047198358821540492 +11000783251845888210 +15241571714630445670 +12909565160516640680 +17939640265148286473 +4510860530992438972 +1623790192146659959 +2621960197726355377 +39518566 +13832769549366860049 +3222869534187939983 +585952578006556937 +2325785816592100395 +1791852177081380448 +8879970665920138961 +2240811439676010195 +2624757578089248719 +14670703964489735134 +14770571017018168358 +3220708570923296954 +14145396314226516367 +3114677598645477544 +28484086590093601 +7031146359537606771 +8594986363551424300 +2625039594491614989 +948517604502878785 +5461104765611674055 +18895455810838963 +1208411729915886333 +2625321585099607801 +15289115350425620955 +4427221199789514398 +3653991426073234491 +126912693387072238 +7688227536707545397 +15292781598053787607 +15291089392161016619 +17968836627433149218 +5162541817113620962 +9473922542710432736 +7252182233586353996 +15288833278135505715 +11139832232910997271 +14815718892344656715 +7359433925624937449 +1783548243204983917 +9870724568385196 +16206357464900004439 +223556210338 +11555545862197820163 +17634738504986593825 +16303678952904020796 +13046250753319986434 +5831598103022077418 +7893037772050424719 +10756611444464048897 +1873618381558657385 +1041143148011870763 +3890231036122180254 +12235398193055024333 +9870724631391954 +13458105217770270285 +16804053178346313675 +2159673587504540301 +4394978156781783747 +13513350828982423959 +811139977 +11137472878935951115 +17573925580552937509 +1732546121801687147 +15289397310940254942 +829835542081658579 +8256339902060771378 +527486618147375972 +1108021039571082162 +3026423612622071101 +2519729684546932906 +9429706753489594976 +8082457375045543634 +6060555592234193269 +16128390389171571067 +16165753584457771475 +13958691020226971686 +1518418386239705830 +9870724586743366 +2624757565191445466 +1873618325670938130 +11621189233770302317 +11065487246536017596 +3901910077209972079 +2584152424658790018 +1294244387081050503 +1873618519132214428 +17581471284397880670 +29612190892580322 +506659547 +5662352865975421203 +2465915733178065629 +4572017800037681662 +11969997639331887816 +2543452072436971177 +11954488665105918092 +7832420743675854544 +4368754132756294715 +16203767216246236949 +598680211361326932 +10090314555033675226 +9391897638006773210 +5387900141979259585 +10592171188278008929 +1873618463244507424 +12648554978387043997 +10050095941881643913 +2441545293858411969 +808116564529928149 +12144781811009809011 +2286775792223980496 +9870724605111937 +11912642751894272849 +1338765348637195935 +1899651063193471062 +2789363555876800106 +288758653463321021 +830963573300868583 +14386655907412249373 +11866032904059381032 +11496041695137065481 +3967850725472933734 +10233694917695638297 +2547411299698627491 +157549179 +9870724668092239 +1256116941380596367 +17325048741390602579 +9870725143162969 +6034664955253313880 +1254988944555380819 +2957933217444029712 +5250643208892325697 +6876602157457620264 +9557904511767363520 +7871853591972163781 +2361671979984034901 +10791729520532396031 +13819048784382020 +5887799973078783282 +5308570 +11195375239973721270 +20023641799138484 +1538130937 +4397798264919820154 +15290243342952632595 +881393336433847845 +5778348193057614724 +1873618312773118666 +1110074978218744703 +9870724623462052 +1366276539690473327 +14101065186756550 +5534227455086629390 +375428782799130295 +5994483555276243285 +16763428624633899758 +339636063086 +6268252942656037290 +18315091100018565094 +1385890784 +11034422950646711803 +474721213038287026 +68288962 +2308422057123011880 +16744055248286982235 +4023356723667283084 +6977024612293307751 +12647827813688293364 +9870725053902788 +11577446814309556978 +9870724578823854 +15293063610157984467 +12316906647216219873 +15958135860287714629 +14378685047293820282 +9870725376733326 +1873618450346674286 +30458248699315998 +23658823 +5831598124518278362 +2623629766128178491 +10587083886809726515 +11997174049628115246 +5623513681448673270 +2230143550562315170 +12485176921677700398 +13044533461222491710 +10442852986254680728 +17287055941801498964 +6049123076685260349 +14900213215261693845 +16377260960561175000 +5491579806479561280 +27638024483901165 +3618834120532433647 +16463692677881817603 +13280608453224388830 +1873618394458975563 +9870725072252893 +878291211892180788 +17467452414371055591 +3750262322779276278 +3691244026624618009 +9870726022394081 +15118518198892522368 +18412263935274844205 +5907574131332310586 +11069796609748044689 +17785259801536762488 +9560283092819272812 +27920040886282347 +1411918531916738208 +7141996804577119967 +956348125471593195 +770842253709623690 +1836789883594097266 +42008942 +13165236096819726043 +1574831104 +829835507690133890 +17386084584110314717 +4881913139052432533 +7837359108808138364 +2625321593697995819 +4074350485214726972 +362398141595604720 +11867442968876492063 +933797257378348684 +8697674543179833433 +5775289969762911842 +3431717683755289915 +104989258 +1411918476029029492 +9336987562237568544 +109958699161821519 +1732546186287791406 +4180850339536447905 +472907729601 +2791055637096318695 +232154598652 +15265703632663232107 +16895261985277039740 +12578042351787653645 +112135203102072048 +17206681374707767884 +60359057 +1788898212196788042 +13257035187721942590 +9870724570875039 +16847259645936933350 +6460258247738725604 +3997023326150481355 +2477934651225560540 +15511130003875016 +417019998606 +15293063541372426967 +11160816130067749711 +2203332293412794872 +16840215061605078287 +9558026035277535750 +3595101192353681655 +15728902 +2624475557387461253 +1039169058987128846 +16577617590022191422 +1667601868112862204 +1511577289146646823 +18288618189604678679 +7590943417659440889 +9870724633882351 +4764015496858971205 +1876862824976296798 +15291089443749304934 +3491703475470232027 +10819155969781347967 +2624757573789828209 +813630359 +1873618334269327032 +3718282507522880352 +11795346596544991493 +6205475632964842579 +7126692450255121882 +7054549095381294715 +1873618527730601376 +11829614794030074874 +18062970023476085003 +9106329458822636822 +12694510481574349789 +13040021237472176883 +14583143728432899667 +13571622731730202028 +5406162714240565142 +14855968372010917001 +6310847490461361652 +9870726704754976 +4766599572699028846 +1474804159576494525 +8443717593546513069 +14044077120901366180 +15281782868068360880 +17755759720386554550 +7523164378690775530 +3832076563905587082 +4075478615311594752 +16910942470763255584 +8777600036366063261 +1990332571871553426 +8489561521808090282 +6477342099968563963 +18413674000091971675 +13840095604897025041 +17683593807556649807 +4770547810935201032 +2380940722995554108 +1040999824164998445 +11227456630099828796 +2997871977344213316 +15741799161227324772 +16236633348208218296 +572130134 +12450159764203185084 +1414738730336542184 +16473811014429008090 +15896859674140696474 +17879906935043136880 +1732546117502261697 +2113895771772965681 +5461950776129098475 +1735366285829950938 +1256398940586990889 +356830353097 +15291089478143335932 +32150372908744579 +8834282535679560676 +15289961360943037940 +10392730275106014632 +7354994825057423586 +5223590916417278798 +7571980732899143306 +15291371494545696834 +1873618514832797339 +6206603737267321801 +11260491923127622445 +7798976 +5993603998530551755 +103743323483154277 +3598538847360736805 +933797278874542929 +9870725101023243 +12808641794728789765 +1947237997648168060 +5991347884505041337 +9870724625952449 +2150364374056310383 +5137224701875213582 +15291935501556069230 +23407778443758207 +888441834829142026 +9386257335747873389 +1495991284 +1873618458945062288 +545850164 +70779363 +5057336972614918558 +16106972707794722607 +15292499508566435170 +14108828812450878008 +21433680820652257 +3652299374947094217 +6749561607377538840 +15290243394540945906 +3542979343701772038 +16880857106204485620 +4947940129341782044 +6909029312270196755 +7333338093980689761 +26149204 +16395493120484784126 +9181810600696506155 +17234998138415689017 +4074350549700841630 +2326353682263653953 +15588924123154113085 +13823721969964569730 +31243254108808597 +2299993216590295255 +1251604709030193254 +7657986991371002946 +7563201943019078301 +13819044484947743 +2839574788290585245 +2692344368798385873 +1873618549226805586 +1543809028311899958 +5901087741173306793 +9609420679802343672 +3274656301082034133 +1305418630305694123 +17863879857805266853 +11189999939835997813 +11231170305611929409 +7794163375421268269 +2625321602296383846 +936203879074375704 +4320023805656386607 +13689993689416885205 +3648351145310577979 +691477643294354965 +17333875493985534115 +288044825771 +5152961837354139321 +13037893016074337240 +14095300710942186200 +8831873412884346233 +15288833295332302904 +481506103529 +18331556278985820 +240752990030 +12435788500255790670 +6321206112271215666 +651404368114879038 +159234303033429740 +10335916562981215632 +14288863001776908955 +972139675182777846 +15291371425760156137 +279448939630 +555732326291745900 +10419991129607645328 +15290243428934968657 +10722843938269567827 +9375882715240667078 +5515988910840368464 +9870724725632913 +18411981914573045794 +537920267 +18114732861665710954 +10185945937841823229 +62849456 +12749251359125023221 +8805896130373763476 +6428002724138999248 +16543696378457903016 +16638117427927927453 +7534809518348583877 +3469826915326309576 +331034741747 +13950077918785243724 +12137195938043475899 +7530320043355359505 +103743344979356251 +15288269275424102255 +32996392023299528 +9870725111443516 +5463642874544129714 +4327554928764609975 +2625321589398571980 +13248430393916276407 +3653145351071736249 +322438850771 +3812680370016043165 +5303047078245584153 +933797253078936837 +4128728465088930440 +4989607797509272871 +14491088305759141914 +13355408513042817815 +931541139053435692 +5245848917148372136 +118853859142427382 +15965614960413533409 +3918548976359006596 +3099205763721988894 +7418593704070627269 +2616099190762857435 +12553987782349495933 +12046097947369283003 +17439216674871267130 +15231557775990529142 +15229109302088651 +17933750666284131820 +12398037902653465667 +1832528875541843922 +1582324801066250075 +15762397262040950299 +1873618385857619209 +2573543666009114673 +15292781546465014132 +9870724654722832 +15635717929499583925 +17691343481311994097 +15287423239113553835 +6151742360362430476 +6208295852880837825 +9716360990393460984 +3967850695377899200 +5512098613140196086 +16496271579953904281 +1146514889432259168 +1785796113449038604 +3561302037904646310 +3545799438942037570 +17089062591890731552 +13941011578729796213 +14690331310683337267 +7356004279972221061 +15290243360149411461 +11228930144722889332 +15287705255515933488 +2771018248290639045 +9870724717703026 +16041596294548426202 +8482084103035038424 +1884114785540515268 +1873618523431177265 +12560054189261412079 +2813908262694555496 +29612195191536160 +3005355743189622935 +16316643724348512993 +15287987271918298173 +17620704816670782810 +9870724565462498 +162529937 +8262224227024196725 +4781993112929331615 +5618310626131334019 +8920257203052091759 +9190782010704483825 +16357831541210631346 +18413391979390173264 +3225125729896325686 +11550625635478558088 +1730854036283999732 +5406444726343502428 +18186215503936112734 +756645303878 +1198918840470098205 +17270842615558121277 +3809228958010254186 +5557008752083030081 +3732625572027454745 +5195701174715506207 +5885976078596834724 +15622648530882209785 +2676033644081056812 +8151126488332784773 +3602002399267071044 +9870724583812680 +6156455960442904559 +4840918696143240609 +17424895205631415558 +10996615609646338880 +7536133444402304954 +6928358494714596151 +4745371150153501277 +4185801434722357101 +2228452385123483303 +1007582071991777165 +14457806711539568593 +18304893710506924443 +9852708033352912022 +813740659562603784 +15291089473843900257 +273182570212582368 +12807929208824353158 +5575090842013602612 +1576180593040252805 +12134140299873706424 +10914772914477802405 +1873618317072088260 +1873618510533386414 +14607325535292232541 +15287987259020484332 +9629908783966066011 +6153562809800998657 +933797274575124159 +1081973688179907653 +1095239150174145285 +3967850626592352232 +7099572391504729995 +17045009756596405420 +91619849 +1785796044663494082 +9870725077233635 +296643206246 +9539912040443754631 +6795216411028385086 +1076093826177702992 +1915389734535569933 +15292217487864648781 +1873618454645640429 +891093980794022711 +18162561135602381720 +154600049 +17011875630065275011 +5780604328577598853 +3838791148951586908 +4343368849767077463 +667410241494336083 +245619828089971227 +5639035206692181209 +5111714952489091956 +2764296055274361994 +5141737015908526942 +266904259645100322 +2359405 +11497169803738495380 +1256116932781752189 +16146067599794913072 +8714520725396523830 +13598617575393016994 +5299098822813427568 +10971297649236725335 +11050161621988804687 +10158546382084903927 +1894834093900453857 +4170129077182478485 +8334363776853888213 +1873618544927401029 +2754754908433633993 +9870724575882775 +10528949917812679347 +2828142038345470706 +17616192489740896443 +2625321597996960522 +6698151227744404787 +2016322165990440212 +14353344231279178948 +20709678 +9841455485144165613 +15291089405058367580 +4535535134618292867 +1892295933379236193 +15998836229705056155 +4469799173763958889 +2326422845866792158 +12073115244563152563 +707434908160908100 +477206696990 +7383235651682184386 +14530021933045735741 +1485217303774516149 +10484401600830399569 +15829085955714276431 +818611132 +236453565437 +10066330925397860148 +2785415296143990811 +1873618441747846758 +7397691544692478118 +14079863491765742141 +14518062923925496343 +15472423880903045587 +34406478336637595 +16222802787723524988 +12235398205952367348 +2306802734 +15483428836295659595 +1623790192146204813 +514130660 +15287141209812113235 +17863775709192724568 +39059811 +16850361761879760098 +4025048783391375141 +16007025767492967813 +10178038502438623178 +1873618338568285527 +17578034881156430184 +384951972763351125 +22279734327975804 +2624757578088789427 +341040476240419421 +7002851749355540722 +1113459187947871073 +12282432740238188201 +4651368366385225025 +908024780281099988 +10010212520221548903 +4237766475632413481 +3615134315107468053 +901973780137906542 +12847295796399911333 +6595181109374512519 +10676818910431812772 +126912740678440411 +14692125830678778294 +15290807375758191832 +365578893075619797 +17783567759008991682 +4834308353690703619 +9806799500870375103 +17525496563017920468 +7462757597657963417 +2475960502013666827 +3595150202457107355 +16035735698923801731 +17968836627432686342 +6152225714402759862 +8431631716592338935 +7208660274307815433 +9870724567926898 +13073654500703213404 +6097847756023543679 +10819616670215049482 +1873618476141841211 +18043401381563224102 +2391653996915734149 +29612147902200196 +3580383833416948456 +9144793563742492633 +23689812042912805 +38835516620164481 +12779319083936662184 +3541851243698275907 +6204306685474773819 +5881584636093093630 +5150516383306175530 +9265867537812122499 +13169917011251448355 +5172487013624984103 +10464457580730805637 +6881347154396139706 +3861350836756751466 +15287141244206140894 +2014912062479880628 +5356297005406825153 +1876289221937097054 +6365225423046182853 +1806286119218928070 +17218506732960045575 +3757107040572823187 +7321543552924148733 +9563531543822031280 +17761874897365304540 +9870724846153664 +14067730045651934693 +5924578518110588930 +7706082920377034825 +361675971417279818 +9749912219619629862 +17643102050385274957 +15290243355850007743 +23125848022469956 +4308404763427230972 +405888403808595634 +10771469979967884371 +11859817489688509164 +1873618325670478955 +16219982623696489082 +1091290920536389450 +12703047306041838318 +6879287105447206945 +918014374844309428 +5595004140770712323 +4292144494200033965 +15525311699043181640 +9870725384204482 +1200046888883602132 +2103885585803922670 +9609865824536716672 +352533432891 +8278649280118862634 +10015828607276288922 +2709909863184878762 +17998704710804789719 +17786951977336971487 +1197790774858098579 +3488086272339486237 +2152780467316001469 +937181467107481784 +5251489245202427816 +1731418094882668877 +18160276510789809090 +12818875419963886521 +17620986828773730386 +739107654424662627 +15386674209398154503 +5749614398481129195 +4826354004556994044 +936899394817385729 +2538375781487433840 +9606749428600086254 +9870725079724013 +1270478860423737268 +10765335333603787685 +1468270600816447908 +8072815716184045783 +1873622689318655509 +3685635809078676834 +3950565116016089051 +4156318401029420287 +9653595950976935602 +14729776028223947505 +14428481201128429146 +17861752199178229117 +11970763333294630898 +650946823265147040 +14477731067643038195 +3037821727017746875 +4609951924355682692 +1494902044662900583 +6364097413323169510 +13829667330244829052 +6045587551004596203 +5631282936789350562 +9766084152306503991 +2372569397843281208 +17943317531893566468 +10601781758411872413 +4849811 +6687368400297876212 +15290243342952188446 +15287705238318696754 +10756726237632152654 +9870724623003294 +7660382775691194957 +12408793658117411707 +9797418163082709156 +25099876860050004 +13510929043443358837 +17625510063045740642 +2522831856378710008 +16168415971576665418 +339635624738 +2625321606595348609 +11702319017904718235 +1597967834214772902 +5724665990464154161 +32432346321981245 +5782296431293302176 +4393850091170586250 +1358668621953049195 +13657715402944294672 +7303292064095938799 +1654120425802828663 +9870724578358380 +9934921328932432249 +2835783425564029803 +245051953629 +1023278110615556255 +4075478593814936176 +13817014794279734854 +9616471334043587216 +11168138985428558449 +3429376741358774092 +9588766567104468853 +23200068 +5195701204810089202 +2246313005 +17330799214922516145 +7736336783847677574 +987582763579893517 +13944144563809179305 +11154869721583020789 +15287141218410501709 +3546645582731105522 +8618954206935976415 +1784668013445532519 +11785584444493541626 +7715066999728056112 +2332294827680799502 +11731683713072444745 +4127600408075332973 +2483651899439525317 +4452458274094982561 +4240022598256312039 +6493133948225863981 +8949232631855671987 +516621038 +21715680028265805 +8721971914208712233 +11209333894895834979 +1734238293302468189 +15287141162522799135 +2758611277779516489 +7888341864134085054 +15291371473049039619 +3865299040601378650 +13396276396879196466 +9409295226592062400 +5471876976429524855 +9131616131521448314 +8801992533307833054 +405369609572924374 +1411918476028564383 +16341102732774815109 +6266843180074998524 +8552319687958476841 +18413078431218478693 +17309969692947005527 +1084272745185175649 +17753726094389219061 +850088361543927300 +8510664299682604908 +15292499534361593441 +17733865212901732982 +3494241683282801335 +6997585973844519780 +4067017912572784457 +59900299 +14579759454216721184 +1895116050115682762 +2840921393218463059 +9870724570416301 +6310847447470983065 +8414115611715775359 +16904712944498909693 +6364160896049561346 +6823501973795782520 +11407798107525172108 +13005486289543193255 +1521238571761227831 +417019528294 +7300405137281264178 +5299098852908028092 +15270143 +16639527454054100192 +9870725368344682 +8752346611157835316 +16073122402187222990 +15269831728623806801 +12753961153546954341 +190959780223413167 +10032897833814998274 +5462796868326918190 +7823790866220134123 +9135517549098778341 +7945441955166164555 +18337904078964078499 +9870725108479589 +3415946190284857001 +8196427708865196527 +16005897645993257881 +9870724633423595 +6084488815979411961 +10906583484168428349 +9039704835036027434 +1873618527730148746 +6971583364852427661 +9034578601031458125 +17318441247137275574 +16836387083199134265 +2246696221146223808 +9006484411264817868 +4197341102689690912 +5139071900894896968 +1043399313625198570 +15132481537671974289 +18413109993081143373 +3813668295775112804 +826733327260266552 +716962818556633377 +5136367616353244567 +2874084217735305389 +1715039373318175920 +688626691814923845 +17399624733998588040 +1873618471842419706 +2785415326238575484 +13263909077631912662 +6321619769749816288 +2973669628754930614 +17192903623042479805 +17080213842619404373 +1624918193271629626 +16891313725546702788 +4504298205224635444 +10591270404615642810 +9870724759383973 +13405078033661578134 +8684193584906133803 +5249797146785686321 +18302063029887986191 +11093480918906394469 +1010977206260284741 +623407576775858858 +1801630303041313535 +15289397353932204506 +2384277381570110605 +12235398188755135721 +9870725082214396 +4075478559423406011 +15292781537866159870 +16888390040270411134 +696271930738435215 +10973761725452068173 +1256398940586527346 +1841584123748831109 +5248721418518860722 +5780604289886653255 +17597215202916589049 +4607977882622761240 +356829905959 +1733110171803993367 +5149655405942752830 +14003328469233503783 +1873618321371050116 +2577209823356335269 +1189655118283819928 +1360642680882750931 +2676033351739180486 +15043322265989573582 +7340217 +6062811646072078408 +9056218613256558647 +9870724625493691 +6993058173406241591 +8318427307995835534 +437383129106293466 +6050815166503932451 +4085143173098646708 +14501075935350376654 +3897541658037723899 +4502606068116182942 +494403457744 +17686548580530219376 +9486667438472824267 +15292499555857806956 +545391405 +70320604 +6829731400331584510 +1873618458944614718 +16879729036295541033 +10613272003174286162 +7516858275246053029 +3507365964462644280 +9870725055926833 +9870724580863546 +28202143271754446 +10328470753609138469 +8613755706072067118 +9847013287382368164 +15292781572260192811 +16436379939763522008 +5356297035501420832 +13863504285787886461 +5565348480114297669 +1386332156641953624 +10906513600515679052 +635482979469435936 +3231058998890420672 +1201738952907114745 +8114567754226535991 +9813006712074351384 +8972984118757568358 +11214613638693467420 +15798481977645947470 +11626847437159687241 +1357540556341065959 +14425661019905411524 +14152551150229663838 +7865608601791321885 +343932083086 +15291089465245049652 +1873618355765065302 +5810733571780595672 +11468052919789174816 +13669865326459639854 +3541618215903110134 +8351021376252895192 +12604188464518940196 +17866909664428957392 +3007753865419557454 +1359514598076472321 +5133265453119379534 +14264208172476401284 +1623790153455264201 +2765528462252335982 +3169150724981858043 +11775208443731861236 +12348750122672860882 +10809976220681123240 +1096649176300343778 +5909364179964069981 +15287141171121177504 +16876626885959493963 +468807076180673662 +2625321602295925195 +16872758265580307756 +1331604873527894703 +1873619043622470176 +878291164602390070 +5831598176106139382 +1731418124977269646 +9870725872185542 +519111421 +9064401497118300553 +1413046601827233993 +13241035718353167165 +20023581611540676 +16075141318199340 +989585357958177666 +259261111 +8708739432265893072 +9870724662193972 +5168699629008807822 +1244961421057413947 +6357046311311919257 +10680852744798298358 +240752528220 +12085352355710699032 +17480740212558469405 +8937544163598016922 +12856620987784973607 +4399490376234716362 +15291371425759701274 +6368045617166555156 +12613011696023006380 +12550808634470385696 +279448454880 +3367231797234777078 +2522267888058836226 +15290243428934491744 +6437597293450848935 +5782296371106157339 +1873618398754987936 +6881347171592915633 +13941243479815835305 +10054259526138483304 +17632571479333934813 +12600530117761395190 +5893869020148209947 +5267137917481983405 +2953764621370938337 +2789363538679106064 +17215282683679216211 +8972557000702888938 +16890203154746983395 +16972497233904209508 +16880954746155588502 +5155870833209722335 +3595101200951623481 +62390697 +11875513367515319692 +9373330745965097542 +1730290024972506179 +17845599737456176170 +378326106653 +30458188511724632 +14880915248833195362 +1518418403436012596 +13231662550575441896 +14572005040461466257 +9948707386545297822 +3861350798065814889 +4183106505149791894 +30740204914083091 +17760542 +1992881785903908578 +4359541488049920482 +5869272537584059214 +15288269275423641495 +3967850652387526713 +19459561703362600 +13750803869111880047 +7258580949378946975 +5458631525329555601 +16016119059046151828 +12284332372693246664 +2032167904025974215 +7224394085122658214 +3650607246437798730 +7893636167883368558 +12917851015430880609 +4023356753761413856 +11426265648329200331 +28766107290967088 +18341337922706410930 +8421410001495074772 +5885543833259674054 +14677450275074091201 +2161929761716268163 +9743002498923377065 +2670165163534673731 +4999862633191598042 +11529664935751017874 +9889325579977117805 +10029231637775135007 +6842326798208482726 +468607840445 +9870724591283817 +13470717948542523458 +9870726599176477 +8934971618552733047 +1873618239687714944 +2899890752708289883 +5416037699767724840 +6140684069068231870 +4287350189558292526 +8592630279832086164 +15292781546464549495 +17242404988905207522 +8513053874342608586 +13304992831046314746 +2146416200305806198 +13553803778814532861 +11819570227739975376 +5114817089928127334 +4316759783249762205 +8861613698626554738 +13077428511576120365 +707856615690162333 +1394617557421020525 +13957562954616997312 +365428284662 +99090988 +12051137044809786243 +13522668423781766040 +9267865752796478798 +9124001485831168612 +9870724609633937 +10583135721657607298 +15290243360148961127 +4638900829303283011 +13669583310056006726 +3824643613810039285 +3862478902368281774 +9870724717244269 +23407842929433713 +16114501444938459581 +2519381704729451938 +15722382516522334772 +9462223648962583041 +18412827972379344962 +8716776809329466237 +14966890172087681536 +15292781490576822922 +25099894056818899 +14248511950220574496 +7064424708309665841 +13122408247373415074 +13061371164344389366 +11461539228058856001 +18289406713834315275 +29612195191079192 +13266528773263083633 +8211279456798780237 +11228068159576087302 +7049388718620888399 +6148990677152960988 +1254706867964177810 +18145530795981084338 +5151922516166922007 +6206321673575138470 +1413046623323434516 +8501910827968825512 +10198717259626137419 +15055312786643756871 +5153885205510898105 +13410742806322031480 +1852551117061055307 +2954788517700834235 +12232186602109608223 +12455518088752217621 +15347737330247080761 +14101026495353958 +1256117001566829124 +11796710131367091859 +12646299732263518527 +21715606943315536 +2207641639428369864 +5458848634390974267 +14123679501167048407 +14383042897731420 +72811005 +7568529988180466732 +5097395804919371784 +4131548719395978609 +15289397349632795457 +8859398409387646230 +18326219671233392029 +33560403333875446 +12776044093063977197 +456137521224113750 +14481875850414480863 +8717770435480337607 +3944001801548279239 +14127627765197592822 +12922712135575563490 +3706395295428521541 +352530489463 +3866991117521462166 +14541622644029475166 +1873618364363457184 +9870725381255340 +2628387381562579747 +5218390986792846382 +8204094403390624363 +4240022615453076686 +3973490946048791025 +1806243349007913564 +13975448000602716550 +829835524886456160 +5413640603088463953 +1929173080388211135 +1943289755112136826 +2625321610894313322 +343934588302 +3392492803767999538 +1784667974754592482 +5303047099741311040 +1408762855 +2490064321071768888 +15521592618736509680 +7888341834039043407 +91161094 +15292217535156009698 +4530582984922301900 +14514761534436938432 +1779371027169762849 +2277034116541194981 +3604839257053275332 +3690669377735906235 +2583578220706287860 +2147544192832853148 +9322500938608548347 +9941880145921716333 +10339666438119362260 +3191712388857011655 +17497721051899894328 +5263799743954381183 +1895116067312454599 +5619162452978122170 +154141293 +21433723812579518 +12618268151272134115 +10604037919726247808 +9870725139755092 +2130244209967316713 +14036340911856223966 +12241038516809188782 +6155327877636177268 +1768560713067553670 +408053471422981997 +1144540869192595732 +18062611000115543263 +15291935441368459683 +21715740214974337 +434216307724 +1136798196293306910 +18331508989170504 +12061232577867093287 +18208198535270705051 +465704934443007494 +2786543370353914446 +2036363812201114924 +12957312627536173865 +11442759979532357545 +13665354872375549427 +2801821100446200153 +1505162946105384035 +16508579235574254010 +23407864425638304 +9231865831523354279 +10862662076344640101 +4662355849599126556 +17572412326781805888 +2965365346664801261 +4312966040774726857 +1873618544926933770 +2731257686060983355 +2341393856519411209 +9870724575424017 +159826357103636562 +9467310877347154547 +15288269284022052841 +115810768399396078 +10370135957125224352 +7425311559839923566 +17760632509878001060 +331036761005 +5722409915131627177 +1812923415 +4980713726413050267 +17987656836110361929 +2395604016 +9870725373325432 +16542584354194004922 +1829157115266870340 +8004342958728964459 +12767897438869526806 +1413046597527819232 +2412665836111731410 +13600538850271959186 +1873618489039199599 +9407593762612398642 +13196850206161711409 +1519546451849531589 +15524263781940136850 +8054941353868611593 +11474364645831237916 +17791800825825922855 +15049821920487106563 +311384754869252983 +985637059534867221 +13928803313500380877 +7885152524183757442 +2096094456611949186 +5184351572479273874 +5570988808168351711 +2531021385567766485 +15885495139432882363 +15288551244536691146 +1837917893317445071 +2170063143156798434 +3170614459506571282 +6064503744489608213 +14390322180835141411 +10911952814937687438 +1363180884395122582 +1041425177311142339 +15290807431645439946 +2624475561685970171 +16366488975615680601 +1256398957783305145 +12903069678853164419 +13731641628611980427 +14581451608520744590 +14285945412060863314 +11453444980597416878 +1311572948 +1873618338567838581 +14878478015520074256 +17165175141756132467 +6919877745582162209 +1873618532029106835 +10028063337020334180 +17519186700240950442 +2363364129989404309 +15325213432775395161 +8979553736774735411 +9200864239601916247 +11982867488767947209 +1814401607628829844 +15290807375757731943 +5147802677515721746 +14447127323864536911 +999995119294967009 +3382055312959024726 +16828892600910624245 +6828321283925686648 +3648351128112879559 +15291935518752400007 +17738155618413533506 +5022064819923861720 +5089721691875853089 +11431263877131087278 +10148161044644900218 +11057436498467771352 +17686548597726995606 +1873618476141383644 +2373990379991935676 +29330157293733695 +3757107096460071546 +9870724567468020 +2341393787733871788 +9870724675104600 +1873618235388281623 +5898256648308278409 +5060600839239196830 +9870726575386907 +14220833965521916116 +3846923558190190564 +16113373426618277220 +17417304627474998001 +2623911782530881132 +5249797151084648289 +9246748604024101903 +2698559813262928899 +4023356693574266812 +8245128912192352440 +6562660560423494110 +14383051496117124 +12320990 +31022281504395208 +8320487092031003303 +17478309774689973399 +15998406944916508279 +5516046748198836887 +7230168968130792223 +2955916587611806287 +9870724630474444 +1730290055067098866 +6365225423045746307 +1979992190918877618 +4843209206957436114 +864091049375972465 +934361247193516854 +810222466 +11226550812567014265 +4074350566897168173 +4819849508458207447 +4127600433870475472 +9870724845694908 +18412545951677546551 +15291089482441836217 +9608971531469726494 +10331957377801801145 +7620698150039607162 +16816057115232255200 +13548041863730973097 +5362937165380849525 +789251732567693971 +8682551762103373437 +2676033356038145381 +14646490796529708069 +15287141188317965690 +11023793857665657190 +7916549590872438117 +18381520491477339953 +505742040 +15287423178925949075 +18061505197661052305 +30671195 +9870725383745728 +15026524472793573240 +987047124351985783 +6355660467206177302 +16479243799568466988 +1413046619024006252 +4275860669735843578 +9208536704097134451 +14242931805982313000 +16971765374768915868 +5245848947242502849 +1299603461808020584 +498702419026 +15287705195328315004 +15289397401221094076 +10359246029774925417 +13707162368188682800 +651404385311221486 +1873618463243575228 +12758303666260830507 +10814735609921475164 +15287987211730695973 +5056208859713136816 +8632659985729538192 +5586643963776678420 +14294336569790379109 +16017733768637328316 +11867442938783477305 +3060829241574036181 +7202365236419581690 +15793146406584513 +17855463731522440261 +828707459274451966 +5168979605475250640 +17713680698308643934 +15418151011735769536 +4326349077500143639 +14643356744662267528 +9939360910722090733 +1256116941379669593 +4558394108509303151 +12449525907122371682 +9870724667174727 +27920101075007143 +6153353788611431303 +1735366277230645395 +6876602157456693497 +16780452227807188143 +6073841435447407471 +12848973732578136067 +1609417171773559890 +3361815645018737149 +4391052 +1873618360064032491 +7934866198480430505 +2666811000392330776 +7734243451317278513 +1884114815634658640 +1144540821903267941 +30740222110861163 +7349438249010617740 +17590624212123197013 +8468454696114153981 +13306546789026964882 +5887104135609519537 +14336389543970296409 +3600741460220123873 +1730289986281559682 +879419286101638884 +4184798646557236955 +14318194643535808641 +17324399805683341741 +2953422683374096144 +830117536989398911 +9870725052985282 +12108411733473502931 +7075197627056342930 +8042193109988428606 +7369572591278893774 +9870724577903687 +16155667916530076001 +17403168347445989177 +1145939178431532490 +1873618497637601923 +282591932 +13729734747357010813 +7857359990843908590 +1815413785 +6991773492734149494 +3734950395625870053 +16251775783276203887 +13100244218720362483 +5928389825968936880 +15292499547258953541 +2625039560099180976 +10189090411923910897 +22741311 +17203579194278693105 +13119332863225120739 +12266110898366474091 +1334994379287501232 +1146232890226189242 +4900544073974304186 +5343185758970924715 +820642761 +7128703058323391952 +8981039721073617369 +429916882098 +1571104267697932203 +15289397332435551982 +9369665848651110717 +4069792367638351691 +2103039536595083696 +17317595189330076483 +11069477515152790306 +5677488671088465715 +4127600455366674792 +2484671181473781087 +5462796881224294211 +14492490145478545718 +2116119146306090885 +11401612930191007909 +1041707176517520105 +8928756328856366027 +1790709167968115178 +32432389311435497 +1786360064572481295 +5569296709751605280 +15290243377345730553 +636672496952026729 +5514354662679927625 +11632771835500454907 +14487076764741020849 +2703776944536049346 +15521539403193338030 +15292781507773605880 +15290525393748107009 +12869722283079111641 +9941138681622843489 +13792935891514247989 +12534211682256717 +9800058891891394449 +1157279319656127988 +9870726559527193 +10795701006744968366 +3640323153088766613 +7367774146917766621 +9574252747990831251 +15291935527350774127 +13039004995925450343 +11867442968875583357 +2155762245706797716 +17793638793409007559 +279445514419 +104071746 +15292217517958782713 +6726231061287806360 +346175288917236245 +18181287661796419660 +1427463126435504584 +15118925171898137705 +17305802221890839706 +2675179512507613109 +14935260669128291373 +1795414966055615222 +7106576757289085610 +9870725197295710 +32714349826081871 +1873618243986679487 +17940649545867285053 +32150286927998319 +10087458255877006526 +684134257893444250 +17783567711719199627 +3817204165566030399 +1788898212195879215 +17051410629291501946 +6460258247737824185 +1947665983897164175 +7534792945879504500 +9870724569957729 +15289397366829572594 +16881139122607162703 +7991526094668244920 +429035164415452829 +7662890525169293189 +5160383052661864674 +1782138208481523463 +9181481831755875838 +4817257224935861005 +1987794424247230637 +11841889356580146931 +15095669547731148755 +984791074812601344 +5513393171775509675 +3891732840317912522 +6220469099355321661 +6829449332339194912 +14811384 +15687337562302078673 +8926943740404590345 +5353476837081177486 +17792510766490470200 +8718869789666597935 +10599514620968898550 +15566453567548776512 +15419324624607532607 +7015933728478545165 +10562235013888759602 +14512071994580946191 +13283427563238485171 +29330208882041003 +7290783919948568551 +361131345578 +4502324064611155845 +5418217535311207462 +12806855167993992558 +13955430630263701022 +9263349742138513697 +7699044747705797096 +313839527382 +862062044061248096 +8385438928387446904 +24253724471680873 +14951165587878190639 +3343014630422365129 +547248224624994525 +9435617338945914827 +15308789261579139679 +11224688244128955865 +18101013685495413382 +1873618471841979670 +15985608450754554886 +460008986377 +2907036201652804918 +14101030794315959 +16965018239810429641 +1519546481944120070 +907439166692680857 +6908465318156724580 +17706351504289448491 +6225099605273028029 +1416148739266266745 +3702165045088957068 +11653289664400606269 +3907632037438439959 +3698377064120454404 +1785514015364098065 +12613857801118619355 +1197790727568313799 +9870724758925217 +11649061809146124186 +15294191572590732022 +14383047196690333 +3703594099215373830 +6339470721423972846 +14786763921462406047 +4446335063188258105 +15291935458565231619 +8724608012048871220 +1732546164793159787 +15289397353931754880 +14606595088945136051 +210659993613 +20869630819447759 +15287141239906249197 +935489360094384387 +18115014878068415497 +13940760354079114484 +1974151389111792949 +5741055994875371631 +4146446263661377181 +9435254525858226605 +2846045357035178957 +15742750316059440352 +15289961360942115910 +10856909414813297399 +356829449176 +3886136478444513195 +1144540830501652274 +9005074264763868680 +9183569393148172718 +11309390084970336549 +2838947274101190108 +13671275472959648930 +15289115380519293070 +6881458 +6814198485741605996 +6994666394809097841 +3648351158207453677 +29048123694148386 +3491703453975580834 +9870724625034932 +1837917966401934975 +7042167003086531630 +300941728701 +6056466509376153807 +5245848942943085680 +10246365371133803547 +13411799180233566067 +9388513449772451585 +4180850361031746193 +5899666665836062235 +1873618523446141347 +88848611413420268 +544932649 +4023074659974648052 +292345808939 +8002570657905845163 +4287350215353447416 +11468328372673851199 +6291887770937729578 +8453377129058743665 +1588235070999893044 +12903012937158512630 +10198717195139569384 +17681715328028927575 +6120000845640176577 +16105011288268562050 +7475600315275561593 +20587554227432717 +2508194873 +15955879772058163298 +3594826737063038419 +1519546413158579973 +17420302170789255879 +6108862557802022834 +6989674032461715916 +15287705281310634430 +1873618355764617930 +15797441652732028331 +18613456604322606 +8528752908020367731 +10423336822623070557 +16064731574759674296 +7367735978638454008 +9301505763096281716 +15293063506979990773 +17175427809786595961 +18131365454489931916 +15287141171120708731 +16899503250436331995 +17016498674549155970 +456898937282454538 +4526456999607164738 +15293345523382359411 +15586729198849104382 +23407812836853915 +288043895627 +4181978465334219994 +7081697764708458046 +15281207295722274869 +1873618493338161262 +14814059329512291964 +6211116016906930204 +5994450030541998229 +15861049122876120089 +15331258510695154980 +16534817646768381793 +2625039555799757931 +23689829239230814 +8126937841132245381 +15289115311733746076 +20305598013446467 +9288263741171697848 +9023438201425759695 +1732546186289360906 +9870724724715399 +16434946141727316138 +2500897682486356907 +5895235296822632765 +13837062985237932848 +2842895443551788552 +11399839997235582722 +7622318476700045084 +13829667360338963856 +61931938 +5510538194714569392 +3448744578162959955 +1575616564532765733 +1720270676232642483 +14265238122439841001 +15666430405475449064 +7213449383803694023 +15950055742641345256 +7582605490651877239 +323797831812213253 +12424915693546515287 +1179275495699998042 +9918725530086810500 +3897700629604080328 +1985760827161269488 +12382386493182120326 +8156901485522544658 +15287423196122728519 +15288269275423189946 +5740436588716955050 +8668153581760419404 +11848796837541854831 +13735950183222348532 +8261102338984857865 +14206929112909105092 +1626892299492666148 +13780648980952598883 +1218076211525596995 +6532517595547119768 +830399583486351795 +5196829205935046036 +1873618480440361763 +4051701729562612135 +4564162714848553304 +14101039392710450 +3759645205392527563 +6097847760322044005 +1873618239687250021 +13744323260253015613 +2616099190761919242 +4504298213822565083 +1258091056199574846 +18275682023424405697 +13884327378110449525 +12137988731925307992 +5301072946231258299 +3541851247996771868 +3811485037640830570 +14383055795084071 +2841982591601492577 +1493921373610528272 +4904801948068823332 +219258363572 +2578941511863963192 +8379481146896039927 +5197393238739784181 +17107697648219459214 +963248783570070147 +1308623824 +3545799486232941130 +14863889077920998719 +11196710871156265076 +1256398949184457235 +17946608694533885076 +98632231 +7098579219576598821 +16269065670818011915 +593386749922257881 +16064731596255856452 +10646583751992224266 +15326623458901579666 +6053028402293443390 +2008978677409996687 +12270088581545876234 +13396276426973329620 +16217726513969518783 +2624193506591385564 +2300411992884268653 +6190606344019010775 +14320651656585760709 +11238431078799509026 +2861932964138537897 +9420185788507101241 +5669547748294809423 +4587160729275669576 +6692228549500225635 +14549761505690989488 +8122733700025179573 +15288551326219589967 +11907383107978744000 +13819010092507303 +503001398188 +12803117340005393909 +11287403619712895066 +15739206228516278827 +8280922703389596773 +9517043597869392370 +5464488979641805402 +5510538272098495148 +13513914857489309250 +13326120046233080512 +18092303384593386280 +11217171949775508415 +14101026494875963 +3186279525367950790 +300944208943 +988739278655996611 +1198918840469172743 +13735950114436817781 +16814446659064523828 +2870969767997556094 +1166767807772967837 +4224103024169789980 +1732546160493743412 +12494522522501060329 +27356051071773340 +3702447057191905443 +15291935454265819688 +15267568147865285067 +18046770826235753708 +15289397349632312454 +9870724582895173 +17327489778991975002 +5726358075983401569 +15287423226214827675 +15662612681012938353 +15289115277342223316 +6015751889870662453 +5886953898076356413 +1839046014815449369 +18160022987978064273 +8816997369364548341 +15228101279304665116 +3491703505563893093 +1873618364362998571 +1836789900789963099 +3866991117521000320 +9870725380796585 +15291089473842982484 +12652081853468588689 +17363034096977460868 +5890488371134293672 +1945545869137169282 +14002799093840960486 +1413892590848005682 +13303975118895852583 +5575654896314903634 +14051469866380255315 +12483484823262538285 +2221978394653054966 +12093541651285624547 +1873618355767108874 +6455776014687023688 +4478021395286068874 +7421413902489513049 +16604260019117253877 +3983221356444789026 +6795216411027442152 +19741599601478340 +4822257748200870421 +490103571663 +10758418391935682553 +1873618501936549084 +18059263614816428545 +7515235746198921976 +18413674030185644130 +15082607003165156783 +8929320297175782609 +5942135367485898224 +16160560181895188502 +521143041 +46072191 +2625039564398145693 +10708867523105805811 +15303708896041197508 +2700387955009468543 +15479855057770197479 +17698252132056434004 +2779214141606996339 +1746466903045259012 +8733200714257204941 +7454232953603777296 +15292781567960298332 +6361518302136636414 +1732546147595932681 +434215855600 +5141737015907599225 +7882017128501695843 +4076606659425995504 +2756486165604347134 +14847123027785175862 +5302201063430292982 +31586314309936726 +8351389659080776272 +4074350545400510307 +1376839428053153708 +7694696673418687815 +12611249837816748269 +3491985530565908256 +23407864425164240 +5405598724426046675 +17082847207615236134 +4183106513747715250 +16860434610997645132 +3441186602470879945 +2265776276180919181 +378328138928 +9623613289364074495 +17551024083551668216 +9870724574965260 +1874620259211225121 +4076606603538275957 +6205434751084601057 +17699240790840527320 +3595101153661828429 +10876791317079341582 +6313103621682704179 +5251489270997129862 +15501146095198478749 +1148489051540580412 +12198029587825182413 +7572974184877999106 +9870725372866676 +12202820947250255580 +7342514858172177250 +15291089405057446640 +4385579249901393149 +11370713520965438389 +3914965184522710317 +11891258053057596316 +1873618489038754927 +17060688321802282831 +1873618248285639512 +10518648256136754175 +8565907371958811447 +8807886331112851129 +15663328263737787386 +2328755504042420529 +5524868651610213131 +15290243424634625406 +15291089482449312450 +6886936648282539655 +14840910596114423074 +1575334543830969279 +1732546181989937801 +12049393095758584890 +23125762041722652 +15291935475762011697 +18331349921451618 +3906704111180726094 +13614115152358561684 +5939616171198664983 +421318034537 +2612746777858036659 +5303893075865512770 +15483428836294744372 +6199257289102540984 +131249737499679646 +2163339848029131283 +15177810505157775003 +15525540788186657782 +17397764792056573290 +2031018512392798533 +12192434948939336436 +1416712789267800904 +16850361761878848083 +21151664418592552 +3810357040818115412 +16117885684762157363 +20023667593406367 +437798118096833445 +27356016680241600 +3136160188967625053 +2706033049962703578 +883931539947786253 +4995151238597518604 +15292781499174757987 +17257283807189210971 +5463642917535614049 +5371408689478578107 +16707035010462006398 +14858122840899537786 +365430321053 +14137369733883187637 +19177566795470440 +13451263186146776852 +265627134532400199 +318138499260 +10466882940337866981 +9091855447660379416 +13819018690899645 +1892295967772332580 +4579824205164466253 +5872234855261745641 +23407795639619457 +29330157293274228 +1146796978919457385 +9870724567035376 +14101035093285139 +6200510514917878867 +17627886543243385980 +1873618476140929746 +13610909435744173136 +309542604484 +10325774452947299220 +22279631147524017 +15333364303887472502 +9389579921804314279 +13237708539884666883 +4947940146537651951 +3398730679264688800 +2443796975868849483 +12270932076420872932 +30740290895961529 +15733389794966900695 +11862232 +396204715901085765 +15782158779298288421 +12880159659225073287 +9347818859729929513 +5893456514394232555 +18331530484912181 +4501478032599553864 +7263224397034360595 +809763710 +934361247193047486 +4553078764151069042 +17097308613030775025 +8818864638845060491 +14464988267023835323 +6593586157904999302 +2966626551465398522 +6151097687483292599 +5908323231421518866 +1576180601637715981 +3652299336255227389 +4661227753894582365 +9749504100393108014 +15290243355849087701 +17576935573949929936 +17336458496534127493 +15382444002050513147 +17483560307800756314 +15470186941080102580 +16425638839461284611 +9256163322926099093 +15293063524176770048 +15288269305517774504 +5382568464931106340 +12056659168814840337 +3926291637330526006 +1890603830663861259 +15293909603477237887 +352532507720 +13605998671607320985 +15211986791594795605 +5996988234054377179 +2699017618734009395 +1572232307513838926 +15287423178925481559 +4128778066777619687 +9870725383286972 +8140810690247412575 +7833561147914994693 +11192970930885115816 +1252450796930613990 +9391897685297209868 +14429418949638905371 +6340063993659151583 +498701983606 +16967797193504668206 +15883989505568022980 +5466833342257834859 +5881704967873705611 +11127785638639979105 +3506237898852665380 +5778348150066318224 +13303889903241484337 +17953636526298302297 +5352348801563771101 +3577503648415550265 +3058475745781687010 +4036522300588561288 +936899394816450804 +13609859394403441288 +22561729235721039 +296644790493 +7875397936024467361 +3547491576050820135 +9870725078806503 +4457836554808008709 +10318601653019945476 +14951499805157828720 +18112830070108730080 +17626893465516534093 +9870724818956204 +3493677598887589363 +14875280085206246531 +5160665069065022397 +631243623 +15290807453141191278 +9870724666705679 +27920101074544347 +11452522727666173798 +11552338328563496362 +28202091682557308 +6448144361652624715 +12884401972733174123 +1031980158290568023 +3932293 +9653034717995082606 +12241038469519384187 +5566476545725367766 +12275924320441490328 +4022228627963059979 +2907600217262811511 +4660099744171562525 +6345730598986733649 +1169163685040569957 +827297415953065418 +7460011687021334018 +1374799038194463275 +6287869989401157160 +6155045912821630127 +20587696099952690 +1148489060138961851 +12930806306788749541 +18413392009483845719 +2151210492048851525 +4886163694041109764 +1972904779484306571 +8434517392362839665 +3452050537366752044 +12647845132748139247 +6769951515237896373 +9230455796800361889 +8098722631875955846 +292342881772 +27638127662083709 +4531161121023729609 +13727996608218226014 +1873618304175843807 +3526509882569923628 +15188489661088478293 +5995296161433277853 +1520956495172495071 +181751430757569301 +933515197984680111 +15524056308156024573 +6204347606046150103 +4078298762141700785 +1095239137277913592 +2946293164734225009 +15088133814475713074 +2625039560098719105 +5591370387908795818 +1998795796298417423 +283746963468 +9887040236600192019 +2803649555477720286 +1996539682272914693 +5782296375404683851 +12358116816724960113 +15155437899791419380 +7072090857947143121 +14880882641964327533 +15289679370334918471 +4014568304163831649 +4449356136655833197 +1034135612934663618 +3298420552526599842 +7872981597395619333 +820184006 +1873618441749401668 +4249739472925841945 +6778273130182950333 +16286732516091630658 +18323044829962262727 +14947080002235189 +12221373705611451368 +1839046044910045144 +5728764461935650057 +5185145744050042313 +15292499491370783987 +15289961386737290674 +3491703535658485090 +9317057729478286692 +1842430228844008224 +1517290290534237000 +10331854920347883266 +6812506387326116841 +21433663624991662 +9047160756163521246 +1842148156553913734 +1873618540627054304 +15287141209813697577 +7942407836905443597 +9192756125523466315 +391711721474045374 +2695321185936879731 +14406157554597842253 +18062029668994541383 +21715680027363181 +9870724658786072 +15290807384355638833 +1306546738906219245 +4222128900753546800 +7562235557731330045 +7448422111885663345 +12050419095235865275 +6206321690771457172 +1915314009235720841 +6360390270918666512 +9409295226591130345 +7018902393515161645 +15291935527350332512 +16206862745400389045 +17096567568145714575 +3648351136710794226 +4129856586587256889 +2440417245444777702 +6600298885808791161 +17415379268124032891 +15682188423631740889 +4597621095552476939 +103612987 +12750760711829210716 +1840738113232987379 +9870724614155928 +1873618484739311861 +14101043691675898 +7277283748682488117 +1873618243986207576 +5303047073947737042 +14767825444793889663 +6550911082172855582 +7942152859479710395 +32150286927554020 +9870724569498781 +828707480770198901 +9463685863011931107 +13647449029431549089 +427496612462663750 +7169996928571549023 +7860127107461818178 +15287141252803613896 +6366353548843952116 +14570203302686583081 +15906307029960107938 +18197450674983547363 +15580423463670798967 +5108094061965625591 +3905576110056088955 +2284519691097413532 +12749251397817077459 +4311555937266194621 +16600612505957045663 +5299098852907104591 +13836178783633612902 +489423554 +3813741267744478704 +15092941910517687390 +9135517549097872813 +1873618381559785118 +4921480752668421195 +15060052311350262249 +13980703149896829784 +5547759328422344400 +9870724632506082 +9870725107576866 +5031068290098347669 +15289397310941385338 +812254097 +7042347284441145411 +9558026026680272837 +18102427402643394761 +15859000273728778382 +1466296468800883367 +9870724587875939 +1839045976124494066 +20587670304329193 +16953342370982867785 +3383593961326401065 +13819014391476142 +826733327259352545 +24253724471206444 +14675357373726223161 +21997610445727806 +17227693452873713852 +10255135829012401946 +17615560726830738894 +14120837374815506322 +8487494934077185394 +1873618471841499416 +6427815650386464100 +5250413499738688976 +2785415326237660738 +13480327489607838617 +6996745855548787140 +13710641743571006412 +879419251709665098 +12038614413742719333 +5303047061049921670 +10159956442601701437 +17503960406972050286 +7250372480173941346 +10225919150420460684 +4831503757951253354 +15514102506754632596 +15294191572590289316 +8084188025159565882 +95683088 +10801520580934642479 +16161820259100396848 +5586100518033248505 +2756277397775849442 +2058530494952658566 +451412624470 +5622264581818290385 +9870724606226056 +13832769579460073250 +15287141239905798096 +9870725081296885 +3166693398854133323 +9317408182901676924 +3545799477634091672 +10364343847104303210 +2365498112266798670 +1841584123747907998 +15521585615099989780 +5152757646559619589 +1092418960353094618 +15680117409143081002 +9246563737517826569 +6269466149234815932 +932105128868146520 +4561962166720340376 +16754216790275082661 +16524660023964224911 +13248972050516227376 +5778348248946458928 +9892260962148832437 +15541160984894842252 +12701804944239116942 +5557963999443629484 +8898160943088019446 +4076606620735068182 +15288269301218355409 +4480720771898089336 +9205320012741435716 +4883334480893992835 +12750379446231830074 +9396420953962011123 +6422699 +114033243 +1539245050 +15289397375435435111 +17656195355940952655 +5386207979077527288 +9870724624576175 +1873618506235517235 +13580458483398815489 +4983149958303010607 +14654464656147888046 +10191933884664648130 +2625039568697108195 +5833854247140793007 +69403090 +544473890 +4354547185840900602 +9870724579933111 +3057013630958184900 +15796816026966495243 +1191065195997845789 +5248105001080404701 +3896811179595602636 +6763975681878401615 +8669942141679064203 +987047210333842044 +24772943 +6502708495632061767 +3289946664811040507 +15287423264907807652 +9840570834876783793 +16531696235000655218 +4648156737790764552 +2063067049313311381 +6757860745649798588 +6156738015537342630 +2210326698573580955 +2370454100056622607 +14540810596246030644 +85870080999647807 +21151681615382380 +1731982088996798728 +10284111861439076267 +15287705281310182116 +10459840091729503073 +2834870062606337492 +85348920764998747 +3861350810962691992 +1575334505140015195 +1873618355764152474 +13669865326458706313 +3205882223899445065 +11129475740655424175 +7790788345036025935 +22561815218040457 +9870724598296177 +15293063506979528013 +20587691800539205 +15287141171120259292 +1096649176299425931 +4211147846 +689908947061971914 +17542946382433232565 +43123062 +518193910 +100641190344220878 +15287705225422455543 +18331410108141568 +1774512733593748228 +4075478636806423318 +6144447100801132168 +18249294798171686881 +2949113337358389498 +10808342297155230962 +15291371473050619523 +9870724661276456 +8457396867900596461 +16152489459093475632 +258343605 +7878068928958520537 +24539861385361033 +1873618252584607407 +18007740259109200476 +18167404309274055145 +12927929202362885287 +5898538656112579137 +1197790749064060838 +17781287924871535311 +17592553986939117771 +315442540179236437 +17122305285394416820 +17972467101245844035 +17631725400032560429 +14567143124457305626 +18048552880996179581 +5883005685635360340 +16414819240624853848 +8920676095134336910 +425617012802 +17785259844527786731 +8841050052890531580 +4249311151962285310 +12607854600370739460 +644154222 +1308238841621930915 +3542979322206702243 +15287705268412364246 +3541851205006416819 +821147659536968060 +3597075242686096746 +4288478263767747089 +10372392109843235430 +10510622536589519889 +17940670068026205585 +5246976935469649046 +16843031 +918014392040164136 +491913932 +17224768886585709078 +6364097387529111599 +8795298599822956507 +5912495605621474048 +11691287555752346501 +15287423196122254433 +9870724634996477 +12133813307911384880 +9870725110067257 +7617261265378222946 +2158545577781388281 +7299542677140684370 +13819022989868894 +2810974000444357131 +6241248994235926185 +4582661899707432427 +15740334358613923314 +1870704655113480206 +2155762241406900621 +10863510053166141089 +554894151 +4344823691378429702 +5352348818760541591 +5332958112102955025 +22561746432517513 +12565884091408673337 +13375995718174468827 +10529039710895555933 +14101039392249482 +17855181732316399663 +6225099613870959375 +20305632407007747 +313841551493 +3944001870332911496 +10842237335486426153 +9955919546990224744 +10184535838631813130 +35193182 +4123042238911431444 +17896184685483935509 +5214737420442796133 +9078840430839074279 +18062893016518242947 +5412085028603506611 +3189961255353128712 +15287141248504185079 +17930070487276201353 +21997756617662194 +9870724760956841 +2412665771624719527 +3308693114893976288 +2467043755798313271 +2407143038142985145 +15289961369540054170 +11698631228009829918 +2394639639130031548 +13709513699456465511 +11929824050942072080 +13418544886826534789 +8259178616901493360 +10482079439338559743 +12233184888081425836 +9870724716326755 +16426766960960540026 +12895157156263583051 +15287141192616468070 +2731539702463684431 +932669144476896282 +7238352472149212360 +9470949191340416478 +356831481828 +14861876048013052319 +161153669 +15470458038961325467 +17824947917828283470 +8059135517526536520 +10922127439370802929 +4509067580676323251 +4502606076713643850 +4181978486829943864 +1370042529145686776 +1864301714515841297 +13967595907124170444 +18328169869745603223 +8170500022628585826 +5739422628532468378 +2625039577295495085 +4502324004423548606 +17802959724584838042 +828707510864793507 +12384683746431165362 +546964288 +15281500744185635450 +18613559785890767 +71893492 +4682652064946013676 +15288833260939384214 +1361206713689072340 +9870724582436419 +975156342702894249 +1068175354461235360 +206360089471 +4127600472563004964 +12370327100087021908 +7738093275634026837 +12954975776123195324 +2704904932763174902 +15289115277341755866 +2359415917547961973 +1626046250283849232 +11288528377158120012 +19741462027458135 +14127627765196672134 +17318159260828577239 +6041909422209376379 +15958699901691958798 +16841258024844552940 +9870725380337830 +986483108742317011 +18411699889572151318 +17486135465507513904 +13732283957089951132 +15955315790841254631 +19177592590632702 +12423180240789391271 +7042731108976576548 +15289397293744143963 +984791049019025761 +604787429546206740 +5462796842532884235 +6206321707968234614 +6503563625825258562 +6759780578522242299 +1736212352233723842 +2150364417047336027 +1424529633252698924 +12537688309411167339 +16624412216295755205 +2522267797778668020 +3244917214335741342 +5624359713460921536 +345184634366671708 +90243587 +137199582214047529 +20869716801315278 +505467183118897053 +1730675726 +830681595590107307 +1873618501936092698 +2785415356332257535 +13065116392105518898 +12484855343804407767 +1734238254610590913 +17226423277848443163 +2625039564397685568 +1777332863227999286 +10874535160063486311 +1714117073097151831 +1895116067311528727 +2674042207935797612 +3240858195386589533 +14665067898824013 +4022831255438034250 +31022307299121288 +16881139139803483565 +4844858397045643808 +16275097344414401840 +15292781567959838132 +17535013868194109278 +11245343531945453089 +12650281535106258706 +13705852420633668434 +1828798104530926801 +108593749 +14947084301194074 +6228389264664444114 +14605947718330247601 +14759131600914162356 +12598689303945952946 +9117265770471253905 +6881270673005564664 +8152953255884319054 +14550732786541356980 +1873618351464720927 +17149817495305717193 +16613314593632184613 +11057351737720198127 +5193163048586911135 +3595101200953202687 +10525758612960779188 +539034393 +27016514402207126 +9870724574485595 +7346420227303817108 +7392277691640528862 +6103488088376871190 +15288269284021115812 +5102269668030442296 +15189064920767147919 +331035847394 +5834629831019542482 +13157603142891289495 +11535289813704319999 +3913452348761466713 +5888796298512713866 +13819031588261893 +7697026923310368700 +19333416 +15291935531649294701 +5584408385224983795 +17330838861126329817 +12480382642832672298 +16872103681781163522 +10906583445476542150 +7744402555858606593 +15293909573384683512 +8787523062794446970 +14101047990640677 +9821125259690654662 +15291371468751187119 +18046194195403130086 +16879729066389214570 +7750774493101637428 +818063568869475964 +1891731870479771647 +16655465042802838677 +8102805470461512088 +1586523726108046330 +1732546181989484614 +468609401971 +15289397371128066949 +15291935475761555421 +23125762041270988 +7310380000262577092 +17101786192730483455 +11471899071077112494 +6201204530839635437 +2592586111014755795 +13430509713198760131 +5336848458039638751 +6097847713032257517 +1256398957782378590 +1357540586434747738 +31304310803669716 +374025765337 +3866991139016746400 +1873618385858744014 +5982845010607740793 +2946293100247654430 +17696435480897538366 +4180850434115769979 +1945545890632909057 +31022238513567395 +5357143089007824650 +45398647161695408 +11313741854588165314 +16200965526955708616 +15292781499174312723 +16916423072427633562 +15349429445859677596 +5251489305390697875 +33560368941433940 +8480702426736965788 +16518849648960934930 +16101055838018475723 +5357989133918015411 +1627738421785071862 +13913370016116443160 +2902241888414679867 +15314522268397158143 +13819018690441722 +23407842931002124 +3149070154221694938 +6206603745866813640 +7700323343130976349 +12132085556888226057 +18337460780013473369 +3941610960235205931 +1873618523432294001 +8140646085958585719 +11440287232156442832 +17369559103529756532 +163644058 +15792637963143685863 +6981890464072486228 +9870724566550039 +1382909213854674987 +17306856519194252107 +5461104757013943651 +2148672331528407961 +2625321576501874280 +2605266760617176828 +109714640721288547 +746324852 +14804679217223263523 +936335344815725399 +754060946354955477 +165635790806196282 +17183424562169985252 +6974459570491968200 +17217602240571382583 +8507562123551271368 +11403474 +21715568248962929 +14311736903207619026 +6022410655933547453 +31022281503480537 +12689652909718711024 +1692777460863410026 +3207856338719370223 +11053572278327925157 +14711466487254769977 +16395493137680182301 +1730290055066172527 +214958474959 +17240843774166780719 +9870726054768869 +14268291611706526293 +15576661413533470012 +3061264508759662030 +3545799481933056880 +4908086700238446412 +9484411285755463284 +7844311122151756291 +15290243403140456363 +14443179094227100071 +988739231366201377 +6598891776798315670 +1873618372960934185 +15291089482440909233 +6151097687482832139 +4451375502035851477 +6101795938370596156 +9870724584926798 +16844022412820812260 +3812049079047237139 +9870725059997651 +7222770314979532859 +15293063524176302105 +15289397302342522081 +4822199202875916574 +11023259834649103638 +9190500037293140157 +15290807410150811838 +4229718178032203029 +9870724800147370 +16690611997592213887 +9870725382828216 +6995388108545922227 +967052545100495101 +8443432440787583548 +1627738408887268804 +8991871659213333653 +15292217543753489150 +2624757556593716064 +1836789853500157199 +5245848947241584851 +7758085545632543301 +14732438437247720665 +498701528045 +1145668896112726680 +11824914510819761557 +12557640597676308379 +1945545821847369693 +2465915724580334447 +16225721859232117742 +15291371442955576506 +2625039572996073101 +9549391339858114825 +711211284439971690 +3808100883801007880 +14224398204307794203 +1893738217017125394 +3541851278090903076 +2413828615876118471 +1733166096 +32432303330691092 +825323275339564903 +1709593881817532117 +15361003727878580644 +6027018728244396912 +15371922320578972378 +16849904662683141409 +6988545966851758344 +17687091575411595185 +16272167868443735893 +13940478354871818754 +16130159995999161574 +14883032307819284131 +6993028404949032975 +9870724666257212 +18411417868870352907 +16653698845341400434 +5153306075531453373 +15894028490995489033 +13327291319013612155 +28202091682082430 +274650075244209934 +10908850595815176289 +848960360419631257 +8716400959763851178 +361853366456821027 +4292990582098772249 +1873618360063115649 +3473534 +1822200532863361077 +8445083334526509641 +16321437973100716504 +20587502638220358 +12997102390996569769 +7857726175275930731 +1730289986280642109 +285938493736356261 +1626892316688995614 +10250661980697941400 +4143061672239512001 +5253100136504124361 +15287705229721424741 +4183106466457920131 +13390152586296232130 +6374771627236276986 +9870724576996896 +1873618304175386843 +2624757543695902795 +1520956495172037090 +11661747087386700534 +8694008299851745161 +1254424825767748520 +6204347606045695952 +15287987246123785174 +331038328206 +17570789919916562832 +13290656284748634438 +15289115363324076667 +15292499547258032519 +9662193570996574983 +5567454343707899689 +21823800 +4733419026590161936 +1785796031766802034 +1795696995354889197 +2000014403970092637 +1873618992032800346 +7594767479578443316 +14665063599395154 +7731877908553735510 +1146232890225274757 +17482714258591927477 +1413892676829860635 +3677019719062004748 +15292217474967932624 +9501749132912772592 +3057974460230812824 +16165083394671781035 +429915968750 +825605326135970883 +1873618441748940565 +29330122901311441 +1987016490289490933 +13882019050382367850 +1517290337825612117 +14260259972932325906 +3387142631624424329 +14912242162891571930 +9135420137394871329 +9426596312246995182 +15290243377344814086 +7177657680668678893 +5572116878078397962 +5142858024084583230 +1131188089942664821 +16698252929151480634 +15290807431647018487 +5874613320633310483 +2121831449192052971 +15292781507772695370 +3492267542668381995 +20587489740417540 +12075355345957688291 +5410232016589430528 +15291653510947474890 +12663211720943410169 +21715680026892747 +5323352204763931885 +5368306457458708192 +3865299040600009324 +874949868556205490 +15291089448049387201 +17571002206077260349 +1251604691834056401 +13819027288833037 +7898605015923976465 +15463390673087044426 +7919238210620707764 +18001524900627295050 +17135763052476440453 +340775890162830264 +1734238284705196868 +103154228 +4078737590585670525 +7254147993173762710 +3921022040942859687 +3708087393845136516 +3748082382411020025 +17465760298758178660 +18086417565594171470 +10441809148976582026 +108136952511293094 +988739295852308654 +5940354101463309398 +18197008888875927303 +7431889721301470079 +16213479450562943717 +14787093348586497799 +448372043365428338 +15852414990872814224 +2772864169809034870 +684134257892528293 +11288249707613800870 +7791525081614202216 +9870724569066997 +10995621603398081340 +16377752065497779339 +11787935005164847933 +6825219069103854299 +11649066320808062360 +1576763499961016577 +12057002297434514143 +6454053886879339468 +1981657501801266681 +15293345605064813617 +7200745020877124452 +15289115294538546906 +13503661649584730480 +6153353810106720223 +1873618381559323257 +3493670867319671591 +4154062299902851531 +9870724632047323 +15511121406156637 +14930250446873368204 +15289397310940914056 +7514310611403493950 +1730290007776834045 +15293909612075177336 +4424614830507367736 +5304739142270216170 +9870726272479486 +1873619069416706674 +6060555592234847241 +361130448883 +3649479167929567251 +17153706217937061550 +1652992377389194777 +5357989129618594341 +10610817298117433760 +9870724587417183 +5741055951884534736 +7473817827733750555 +313838613921 +16171710599359175538 +8421459022910015922 +1788616230186603559 +17698080989485416301 +3688102202101226799 +8614935460695514000 +15333393833812847575 +1873618519132870897 +7528195811907353454 +15986098390340470919 +11116429389254509010 +7342975021962259148 +15210250639711232885 +8228230635521529767 +8723946089214395400 +2703776875749576986 +6004915412369541960 +2625039581594459114 +17631161371525515669 +23689855033940290 +8940766066344742461 +2625321572202451823 +16904751357243772316 +5830663914644780071 +15438242078070693627 +8367458205899630095 +16105414762617986815 +15294191572589830549 +10592171188278676862 +6265032640696696301 +9250516699208567993 +451412179204 +2683752149432865793 +2578187325 +210659050964 +14193702923027175663 +1531754272364057701 +14461884774355908554 +7493017085503549330 +9067541064426464809 +5052480394653810859 +558888334225400626 +14439090019965886103 +3687833351407948053 +16773068928657595078 +4562124351240801677 +9870724668747602 +11603400316218597078 +2685480962050834065 +25381923356885528 +1084382915397039677 +3075656758671581977 +7197578335120280274 +2308422113011377542 +12332629721245313125 +9763237054718303157 +2345279645596406381 +12360039254434598788 +5963940 +5634896889029409309 +10167581917491053663 +15290243342953306315 +13772411546827380714 +5248105056967671024 +1873618312773778750 +6152225744495972838 +1254142843758139143 +17177580788047632479 +1464040414963326149 +9870725099188232 +1897983538840737027 +11818524036886127243 +12833791847801308385 +1873618506235061984 +9870725206798434 +6307289747169352852 +3744441722886368114 +15290525359355666181 +5566476498435574920 +5779476262966746119 +3532719046284285322 +5833854247140337920 +8703842248362253322 +1629430528798513286 +68944331 +16903238998122973651 +14997655516592105584 +14383081589795982 +292344899480 +9870724579476248 +9870725054558152 +15359337396017519635 +5357989060833077486 +23125779238034014 +16683469352030118328 +7286102167777329552 +6513444962178641526 +15291935492958342683 +8511228328187815257 +17104122530864112821 +1786924183359871731 +16497957014299286440 +24314188 +1873618450347337670 +16332350222573522857 +11183009616132064722 +8834874324277485793 +16245610700080811521 +9870725377388693 +5370562635970321059 +1873618798574002913 +8195299660451552653 +10617458906941316963 +21151681614909590 +9167533155582352697 +14657391675119111356 +22279798815198594 +9520675089907067504 +631682205724530553 +12060104430574575937 +14285945429256723984 +15433104991841299317 +5516832380128140930 +3861350810962244980 +5405598728724552702 +15287141218411629874 +9008581883226639217 +878291211892841983 +15287987297712104671 +11069796609748717015 +6736044081455244551 +15290807392953590546 +2624475522994093263 +1850094035620414493 +3865299049198390675 +2786543318764251216 +13819035887224266 +1934287791725430658 +9627456835212554871 +14776364799840773916 +42664306 +17219576355391299540 +6832106476831907345 +15586729198848181726 +15783366960629760771 +23407812835952124 +8908700085416496656 +14101052289605336 +5905600033709829121 +1873618493337242815 +9870724660817698 +15287987241824375136 +12921020011364766505 +326738911443 +17092164746526863624 +14478577078159091529 +11867442968877157799 +16987676982181783182 +33278412725750974 +14359688612330103524 +7745426544242876846 +11868289048177626767 +931541143353499761 +5887235996161167538 +12773134790148376653 +2845029541903603926 +10753025826577715391 +15289397375427035782 +4618182651265697266 +4290452361390398678 +9870724723797889 +9785132970652691792 +4507118347755330294 +9117971362513815455 +1209011269534884898 +5425080494119589806 +61014424 +9019028246175888086 +5719478826290403594 +7032529513524310934 +15966878364285168970 +8685292702592677629 +1873618390157708388 +858962259618581292 +13295987987165570902 +16149105318148965958 +7782404375948841047 +1873618514841383864 +9390205578282888544 +1893141952493670037 +22561802319769001 +21997713627284659 +6293435910568086045 +1414174607250698103 +16384272 +5246976935469194646 +3275648135038375859 +18417203057481164628 +15287423196121809839 +17842038203711310475 +9870724634537718 +12133813307910939835 +13726068529822508384 +9870725109608500 +7221367551042337339 +814285726 +5726226297114537063 +15291089443749971981 +1873618527731258273 +17403754121918828405 +1847659206774034043 +15306493624772866818 +15505670362359531298 +4175870724755513790 +5290618853138066305 +16812896809683735249 +18213474575805147941 +2625039590192846529 +1414738640055444871 +936899412012772231 +14572693492501337337 +313841099750 +14395835602564420881 +2625321580800839535 +15287987228926560571 +5426480827987070733 +16906259499140259012 +11348511994799134559 +957876230617131407 +509805280 +17961737508024490548 +17063888741996959377 +2086406612328329465 +2001615947428406643 +339348390721361951 +1043963299150905451 +6137698302350202931 +19459651983713393 +219257441372 +5343981295536723815 +2225256215728112493 +6244211011463030245 +38835512321849413 +935489368691848313 +5546278741478163404 +3597075277079662491 +13143536835616794228 +8555181355919151857 +10113398743546486237 +993771191750975984 +14107289518250222693 +5103405418406824497 +97714714 +16364556117062983609 +301070953670204594 +9870724608257675 +8112311653099990305 +6105193743073175648 +9918656110710896752 +6095905489813916544 +16880502174436767781 +12693382407364627373 +19459596096005397 +8616321467542671514 +12020684574737635149 +18315351454877640002 +7841540557657944808 +4134785464241579036 +10106194057973620039 +17572036737044258173 +9870725146308698 +2624757560892678384 +1873618321372161445 +12615549903833409546 +12862818956211021655 +14194830971440670935 +1873618514833456383 +16985627896901102590 +32714379919765730 +8258032047767049385 +14424533014481676646 +17600054209644943021 +3429943004616286025 +8809880404702741937 +1239173295203829454 +2625039577295036648 +3493395586783720036 +9870725101678611 +1573360373124916842 +10259276900700983216 +12170083845905669637 +15291935501556723740 +12997567219020996011 +5197393273132877515 +23407778444431198 +3760491310490204439 +5713432366665917647 +18301216972081072101 +2927249400660443900 +17751093354995922871 +11189763441375275698 +71434733 +546505531 +1873618458945727932 +6265517906698785049 +1987794454340905773 +1466296554782739276 +11695412827303452569 +15092941940611817143 +7347150011629903994 +18895382726532722 +9477584242102184422 +7738093275633570517 +10209896366333448256 +21433680821311784 +4397798316508787520 +18895576187807022 +12556845544418453872 +1735648345222884618 +5885976069999102359 +1559626750 +18058417591402760409 +19177592590180326 +21715697223688179 +5888796311410065456 +29048166685607288 +1167049768286692728 +1407386597 +343933212360 +14474749879232440050 +13811103675450416300 +16428075433213106368 +6658179749200225090 +5509410189291301300 +3599049404794881108 +16874641799312004887 +9386257378738451295 +3197141888701061104 +1685722539444087540 +2084492846118624110 +13112562473004647837 +1873618501935638847 +17363812233662518341 +2601013084734032090 +14101060887993845 +14424533001583864441 +5303047091144043652 +954650332753324753 +10904609334956418028 +12921020019963141472 +6062811633175367163 +1197790757661981632 +12985842573353835230 +7210486241685481010 +8739781490252195307 +14383077290362578 +17588650110202223790 +11777272272100991344 +16061104127948902792 +3873943250738038774 +3452050485777540101 +1304290611983700514 +3696712944513135534 +11195726804248892703 +7238223723724812753 +18331556279634860 +5786652990377506570 +12258209558853782455 +11997174045329343476 +5788558028420831099 +5299098870103412261 +15967564271985365048 +15681125345082368632 +710425467876227050 +14053998697978538994 +15235824385987596675 +6205475697451599682 +15124099716037502501 +9870724726288277 +1413892625241095118 +1623790196446276573 +9196123009681733916 +63504826 +15287141214112205839 +4368124471622386337 +13862523646724490504 +3598203394278688718 +5407290775552530759 +538575636 +3595101200952734047 +5835546311163843882 +2719347730017306019 +14581169549127065186 +15910819292402953252 +9870724574047747 +10848785268344974804 +13409614757908409329 +7086336053967006161 +2707725187070238579 +12982659061607582686 +15291089452348357898 +13819031587798378 +13641210989408119597 +11860099497494387988 +16839111664807139586 +5509410176393501554 +1424505891750109774 +1609691227769168794 +5853110719953052546 +3999491521748360005 +14725557237865996280 +8655243770018221133 +4609105952531108369 +6151661664400652836 +322439499188 +816776108 +3547491601845535251 +13941243522806851987 +4101210124244178017 +2219158230625098666 +11047492158595885617 +10920999287778524722 +3233307200198437968 +5723537976442823941 +3884829281455265148 +23125762040811129 +13787119239363122543 +2290569701109023620 +6587273635278967326 +6344476675021678337 +16874641730526454511 +9300659722485379685 +8214174268225175088 +14655822515859568664 +227855831533 +6478233478710768332 +11912095569629301595 +16393361744449118955 +13692701044439256709 +2221348161771743658 +9898722568130221303 +5303893075864608313 +5105416417023100899 +15128800886741808578 +14580323538610889118 +5837238405281154301 +2396499577215078544 +4025048830681353606 +8683329710204600801 +4925480952754213094 +14471968401314024391 +1873618385858285062 +8780225706573315962 +12608147631592053114 +9870724655378196 +880547282926721238 +9232147856523987724 +8723103376958506179 +5941764183477191834 +2789215820781928124 +7454507809487081799 +4151361015346892224 +4274168558421615149 +4384733239384303051 +12548834523950570337 +11742834345080916462 +526674426737811818 +7831633610604486895 +12267888773868108830 +8510413296383834409 +16649233235134598581 +12078750566206033069 +2624757569491061174 +1091290924836482104 +10946994120486501229 +17571002197478429392 +6361018468021524884 +14626880282687258207 +6105318150360736572 +3759645248384009814 +1873618523431831649 +16932670336295904445 +16728168362730807370 +5288140009902855615 +13967595915722115783 +1019188102897018043 +9870728841752895 +11344167577809277615 +15291371455852911584 +2625039585893424039 +5232343688123065476 +9870724566091296 +5461104757013484380 +2956623890106508234 +2625321576501415920 +4645111377757891759 +5513358401731840171 +4393850061076649059 +10671429714059943421 +15292781589455595627 +10944716 +7370542148830050846 +989585332163663188 +4127600481160924983 +214958016090 +1850077800486021371 +1573924388733675981 +934361247192134647 +13940760358377172839 +17686269768696926481 +11757991195152429902 +5812207387766296922 +14874433997305222205 +12663159498641185952 +5832726211624180045 +15290243403139978054 +548995910 +6156455960443577780 +25099937047839912 +9870724584468043 +17424895205632058927 +932669187468828778 +17551250931790262672 +14153679155654382372 +15287423226216387463 +5516892818902039008 +6427234016465805103 +1814401642021475331 +5371408676579848691 +15288269305516857620 +1836789900791529286 +14900923026718150319 +6907301151622641301 +2716569126995504653 +9870725382369463 +5456833590401050029 +3589380217574157296 +5250643165900126570 +10759828435258192584 +10827453674717976844 +4449244752302134445 +1873618317072748066 +2675797793070456711 +1894834059507100817 +8478393692625506789 +15716296135804013759 +9830100417878166271 +1409876968 +1200046880285858338 +8088808536782935295 +92275213 +13729170697355338852 +15292499560155406858 +8879858573939446155 +9138653814080346812 +273958936419178208 +1731418086284932242 +4787251587800828866 +14939879084947609263 +3599049357505542058 +1873618454646296160 +9534243116412200644 +7508263234226034683 +11259047467872238084 +1708686081577137043 +155255415 +1466296550483313996 +3838791148952227866 +8959417923879578426 +935489351494625295 +10797810605828037899 +15744000533156660854 +1988004552544756526 +1200791546940058440 +30458205707109873 +1720270693428498735 +9870724665798454 +8975137577526633706 +15291935441369569583 +3014775 +15141370283934619381 +13081897811169138532 +9550801417572584963 +5246976952665983112 +17498716255300421272 +15287705780004802062 +15679547749024342066 +18613499598296488 +2106423724829598818 +5461950758932516364 +14256452938553780041 +9250794030848869727 +2439783418456054618 +6052225192628740697 +1518136374135703116 +13819040186184449 +288475931845541248 +17099137057247021412 +15892618447674106762 +18895516000663088 +14815624579831450086 +2249641152251701388 +10049924856077428772 +16643035121679272213 +869591526810269565 +3862478876573773592 +4451048243670025981 +1873618497636230949 +9902918476305358457 +14101056588560210 +4239948864342091677 +331037869860 +15289115363323633375 +8021450371307931626 +21365044 +11420926789278385732 +17378396597546276997 +12245940631988624486 +17461812017531651650 +15222694181875692157 +477207351612 +1423995266572955806 +17620986807278189066 +10611945337933357447 +6200238171345460495 +10875081212388729414 +16886908734816455284 +819266496 +13396082089821357585 +4500349936894561724 +5114817107123523700 +6908465288063238614 +6443975449313567054 +1873618441748483715 +6949109709029318041 +15851194491678182339 +2861878359937199657 +1769672202149128593 +9044163598800727733 +1873618394456676643 +14178085351775628358 +12736880509618376856 +10862211393490139462 +12775396098495441143 +4996566296396382237 +8111257460758686225 +14653054815481761245 +2729219867515826526 +514786024 +1543385872366377488 +15287141209812785698 +10231180664881755070 +13080769801446109840 +14071157396935163009 +5996988255549657676 +18412263926676652075 +7532271409416321020 +1873618338568948958 +17007720368053358984 +12767897481860567789 +520197249678 +18355154975736422767 +13726350550523848938 +1464040393466670529 +1943289729317619516 +12452112158668241091 +9870725088309249 +2625039594491811374 +7904716090107443477 +1197790787756570130 +2625321585099804164 +1626046323367890546 +4502324021619874684 +5140326912398611243 +8937917667823077913 +15601094886964018632 +830117515494309098 +2930013714832691669 +5567604619933606168 +1707570676797810240 +1573642406724068446 +6471725307461910079 +17063720868378328746 +8775522866573555957 +9870724568582655 +223556406340 +17136224367152479650 +5898256648309394931 +11229983338076703492 +8389357128633363481 +6594097420567777449 +23689812043581041 +15852211062187965145 +15289115294538090873 +12000123328105422207 +13435115 +12170437818322790905 +16229996624980422007 +15670057052940940460 +10862662106437851333 +3903193404986233215 +5729665237927087690 +3534543727343111801 +15756776049646784439 +9870724631588565 +4662355879692353241 +15292781542166248717 +9363571204402398760 +15287141196914973094 +1394017249 +5153321666466887965 +8722536002903082945 +6098975770044925746 +17467826082901598924 +5991347944692407647 +17857876286936461054 +4287773437550742534 +16514627296790858383 +7063619439807121586 +12945615554336287891 +3251286420277247613 +28202057290108323 +1493907215601306869 +10735236183147687691 +15291089435151115191 +1873618325671137712 +2624757565191642248 +9955545749193892158 +12730206292662297680 +17305802256283475540 +5671807405266001562 +16871539575890972550 +12747111051830109946 +6736241924279245395 +3733753594647240152 +1200046888884262302 +2580392320090386339 +5342057710557283738 +2543452072437173271 +4968547803474058743 +2898762674199620382 +818063598963604083 +15270695523793439937 +546966152333520028 +311384784962478341 +13003645470104820162 +1873618317075244868 +12874657562824216152 +16857332490755259607 +9289441360305073001 +12734987952529091461 +12294570438877711433 +7962048977086933825 +24253862043860317 +2769442623152150288 +15409930834342392028 +13524360487806386994 +4225639671434784897 +10628679103054567145 +351340141895638835 +8320063730434259989 +9658025172156550406 +16722630845525868700 +7242735986168111878 +1086291850409957648 +9870724668275741 +6364097413323828817 +5962976017044674316 +5505181 +7819095129918420457 +4359689675342302135 +13819048784581929 +7421695944687374693 +3506856210282211315 +4128728490882252917 +1851043416503162829 +6209987959894902621 +1873618312773327578 +3477127770951658369 +8512920435202478621 +1873618506234613481 +15862817677379702068 +4441776561898803901 +15290525359355206923 +1733674170216619830 +13730298810256202747 +11246847420998564461 +68485573 +15562199369000446774 +9870724579028527 +30986710659581751 +12261219845298010332 +6284197438710222140 +17307420556298765809 +5565348527404311449 +5651329605159951133 +7198684663706687446 +1893142021278747655 +9870725376929936 +9011695355029425955 +13538212310200639076 +1256398974978713296 +399917131913715539 +1333166986502092392 +5405437707650735125 +15524263743247825431 +480432067316224357 +821756878 +2464914730971566972 +1523345308027078301 +1575334505139093540 +6197818834070612378 +15086465342110131822 +15287141218411163017 +8242562759948259895 +5636167896104461392 +12611813896417007612 +1359796661768830841 +17520266449292560845 +878291211892386359 +10346467565353966623 +382626184653 +4658361734735749601 +1880166564501797594 +6943700469408882977 +11464312353041296407 +669516658 +8185733200215619698 +7946181893820082232 +13543570682039462357 +6306719325211141402 +3916292849437588413 +16915376653771496153 +18092519415945890646 +9726648140679305197 +13819035886755338 +10432898306512416202 +335334363822 +8390416516393606700 +13463036398582700951 +704450465131346680 +1873618540628623820 +517276402 +8382349310400925122 +2465915754674477203 +5972229159415464569 +17404805271631431757 +365262179507571896 +14101293042239958 +5271005082072848520 +6203168539198949844 +15528579576819886250 +17686830678616591809 +257426098 +6005599063188063396 +11272445595878696212 +2625321593698192308 +4787888628921013158 +2951271132763019705 +279446640245 +17122305285393487485 +15159186866890948174 +105185869 +4854434259307999672 +9870725090799619 +18331354219497436 +9714916684781063078 +14753586224037899151 +17320505087668866698 +9870724723339134 +232154797422 +5352348775769713060 +4958753984641977819 +1334982629667392044 +9689880162253561632 +12311877684876173866 +4792614513982522991 +12103760585755663406 +17638222787814503365 +60555668 +6153353818704648976 +9870724571098618 +12219562580088408861 +16350816611302460671 +5356297014005859746 +13623094662526818977 +13465856609900309973 +6670593046427347722 +17630638801202468200 +7668877999981879713 +18411981905974853664 +27356020978291786 +3918168818075180003 +17215878252576726272 +9870725369000045 +15925513 +15289679310146849007 +15287423196121338534 +6206453508333199368 +757158321810654448 +14749920066691472771 +6100103895843617239 +10530167729217285629 +6206321733762963554 +1785796117748671855 +1275246496069268925 +9870724634067687 +9870725109149743 +8659114857360722535 +10839375724248241911 +31304259214443724 +10586524174966665658 +813826970 +10213126126582643415 +1239351118651480166 +2624757573790024312 +13295743603413243634 +1627422990329726055 +1873618334269516956 +1971464534717633025 +12239544579276215691 +2055147908188813909 +3542979266318053026 +11758287504422146240 +10648946949805660505 +14275831190517134770 +4660099718377511018 +2625039590192388495 +2848264804414726546 +16112245361007408625 +5216457162996202050 +2625321580800380430 +16867932081105094209 +15450374437814683009 +1652810939277510396 +3740815079720965304 +2020701792127226165 +4298414132915760367 +931541130455244741 +18106375593589290232 +15390154327944028508 +13355512081315093896 +1873618471843077841 +1410790466306200762 +15901935939295596239 +6829027748760611345 +32714336929384395 +4078298736347660906 +15662744619552024730 +15229100703901459 +18895395623867330 +9870724760039335 +6233210769351648786 +9181763891149279154 +168849237244054062 +8443742313901284310 +831809661199933426 +1873618377259427636 +12754891657085916597 +7529985804651412127 +11835684099239470563 +365426468388 +13555232347157258967 +10971700108385458090 +16430411316175453149 +6208295844282635750 +9388164695702254009 +6079047173567163444 +13944144538014196960 +1801912319444323213 +13470256369253684505 +13819298136066198 +32150372908952059 +12105365978396312529 +1411918553413126104 +21151647222934511 +10787582826730754611 +9870725880770763 +15557278701187636837 +17482714331675967011 +7854809350878804970 +5727354401416546168 +5509410202188647833 +14988715965144705717 +1873618514832984063 +4756890361776253805 +16349719711739369764 +7357329672251270479 +9194312033267045102 +7995587 +5303047104041388600 +1256962973391928855 +13841851749514363517 +4500072201846789453 +9870725101219854 +16884510720373245414 +9870724626149059 +12087497983987558441 +3703818828207572734 +12593449824476794365 +3648351110916756531 +15291935501556277558 +1146514971115809534 +8690606654492201135 +13737767823308043598 +3844478040387972457 +70975974 +3757107079263956194 +8144030252697337919 +5464488923752698011 +12769025551770276430 +9870724581518910 +1841584166739402831 +2635993685958413065 +22279807413138552 +9729444427091283413 +6299939760131749934 +9127481006617859204 +3596136887273985171 +17101493274462739836 +11112314849961316500 +5244615830698875674 +9870725379420317 +26345813 +7571955500715360261 +4270573542847944014 +8975610360364491159 +9962038961394750084 +11544726374390452714 +10282260953326431516 +14978682747171918632 +4964401910911278024 +6156737968247080128 +343932745515 +8302145608908745521 +15291089465245699864 +13819044485156596 +4129856603783122754 +1684594469535164988 +13888636292899214124 +1294515454484555232 +14156200557193213814 +1873618308473890004 +6217513450722448304 +10526438020465318509 +1873618501935182521 +15775626103314192001 +9413229533004191347 +16315146954142986632 +1464322401271431249 +15287141171121830899 +4502324038816629924 +3398915934342551727 +5517449210700522229 +4287350258344479522 +190608922372615687 +12671965654747592338 +1251322662534668563 +1943198196375574045 +8653098689197518530 +2530175319163286227 +15289397384024950845 +5455423538481272799 +16775375911062365557 +481506311412 +1410790487802399556 +7257422941829752299 +10684420961421629626 +8240010392079831614 +6153702801206036585 +1873618446047450559 +16753843512633332534 +11315489560669545829 +2971324184531309817 +5458848612895429164 +4086835284412157695 +15289115311734864054 +2576669006339068093 +9386798933431492207 +9870726626111774 +1849530024310158134 +115210490232324083 +9870725200900192 +538116878 +15287141214111739403 +1507960418414891545 +1597022911781738520 +17625510101736895136 +63046067 +9870724573588990 +1795978960168040593 +1763408542759735059 +3092190201103795756 +2549385479002351497 +6203069285705805069 +23971751059079187 +10757572347027851837 +15291089452347893273 +331034941069 +16117885641770880509 +1523571176150341131 +5138669575428259826 +6205475641563428492 +10255262013521805738 +12411914213157251670 +7787136313562324167 +6749561538592206000 +18415907 +17479635317879232321 +10169273951420750120 +9586825340336892129 +15293909573383777126 +14219872676477209184 +15645307910993627982 +2625321589398768544 +816317351 +3143159605220479542 +3875793754648151904 +10509637239379332878 +3546892421705314204 +6635688842971387893 +2018160435791160458 +2059749087408232533 +9355026716163187224 +15184207041518061692 +8905421980220405179 +12746154417354125608 +227855372074 +9084630875629826479 +11580032030884513009 +5458637911765422947 +8737266831655318434 +1054368554281231038 +28202117476787449 +6985684907772679411 +17311379822250908600 +16921908201015563026 +7211332299491778777 +1873618385857828505 +4504298166531876038 +3758799224970808644 +9870725129990214 +3332575624131774585 +14586538862699092212 +13516735064507357536 +15289397315239436315 +8509536277061183750 +3685782031326929222 +4131316231599364042 +13816341447826089694 +16250929785657233580 +14489801799502021466 +45398647160770535 +18331487493642070 +8296403841059744478 +10204258576376868598 +15287141201213937694 +1677448585723455636 +18163407184810950485 +13501399862171356921 +13540186480908257491 +10516318328087864407 +1371414832762919695 +15290243360149625817 +16042442348054720816 +17017082293734414558 +2624757569490602268 +12622923746538428291 +9573468698224447954 +1873618523431397166 +2396555433535145871 +15290525376551980987 +3547491636239095967 +12438560421907609064 +10557700531139203506 +3653991464766427790 +11109614543288093498 +3227099780227808907 +15288269262526500693 +9870724565659109 +17357547399885563184 +4858945738627883815 +9672281121207885275 +16346104186945036489 +4502606076715220126 +1675756504502704575 +14428481261315756151 +1540450679473651921 +1454859013759438228 +16315149754281709556 +16116193594944144996 +13266088119052607183 +2157660074536871096 +5412367062202975465 +15289679396129162768 +1459544300034014339 +1873618467543666023 +12446078430462089498 +6314795724398267312 +8829045524260144976 +7259947653609953692 +1652503761315255585 +16721508035480331916 +11511147933886323116 +14589542827686835749 +756645502485 +9428342020683357703 +16590518779154210352 +4433594776408690150 +15290243403139528159 +5373664837896724807 +11405511344019414552 +16795611086787209241 +14801386735943182380 +9772926989806013640 +16008494395543153545 +9273081553817908369 +10864261424787891624 +2599235317101562153 +9870724584009289 +13421658540802334249 +5944020284604435645 +1378466705997064441 +15287141235607938181 +2379954828121555131 +6156455960443095577 +5459976730094484201 +15636771529559117046 +15293063524175386270 +15480561629805882747 +16116501797368112628 +12673814800044661181 +6166763183203702060 +9870725381910707 +2676597651091634100 +4447100018331238393 +13260682755440323569 +17562557465928749877 +1873618317072285707 +2808999907120529782 +9870725122060353 +3221822110943152678 +1312487006428947459 +1145668896111815086 +9302351850996243619 +361106183505713595 +9444197051638172954 +802687359529930400 +12836930585685729236 +3720158282630974186 +4552679112490757917 +3972868165499764258 +7172128103265882229 +9391897676699931626 +3541851278089983380 +17400385404714180733 +9870724602359414 +9697577994188492052 +9604786828674684428 +16039622184027698688 +14492614189890554554 +1930668203255028011 +13951205954302381098 +2850284752221988529 +15090037865789613118 +10592453243373571666 +1873618454645861782 +47186305 +13133989111204363541 +13541596545725386222 +15692721558936031137 +2115587861591052539 +16756685051102842819 +1682680391474425586 +15890644307060597181 +9263266126380743891 +15289961399633734319 +3576011147587899821 +9873023131110173203 +12247971639849607237 +8505012952509925110 +12356593998396393868 +2556016 +15291935441369126574 +12123869624732894392 +1884960787459748636 +3923952264468703073 +2539503834201788591 +195728855030454630 +14972435340783152274 +4133663603883985011 +16226869079173777730 +4443634474708835166 +6062336577243729894 +6206453478238150345 +17958994842248040078 +339633326367 +17422586627343739438 +3493443078837191523 +1517763483834533517 +4508571147808351556 +15287705229720511870 +8510664359869943178 +16092841662109391597 +1042835276520445608 +9870724576079386 +11073865650458148472 +4135355567995904866 +15328597629607826647 +17857437863537760908 +348686362218026362 +7636335434427034053 +5459976661308936973 +4797028137500757206 +3726361221746934766 +331037425180 +2625321597997156982 +9511403282711320592 +9870725373980797 +29048106498006123 +283745604166 +1413046597528470948 +477206873177 +14961595670132048308 +4500349936894097612 +4026170138928568581 +787559604057019814 +16330874579771459902 +236453760381 +2005312494269059840 +1327108516930667189 +1873618441748024804 +18108263961901754150 +12637664220529496645 +4397798346602917979 +13040476687605833664 +1873618394456218386 +4504298175130258330 +1092700976755323919 +13183405131349765626 +3639683266871909494 +9958897131204844101 +18411699919665823773 +2061317950606679660 +6129201087251701506 +7418593811546846557 +15287141209812322600 +5083210814004420889 +9446153529123417037 +14753491312386772414 +450064124585261408 +14657391657923914280 +2836768973064725506 +13145441207842718319 +16760866171987602 +14312864964518020808 +16639546000569158645 +3946753346281344682 +9255035218624721240 +1023125932615797552 +2624757578088986019 +1570540269285363451 +6064762127302393958 +1873618532029765493 +15672533906063365784 +12919095011105336446 +5516892784510047133 +1734238284704272924 +23689867930847291 +3992627820731258711 +4522983015860209939 +8909873711576410992 +15290807375758373722 +1256962990588708485 +12363581356162683214 +2625039594491352466 +1154213686388997020 +5198239343835302491 +9475221718899889877 +14787093348585572176 +13889517661244569863 +16020167147936751703 +15291089392160758748 +8892277302351905387 +17632571518025085194 +15292781598053520416 +5878200460755210791 +4448228053848180283 +12695566147582692796 +10547011290217069453 +9870724568123690 +17967578829988184212 +16808263788219875291 +8929320271381289418 +6847960564508611955 +17936439877874109372 +18315937149226663125 +15289115294537633301 +12976359 +21433698017629231 +1873618381558390647 +11037369719021843243 +15292781542165788424 +17182714010928442274 +18067928165930850981 +9870724631129806 +2729283278899850951 +810877831 +10754752208794748192 +539325825270679628 +16591082794762977950 +16112354652174688311 +206496106184005209 +7753244037492651112 +2163992767517319444 +5555853011653435940 +5624359730656782649 +32432367815907420 +3813741211855361538 +17017082289435008384 +10906583475570214623 +5640826309532258823 +5035010048587227960 +1873618325670675723 +34124418943289166 +1894834068105022708 +6993874441261167216 +9370859833366679337 +3653991460467003092 +16204741214597044558 +825321934414106548 +1197790774858294477 +14694727782844617614 +6625901827024885925 +18413109984482951243 +13453519239983744362 +15148356472588745302 +11212924885651439393 +4368754132756032383 +27356102661194302 +7419439787671494625 +9811526506704628601 +9801145305236452979 +5574226195017185588 +1873618463244236931 +2710531354671725183 +15287987211731346244 +4562676937537966916 +7397691566188879428 +9651137534997766449 +12057284348229990753 +11468510220170514304 +9870724820070319 +4184798556276136519 +1255834924977969382 +2901677911497985464 +1580068669843704469 +15289397345334027600 +5940918086979029952 +5132701450408634949 +6366353527348874671 +14264772166590881989 +18331517588211470 +2927894592700495248 +4144026118870020469 +8336200102697512435 +6256189438951187315 +9720702129171228258 +9845067387665259725 +2870326163509304101 +5707713566021659279 +14120746522787388548 +17157280723945801078 +5046422 +13819048784123001 +6211340306813032240 +6360390292413496907 +2917029403468847127 +12057566282950260752 +3383022898894693131 +12881745582896540359 +9113587964965436605 +1873618312772856924 +9870724623199904 +10042078279030806454 +8947652831721569707 +6845595206077069305 +4000797057358048300 +15677962722463395980 +2625321606595545096 +10399694839059583642 +339635799228 +5334650189024600440 +3832207697714365842 +4520807930078718185 +5993603989931887912 +13071641208838959973 +1255552977359869292 +4187198287186907371 +4179388418313297375 +9870724578569770 +6279040750572945358 +5796863017406978277 +292343990288 +6203175300535236297 +2993590195969797194 +9503363350701689666 +9388513441174724375 +7106783947908867909 +4528905006999366785 +245052150767 +3862478829283976629 +15292499547259606909 +30458248699064756 +8404471673931509419 +9228351519787133217 +10147381329944858560 +23396678 +5409264877474156217 +7914879144365014972 +17128524481992547214 +3493395569588530017 +1316357237551401394 +31022805993266666 +9839459443588554810 +13702113181256921495 +12771845711499103316 +1775922824205118116 +12733408917148953608 +2718602158699603816 +15292781563661988101 +3383183348476624006 +30740265101446551 +9253588097292832533 +5904472019688183196 +3691885820551764957 +4113625698810618748 +27356033875641745 +5792345985031357357 +1730290029272128811 +15287141218410697601 +7429915589285915938 +1104070756704803992 +7042731100376816512 +13498697150467018311 +14584282791664750038 +7731878007432940921 +7397691497403333142 +16101055855214332856 +13560019145895002007 +12607757948000035744 +13151687854617134836 +10304645852458195908 +916645190273748392 +335333897960 +1411918531916487803 +6405261049027955879 +7911244603065572229 +18052289815504298666 +32714405714475042 +17682574712751997518 +13514134753094558151 +3812895132553648139 +912711002892233254 +3726629888289691297 +1943289737915557124 +256967343 +3776608717035809649 +16799559299230229348 +11015150991840859654 +9870725134970955 +2625321593697733840 +14263644100980130168 +6828039254624913872 +1731418116379057354 +8710469508138548752 +18388359984746082680 +15534577849322266147 +9523554809025136564 +14019103388400103807 +17462940130432070734 +279446185168 +15370248131348098200 +8043267345977009461 +16602804713776357907 +2821110094405068286 +16798699451900974364 +7041038984765781331 +9082058141968173941 +472907459757 +16039401955150556113 +8865366478519731984 +18613585580139251 +10069500277586076873 +10354646633646137913 +232154335723 +12074216548395397169 +4399490367636515950 +18411417898964025362 +535167753 +9054951104626435837 +1788898212196529786 +12356568389305517758 +60096910 +9870724570613070 +4504298170830840155 +15540032936481202720 +11092237411069663153 +18035853641264488623 +2789363530080921926 +4050486810900054796 +926785728619701425 +5393540432733544722 +16949394141343721918 +8862828317998530195 +1102836675776176704 +15691697526684668073 +15466754 +5578193026742184770 +15065764547223310332 +11731126047447128369 +3878049915962538930 +9301794127469679087 +4074350528204379335 +16506080346347744052 +2046709428529744327 +9870726058832103 +9870724633620205 +17117595085339303587 +9870725108690986 +1873618334269056314 +17577217573157428263 +15291089443749043935 +15427680614102970 +2624757573789564307 +8496115233451490536 +4180850382526108807 +5484303510948557410 +5904471950902637972 +3560777249688004157 +16645742803937341267 +15571215206781489673 +5754980864784669949 +361132004563 +12788035416772661739 +3968978760989618307 +4211410851928303009 +11609569840769538203 +15752653857514409287 +17447639780156196126 +7529998377695250462 +4505144185647676614 +15849654381261973506 +12568769870399160636 +14665093693065262 +4664047956613213941 +9178064822587365230 +1873618471842619367 +13392834283320207332 +460009660021 +9194029999668674640 +2534807887592511169 +11176273900772135435 +2282846140646889197 +15844891354627264179 +15881163575329493802 +5535662229532053406 +873539765047214130 +4618470194090937269 +17245750799710423012 +868812296638850155 +15292781537866375462 +2134674329372530812 +14434787001301875082 +12887467162178643557 +4845465316684156146 +15289679344540408604 +2146416191707614707 +13477360793093285769 +3786229089810795953 +6835382700214522263 +3357575107008078748 +3068049055497457332 +4076606629332065949 +16075171407990775 +12454693051790148331 +15291089478143053282 +2431279132085933202 +5199085354352715376 +159777405 +16113243588215261311 +16177458646493056408 +939705269658075004 +5487967233658540010 +17295408966040431322 +5509410202188197567 +1873618321371244373 +4607977835331142413 +2046106469058877098 +2676033351739376985 +1840738143326194066 +11229712761320581252 +1873618514832549545 +1521178677244750896 +18412827963781152832 +3862463871782176850 +7536828 +14266293419834893071 +6155327937823509637 +9870724625685859 +1573360373124000619 +6902477434606788864 +805438326 +23407778443518561 +16041596230062052247 +8800076364837555846 +3527355970469894799 +5352348797265468330 +1873618458944819744 +545588016 +70517215 +1495729137 +3540557113182076505 +11077353926396158286 +9870725056131025 +4127600472561622352 +9695569776152492105 +7721139320100816372 +2635993685957952206 +9870726113882354 +13247843976306976882 +11432423199121492459 +15431078692508685412 +15292499508566174147 +23689794845894773 +4737984787010299059 +13619391748268253117 +9870725378961561 +7885906741318988481 +2491451799233653638 +1980849335833991214 +1873619099510401184 +11434534163980962834 +17183667254703832420 +10863226143542355227 +7350766314471971312 +9134641647950839022 +3139844219098308888 +16595621733296270170 +17057861910319883827 +5741055981978195711 +5127215760155101403 +1971938164852603176 +900303647356305857 +3558529647035363618 +11590524243727573734 +1873618549226547297 +2128965938497804237 +2363524001746985700 +2579787561073000402 +6449657694314452414 +15090817894184862446 +5981382250498316820 +9870726024622307 +5623362810461572821 +15290807392955142743 +2625321602296121720 +18297946943826506713 +335336401725 +14585410861575704128 +3987973514218712966 +5303047091143131495 +18166080023065478575 +1031583703477396759 +5267137973369921362 +5139762866696818267 +5354604872598757520 +15618641120352995308 +2692402507216608474 +5569713876685690399 +5303893136053330930 +20023581611733088 +240752727952 +7010774963578297952 +7010582259828801364 +2571498445011814318 +13518427137128011949 +10608900034458883460 +18251414087584407842 +1873618446047000074 +1625764294068491010 +3087644374183449685 +11200184723116089456 +4288478319656573806 +16392015933512377269 +20305598014103059 +14284319595218536933 +16778196032097772120 +5564423899624572258 +9870724725370766 +7498048152822104123 +4845465338180360198 +18216462472613335728 +10188202051867074411 +15419996325110949494 +1413892625240176671 +11770418089422175123 +2340602664482724156 +5677488666789680160 +17284241873202253123 +62587308 +3595101200951814007 +14581169549126144645 +6217756202676476376 +11267527389334618800 +5353476845680207394 +1009849209434040920 +12459944628211158518 +10381427610856607361 +1127379439846057552 +92046654288652221 +6153353771414852297 +28202074486411335 +13142408804399127333 +5408700909154273182 +16541217131543944773 +15291089452347438233 +2762244370736095043 +13997748926836315018 +15455291255839461031 +493028049 +15386425677266498997 +4131548642012252118 +3114538281987237286 +2708976476004039483 +5675796559774556123 +14577821744833698384 +12611813836229395775 +15288269275423853885 +12273668189219868354 +6222624972888758440 +2186325960811878780 +460070945943400882 +322438576604 +933797253078662243 +1169183797852975017 +15291935523052008381 +1150936637841813748 +13779050269725704598 +8872404186873143403 +4557266064394185352 +13218864784511934578 +1873618480441009316 +13554570781515733916 +9083528074243822090 +2137124098070487792 +13939914291973597548 +12461042340477994821 +7937011839436941273 +15001411161533994171 +12918763884443032566 +2477484405147109478 +12270002031873438405 +2964529530791004471 +5554590329646836331 +12870531944683031140 +1040015035110288485 +8061322060390424326 +5139344024722491866 +9870724654460685 +15292781546464743708 +15292217457772293383 +9711761797445862432 +15287423239113295511 +5566476571519174028 +16624934093420770430 +16891877741155669200 +1309279186 +13514637760944299661 +2103039519398517940 +7558005285896668563 +3491703518462359532 +12546578409924160440 +3599083429718485323 +6527914536710590845 +15292499474174659884 +1683466373830611126 +15287705255515659331 +11967766942011373101 +3973490958946807768 +14899112496185625611 +1399263728876725341 +4237766514325588729 +3862478902368495489 +9870724717440878 +1873618523430913566 +13553803722927005579 +5566476515631444461 +11457498694881204548 +356832576945 +5303047112639324675 +1779588998748321875 +6043037530811151510 +16269347687221057205 +1623790127659823020 +2902127743481092894 +5782296448490276391 +9870724565200350 +162267790 +15833521322698556906 +3612294399218565324 +6155045882727705243 +13541690364288509400 +1178413957016676542 +8964955323223990970 +6157544065430409799 +4392112055940232566 +8779161831851708979 +718482003762831626 +3091655093374636604 +15292217500762182973 +8503038897877499370 +27638097568149634 +5349308051975768286 +3757107087861900335 +17709990179064587122 +17070057731888866898 +396563964949043588 +7317281017782887935 +7902856098401039165 +2848264744227112681 +14383042897925905 +10355204779802699961 +10544097276377701008 +649523351715278029 +29894155705926710 +15291935454266473205 +15234599434631467397 +73007615 +11205710403273436510 +16349879387953253626 +4972924312701182147 +15287141235607490430 +10864261424787435242 +13493553732200251145 +3594689160137555899 +14749580058850431038 +4936630674612434035 +12776044093064171850 +4311555920070072799 +1839046014816112224 +15210380791804351775 +16949958178448694846 +15291089473843638339 +18412545943079354421 +6156737976845022083 +9870725381451951 +9092628471287075312 +2211128563329405182 +5639662680184522626 +9234281886090274342 +10093801156340113087 +12270241394066268617 +5270336608174369521 +2731036116808393250 +2791696649994247683 +2625321610894509848 +15013142589108989807 +683601591743956814 +14362448674145701454 +968618140133113449 +1730572006983552188 +1251604661740573147 +3503689018008802816 +9870725076971489 +15838615109059692607 +1045091347555572946 +7410122214366188457 +4271541608539435581 +15292217487864370536 +14517333439124148865 +7867731145761119243 +15522876928134299289 +8485238802855575368 +8348067735518779600 +15449764483597276210 +1873618454645376983 +15044168332394908578 +11302413713303422302 +5845303580646983784 +1682680391473966778 +4664511679772257603 +1576462553554622229 +12637906923281008316 +9870725139951701 +5657220616276285624 +96258139764429973 +4449920229648385301 +1735930378822372500 +12468953183566632336 +15289397336735166811 +2574671757413523702 +828707450676270418 +86874509491526621 +15291935441368662603 +14264783202905229777 +5205376347324958458 +7121956618369834684 +15287423213317667901 +195728855029993574 +15266602747302210639 +24535861251037814 +2126679883759828626 +1733110154606959563 +7958545865408520232 +1873618351465850417 +1156159001496396937 +540148509 +16626344201227801717 +4906279987000070639 +7880607085181409412 +9112408582863789638 +9870724575620628 +7528330190111771360 +8702030264114888712 +5578192988051217966 +15900243832281254881 +3655028339501247790 +3757953089780928483 +1587560752945840755 +22561763627919160 +2703128350473981494 +15236448206961530164 +32150347115356276 +17060099068230511987 +1841584747117373121 +32432337723332906 +10206308959848636649 +5197393303226552183 +5864196255233560149 +7621113163540551797 +5354604868299326678 +5245848925746498573 +339348407917230179 +6439645968086880043 +477206431943 +6536459277275959881 +10907711515386137331 +16256728505823085460 +818348984 +8968810874855580131 +2282846157843681614 +11423179042542917404 +29330122899915877 +9870726386643216 +1517290337824231317 +7563171736715663699 +1998795787700683642 +11129919317818562411 +3973491023432910866 +4769750103251111516 +15964011325160449108 +5597087998421639685 +1873618394455754659 +10389574189450137169 +2849674899325986851 +9140909979694467183 +10110062484662004290 +7691476948509801909 +13192410188561598659 +1543385872365455415 +38797665 +1253860853150016441 +513868514 +12069467635392588037 +1043963281944824692 +14119709292008646544 +14807346631528952338 +6044200327771986797 +5898538595926558108 +15229746926250509951 +9944154806538146035 +2908722406568712338 +20023667594041373 +15448636417986539993 +17096405994488945631 +15735363948478410632 +1254142869552393167 +1575334487943884750 +8308743801508344564 +11868171643902370297 +7617164959698395055 +2122353976881671016 +5303047121237724520 +8973743832958987258 +16893851890367073119 +12071665527435578910 +15290807375757908874 +12862400736238134347 +1251322692628790210 +12452415912620740666 +15294191632778092927 +4549651526938601415 +21715624137793660 +9243621125592585510 +1496594138781207704 +3431353251379022211 +2575517759332551933 +5672935479475454568 +9870724567665640 +13016990407504891586 +5995296139937712949 +1873618476141585909 +1873618235388477826 +845263594273926538 +7530597739947974063 +11703165067112811597 +17899266289968246212 +13199473924122950402 +11855576237428332276 +7621890105505615217 +5149655466129644145 +12517601 +15561507287535474944 +7093139022160611136 +11132295908982535130 +6217192178468866063 +6751981162579320768 +4260280137820818022 +5709455775385986273 +21715714419532687 +6098975817335843811 +2940293779302126647 +8756381313640916377 +9249947973043689830 +16223515774062061200 +5780604294185817980 +1007582080589896420 +1358843158941029332 +9870724845891518 +5299098844309358384 +17572194368664524043 +31586288514967785 +5367449393432045281 +17939033673395547974 +11857279359260376390 +8748870389615382160 +13888965320037777631 +5978709954490143806 +1168177902682841426 +1500709877 +17017082289434552528 +1093547034561633919 +2895096473862364211 +9870724586040918 +3399294712070083852 +18062311719789092437 +1873618325670223662 +11644549529507011107 +2312694796414818879 +5387767117802386818 +6223496053747107521 +18378960206721262100 +2676033356038342054 +4394978100893324398 +505938649 +933797283173261605 +305241340533 +1357371525692476491 +32150321319715921 +14491738855722920114 +417112835609402702 +5565348540301200619 +12975962075634804085 +5827908583197730729 +7920022920676787389 +9289441360304167005 +1410790504998716838 +1731418094882413519 +619524292868968884 +10241156380278788270 +3599049366103018946 +8048709532783502555 +4453304323303091892 +17258975944297110741 +16887354554173778420 +4089643788213312962 +1146796966022299944 +13442938475988135687 +15287987211730885383 +11749368788646437812 +16407321096609884500 +18359396230774931898 +11477488059062643126 +2493017522174180035 +98949053235148830 +10321765646545201417 +14371231213321064289 +11411381048698022027 +5662169602703237900 +11447466683868069218 +17304882408674447732 +13674941621707869313 +15293063567167346447 +4449074111654484175 +4022228683851447523 +16598074354033640028 +15290807453141854619 +6158508796651131912 +17595811302773695449 +6366353527348399255 +8976281967684568313 +2005312459877070147 +13831923444270048744 +15162306765777287167 +9870724667371338 +10433991425051733135 +1783539909142801832 +13317189854312680814 +1041425151515709464 +15293345583569715548 +4587663 +16269555352897260337 +1873618360064234752 +15014118480009389681 +5778348193056908180 +14855100630956003279 +2219137191900110240 +1167613826886937938 +7031431794891230329 +7294584453511452270 +1213881515119032521 +16424510829738934524 +13885455448020813663 +14588745702599124932 +15291371485946594679 +15289115371921104476 +2625321606595086582 +2000205839620003383 +11284401197926521959 +11867442981773582574 +5386265453423240867 +5459935770830768809 +9292264724512183604 +28766124487949253 +7513570841892306841 +292343539712 +4505990290743308128 +9870724578111017 +6811297603217987312 +15844590092894298806 +8872404204069936719 +16551960241296127534 +1873618514847943875 +245051692451 +12761270272872832014 +5675796521083606344 +15331568397282526409 +22937920 +4336172252441697013 +283747624046 +7679094872898478177 +10162212535131642289 +16590518809248349633 +12267100947878853760 +2885579442800453906 +1996539682273585847 +933797214387709517 +3861350858252693122 +18334960126899609847 +14261398347457713356 +12215428632557588003 +5484156184771908956 +820839372 +2791055594105669609 +14537520180616050708 +16166203682344470241 +829835563577139827 +1306875073128314422 +11631533293991107171 +14110783995741286743 +5052897285140736913 +7381386115053997667 +2578417031931842549 +1122939678161447148 +1519546404560392869 +14899352331662474665 +1880166564500878695 +14960942274325655270 +33560386136860103 +32432389311653026 +16622291808626953590 +12020126521146284939 +16640655536860116811 +15210380774607099104 +21433663625647602 +1128367921616073972 +13066480717661691438 +2401528341966757437 +14620461487359796686 +516358893 +21715680028025958 +5566476532828217200 +5164964879650075300 +8217475251387770069 +4549319921336082605 +2953140654074110272 +5996142128958944749 +13913370024715953063 +3794911060389076311 +15290807384356314133 +1750012465928096543 +4396106192298003813 +973176372562562623 +4214260831948204002 +1873619035023819627 +5888547768152578608 +5196265155932479355 +4123042299099244070 +6170970406806039114 +10213320350798195203 +279445706452 +1489278225787266581 +17635078661888022901 +104268357 +6206603707174494097 +1873618484739969544 +3961803269376778662 +9870726147633399 +2878633960883894675 +8929320279979198383 +14753586224036986487 +17954672406051492682 +32150286928190454 +14968750135525203533 +9066413016012831205 +11776869488740732856 +5165479848049863994 +9870724570154139 +1321374866791225441 +27638058877215272 +16779888195001403874 +17489329782737553302 +16105232738814414011 +996859147392268653 +15293063541371715101 +15946107495807004929 +10803158541742988955 +19177618384441555 +7725532711669747040 +15007995 +10107948260015808471 +6013889919468112625 +5075826107042959655 +5726226344404977639 +12338342844405666058 +4189674835569746407 +9870725108222074 +3652299344854268655 +9870724633161448 +18895546094344628 +4855564880837354868 +1997675995964263901 +9260690873320296002 +1873618527729898969 +14681117629873535555 +12580737018025683194 +7996312456522828750 +4396106226692024875 +987047132950588881 +7675110305344067428 +5512098561551178523 +5903884228619468800 +3391090882758262416 +3235602899388870348 +1043399313624930507 +1983843766235893693 +4133240804915886047 +16948240915154486523 +17742190806917454994 +12452346148532267913 +17101493343247346679 +5178673286195206068 +32432320526091507 +1518418338949648936 +15291935514453162439 +16414263447142622231 +2014710471177341259 +336260399042863080 +5883901131227671631 +9519547041493441912 +8092337213339626246 +15148661806921360505 +10002765370978680203 +14101030794516675 +10194768969801421359 +15990669684775926933 +3107487039925657872 +342168559047680009 +4127600485458992927 +2857298615696367997 +15289115337529569209 +14105372412283336343 +11257655704925647588 +14383047196894228 +6534205820915173496 +17588650080108762763 +6044165549130848216 +2120969840294697791 +17061252311616073449 +3305725656990759179 +1413892651035355863 +17269866578628118199 +1629160452 +17939921402619503591 +4500349911100511435 +15751385920443471931 +848307201366769769 +9870725081952250 +15287141239906460683 +2248733617239044077 +15175534989820758889 +18613516794161272 +11415541602622652535 +6208295844281716226 +9870724822101941 +5180846380357855567 +1735366285829233084 +6270921144476986130 +17675064730110880072 +1156159018693184642 +5226968278523865430 +2862749066382827758 +12891357079079096429 +2676033351738918494 +10194769012791331076 +9434489230345442581 +12485701483292660010 +5737445799556816897 +15732261763749585621 +5996988229755612084 +7078069 +1898563669680804391 +17937314701596961092 +3226894116475051476 +12332399388405471413 +1734802321808775761 +7999174347475655529 +9870724625231543 +4023356732264955514 +7267063644569869162 +1789180305982382288 +16472192147589715364 +1732546207783272447 +15291935501555362548 +13774681046469396723 +7217281392195428544 +6760362462859051162 +2986779679269670510 +10531295803425490030 +1873618458944350262 +70058456 +11423179059739703103 +17478191075909310471 +13870893533125482736 +7592843752711738170 +5458848625792321791 +292346005443 +8444842522800103874 +3224843649007113659 +4859334315770257462 +969895095938328101 +9870724580591492 +14520872225952834355 +16147977269735330409 +12528092938894650503 +18067928196024961188 +2479344660154231099 +14173844411273585799 +11847668763332905754 +765623143338102316 +340476486426573989 +2430137667171543966 +16898924885523778974 +1251040702019101912 +2458721001654542508 +7582142304298878802 +5726925958801533323 +9870725961183448 +18198700987292074997 +8560555302365764664 +8977564960575146578 +4581098863734365568 +3760491254601107959 +2479908714456434641 +10814935468779594374 +704211788321214763 +7399947620026755330 +5726358067385217659 +5944302339699318892 +12076020769722998854 +2058763787074868328 +13112992413210062431 +828143392077143728 +5888466934314577524 +17906457600546132182 +1998795749009734724 +15041760489058688879 +1839046006217268349 +2169010470996550942 +4844901240887796957 +15291089465244782970 +1873618355764801595 +2146416170213458127 +12651296915322449285 +6204347657635114456 +1945545860538981733 +8208459314266444457 +11349795265056081195 +29612220986426501 +196018851 +1207319175418679072 +15290807392954681807 +12430143112327668333 +15287141171120906789 +8204080288372441867 +8589681866025085258 +4452740299095479899 +1873619043622217908 +2538093795179384706 +13759961812146327257 +15209512063275065539 +2470411705094912009 +6995794499111751908 +23125822229068146 +6847414099676511010 +17781311662180019249 +518849275 +6014764344719122946 +2949113337359051361 +151388766 +6072517587095210716 +10757572304037030607 +681145240220994278 +21715594042760702 +5467162260599689276 +9870724661931824 +5303893136052857401 +18413674021587452000 +12711298285117582286 +12555384466454679878 +1992870723794922483 +2625039555799954638 +9375022852979973175 +13398747230802297070 +12450654063013346239 +14112717427891575603 +4222974932765321669 +1531970550 +6817582648182052808 +7574840507107849748 +4160689491693538063 +9465450922507978252 +15289397375428141840 +6752710054334784950 +9956504490212272762 +1870291157349243051 +12221849008989087470 +17048302877138692743 +3205275690303577170 +9870724724912010 +7032232753418799293 +5904754005996289417 +425617657735 +15290807435944613720 +16715274738544567896 +3754850943743826408 +62128549 +6657752876032334344 +644809585 +8910270495613596116 +14432416785660194708 +16130566386565000361 +7802741255131392419 +17335756693960734132 +3597075242686752713 +3476629963489628471 +17082847199017054997 +2127152955294949317 +16430151157792989850 +15658106325223105992 +2377838594154977882 +17528419486886937870 +2810974000445020789 +7532698519301658034 +7410122240161363455 +1093546995870679503 +15291089396459262839 +16167004640872044577 +555549513 +1711003895044523025 +10426013281285123563 +11107255586326716075 +4542977953292181740 +1873618480440564107 +3627346684540362997 +1873618239687443648 +472260363640918817 +15287987228927658628 +1130753852548581517 +10017283030214857173 +9714213870878280718 +9660733658897405500 +3433396216575904996 +1939298784770472068 +5611802251081954706 +10366338427178395488 +2880981461845415533 +2150012508394500335 +15292217457771816444 +15287423239112834480 +16490353754747378113 +12797764150862692383 +15350594853131544148 +6362646423635301357 +12637664203334294446 +12426955395954661743 +7684773666153369644 +9609301821825048355 +2676958769323838072 +98828841 +15292499474174201660 +1013994978357030854 +1894834119695349446 +1096085143494092919 +18064849828721533845 +12271613223219967199 +17113993018971653874 +9839328478246341893 +9870724716982122 +419198082166834998 +12919891971549513642 +25099894056567435 +17774139000913997110 +1840738151924108521 +3999491556140988764 +12290170445125525438 +15290525376551064067 +6285656664117099449 +878291186098312964 +6852208339831704070 +7346420205808269193 +2390363305266056430 +161809033 +19741612499481965 +7359731993014186103 +13819010092706153 +15727504891592256893 +503001580666 +7535534626755209562 +5516046795487905107 +10841245920951874471 +10928543513068909754 +16058886126200560755 +14101026495090230 +7892576904429901915 +300944406955 +7417465694346879496 +1685158442153086482 +695721579129423937 +13237708531286474753 +9192560819121705106 +3708369393051378327 +16294470476861877807 +5351401868216249106 +547619651 +7232168222836091468 +18411981936068526119 +7217242495543827003 +11110227781838058961 +12931665209779500612 +1758695911178920337 +16436648502584675667 +5077221417231718406 +2361672031574117026 +7323697768562888684 +15289115277342423135 +13012951802393594980 +24535874148371011 +15291089473843180090 +1518136387032138738 +352530227342 +3017170401495030631 +1873618364363187009 +3518888985913544667 +13603584720093929138 +4452458291291502488 +17772450798554326346 +10512763733196344280 +7000024672066936101 +9180319026196389144 +829835524886187990 +8191639847504198037 +15289397293744809590 +15287141179719314021 +2330156544374102395 +17106287592000938743 +5458882189218630450 +14444307181332217228 +15500170349394156251 +7297866959562557186 +2625321610894051277 +15638758361096012879 +8484674795844737857 +90898949 +3642730769402767173 +12050109233578648248 +10022411206577762020 +16610466999836368841 +11535686880442518166 +1873618501936749741 +15332977698522083733 +1894834050909808774 +16118460740984119716 +1788616212990474511 +10383940898237787832 +17232425367480120205 +2051763651168983896 +8247724729662718687 +1945545813249644335 +7559355238254855975 +6817300666172465438 +17804060817149290750 +6364338479060431015 +1682680391473512030 +153879145 +6310847464667504478 +9870724664422197 +1571668334895195255 +16871265277961258468 +3863710205770687555 +11134268303975202389 +8952102020446185417 +15292781567960506285 +17983605292098138481 +15291935441368196751 +11723954811401217226 +3805996753169486874 +4116049767552788635 +16264239859293511575 +755605599842665887 +5302201063430498020 +14318336791419094928 +10530167746413138653 +5569296714050766113 +2624757831738987215 +524384476410219715 +15158891916687599493 +6062336577242804924 +9870724727402396 +1975195056849368297 +11868006962989588983 +3581589705084462578 +7908136693532397299 +1992881794502054655 +10398945702374747125 +11886734577802823285 +1873618544926664743 +23689687366442278 +9870724575161870 +29612216687004362 +9511403330002238023 +1721691155707343020 +2667375046095868443 +14164087045804009342 +1810549070062952395 +10184983752152594755 +6100103857151763270 +6482778696402487310 +14665351642484132 +2360543965963361474 +5899384632236658031 +19988781 +18413392000885653589 +15523259351279816326 +1413046597527538184 +5245848925746038203 +6214288376001339106 +15289397921412557936 +5464488953846367762 +1873618248285833987 +817890229 +15288269228134054069 +17788243201374051173 +3666742262745024072 +15800517529231567368 +15788821327926683231 +7232168244332269176 +9870724593512044 +10601499767804420972 +8231778572019507479 +6948230077281624771 +15288551244536430948 +8573950948667123664 +14251614053267038119 +4081176587746820160 +12543183189674909619 +8230264281180874423 +3144139388416897549 +6222561461948786969 +4776271290304051586 +18059686201202923591 +4131548685004197426 +17360130279526049907 +1707901753306858177 +1873618338567562765 +15282335331238171149 +17029239881835098450 +15292781499174953242 +1873618532028844481 +6208295805590776065 +4610722469556733799 +5835546298267154405 +10858584038397980982 +365430509197 +20587481142666792 +15290807375757459451 +4281709749725582768 +17568491447002927594 +8010807090019981365 +6361518379520760264 +15088171056968838157 +7140469779641603461 +7631571661644636648 +56689033 +615983703564506118 +3812895115358442199 +9870724567205432 +1873618476141124344 +29330157293474806 +9870728842867011 +1992881725716500459 +16968560352284789454 +164299420 +14101035093482044 +10669580850175044615 +1873618235388012728 +17578627655170873754 +4176619973118812478 +10168145894407475150 +2208983649183361712 +8562440839455131857 +16125995642212196647 +4736709352635442692 +17892584866493510382 +14383051495860563 +31022281504130688 +363083995903235930 +1344877224227131645 +4726293920948114221 +2152498386425571676 +15287141244205411809 +4736154307999984795 +178894730331826853 +9811915644288326219 +18067928165929933125 +18331530485106038 +13030536827766908636 +2201358208687543476 +828143409273923351 +6518315999997604315 +5600856300322704870 +5476681269618501962 +17173772775954340575 +12024369320098816403 +5233666061547952748 +31586288514511967 +2560646847773827206 +6011633796843770852 +7919238245012887666 +17836201875985084363 +17919844754924970592 +9870724585582162 +880547270030012452 +15077663958368330283 +14666204015190089342 +8795062046652785298 +17181303967606598644 +11914531555884803839 +12430143129524455034 +2703776923039566000 +4081118926168926035 +15287423178925691554 +30409049 +5714281067256570588 +1839045967526304976 +1023971964627275679 +305240881564 +7203140932802196195 +5168067017089108089 +13124892544800151572 +1837917970701103869 +16971765374768662730 +15291089426553840010 +7419439787670579582 +9083528104337936814 +9237398406700944873 +15610213152337836067 +4198590440937252335 +7461292442228047400 +17884749925642297805 +16370022170573628370 +15292499560156500686 +1873618463243313017 +10132679198804493652 +15291371442956212789 +16624970696016684824 +1997667691996140434 +5471876946336702063 +12711298255022536176 +15287987211730425310 +11573418911012687526 +14546139816234006221 +15288551266032627807 +11462706732688298236 +1964052948155834628 +27638084672359236 +5301072929034220860 +17464068217539357148 +13079641753032482378 +15289397345333094613 +4290363207494747774 +7680096117698872518 +1466296550484425823 +14883032307819946855 +7138020617540222714 +5432665589306955883 +14323674081407546017 +18331517587307546 +15017509038007928224 +9870724666912579 +12449525907122111588 +12826485628248399696 +18323667541285735009 +4128904 +1604222041517222020 +7831574733158495529 +111739480 +4236920417827426164 +4160843276758431510 +2231065564965654196 +883931514152371511 +4220426712168611653 +3343600032677123697 +3546645539740460961 +15287141175419877270 +5791618305623086570 +5364833536275073612 +4768855712518989646 +5991347923197297866 +7081065208486770564 +5251489279595719675 +7403415882492816201 +9281579479371834788 +2632795093490147974 +4183106466458587939 +1873618304176056086 +292343072917 +14106448213992947654 +11192683727072993200 +9870724577633247 +282329787 +17317394463704378153 +6538994922516330369 +18015366771710781736 +1873618497637320883 +12016354495582791768 +8661218532942428575 +10161084465222725895 +9870725375553673 +4821823627577277410 +3846918201996101899 +2625039560098916681 +15515140725455259155 +1254706842170769948 +14585694186667845534 +1996539682273105760 +2593041312621538694 +9840703180694622367 +15292217474968607344 +12341185141155571976 +389657826981848491 +1256116975773434234 +3078915691674810714 +7241607903360452069 +5455705550585815343 +19459621889784375 +14882162462681157710 +6752362138726910032 +7211896323698020271 +15292499491370961900 +14953027591898089438 +14288223544298637564 +6617165672283455199 +10646954815923686447 +10389511585066853968 +15290243377345471708 +969464150650086172 +1446716679021546401 +13095430805592297846 +3703701212822508850 +1414738700243260075 +8907854006114207270 +15292781507773356908 +13228094678249647812 +9500100639957455206 +12749642744079142882 +15290807384355843081 +16981577484988142705 +12032015207363327808 +6527795407247643362 +4834026371680396801 +15303934884387514001 +2425970205372789517 +18115860927276518423 +9870724658982683 +11629511912559630916 +16106595315836918048 +6988505136286148475 +42646132887022052 +4009970419794318076 +103809598 +19741582404445940 +4075478628208226404 +17098380143699891527 +9409940536470619824 +13440677118037216055 +14374489140240718707 +7728888387664095702 +14101043691874089 +316743105212861685 +630507990033643494 +1873618243986414533 +3693013825975704648 +3067643081556509090 +2197615060210497056 +12918763888741541500 +11035551046352115834 +17316185090121142111 +14867768737580735558 +17834598689514932644 +3548619667455691515 +3419798537829503953 +32150286927737032 +9870724569695611 +7232168240032846976 +17092728744939514339 +5246976982759185555 +16686197489590145649 +6366353548844142179 +14956022666157297706 +14549236 +984791074812357906 +1466296524688811093 +18020491647878438364 +1039169058985962320 +5075826107042506722 +9870724632702693 +9870725107773477 +11846258745807157786 +451651595101214053 +1744643526947965735 +17960694635470203856 +12134075138934905534 +5057900949532007744 +15287141196916085519 +916886386616789870 +1309570156344596867 +3759074492607578500 +13160497683558316171 +1309930957234400622 +32432367817468333 +10405159077555016828 +1411918510421854705 +13819014391673640 +1413046627622140536 +335132329133939093 +14698926283648945007 +313839269826 +13856376426038758998 +15280372687172681084 +4505144185646755845 +15288833321126742375 +12202104656846215387 +12639568460295859242 +507970270 +130269948802316597 +1945545830446414827 +18895442914330893 +5939616209889352631 +8527958877232386867 +23689855034611600 +2547693354791554234 +6368045642961454306 +15293909556188099630 +3428442719139206757 +1763267035865826739 +14101030794056115 +18092303388892535561 +2147544210029353653 +4497474548763008482 +9870725126123587 +1416148739266013489 +7516607870825792868 +1626046310471192681 +4123248415797548711 +9870724651052808 +15289115337529123693 +5782296396901073471 +9870724758663072 +16735523999088842742 +20587614416801674 +5821427805628356681 +1863262418076310920 +15294191572590475811 +931541121857966842 +1735084269426395041 +4396907804627190264 +95879699 +4291298466487164422 +570950482 +12835102467578283812 +20869630819191535 +13722190593283397401 +16264239876490287298 +7886126055876010926 +17098380074914368426 +1736311827 +18613516793692161 +828143404974492499 +8381221261987290361 +5461950776127924540 +3614677512770042578 +1416712772070760915 +12756444180814570485 +14283689328129696797 +15611911946388048179 +10863460857323277333 +9338798349572580563 +12680871738743995051 +10049393462884911430 +15918694743531872564 +1438028811229214629 +20587704698543653 +12299112098695825484 +6619310 +13967031891515626223 +4452740311992852966 +13635985670345019005 +8697110475982376165 +3495087685201118631 +14924185920193845569 +2844746665847494048 +11910071071167372901 +17528880777045748397 +1837917966401692782 +15292217539454707519 +9870724624772786 +12091006119579689941 +4791486465568877450 +6097847786117412003 +1090872780580343742 +13427220419978791304 +14545938481900237263 +1788767126380364008 +2688678224348593483 +9471809451295073982 +13829530681148904888 +6155045865532514251 +15291371438656809344 +2625039568697304550 +18315937179320329975 +69599701 +544670501 +9870724580142646 +12071407172208322309 +9870725055213517 +4451330268671929787 +7513916585351133736 +16054777199195930999 +3232458045602339934 +5285128043064141347 +7036226112429884975 +149234510379562338 +18423314355843966009 +7678945449722403828 +1413046558836596419 +15292781572259462849 +4162099638193575095 +18101357742043458900 +24969554 +1466296546185005596 +8483392165818293805 +17868270199921204344 +7418687625812580570 +13686216125481182314 +2333071329017083821 +16385508504220491987 +929917219948138411 +13515888989503709570 +8777599967579353732 +15287705281310378189 +5885976061401368013 +1873618355764344534 +2924009083864431451 +18411699880973959188 +5109458786874124794 +9513397450873984246 +3629296517427308347 +3007978487467760159 +11900417579466450762 +1174225411868473504 +16170997999883128634 +3650607259334888854 +262522563498547139 +4085763651017778927 +554040249371736581 +8208177241975903742 +11050223150350485111 +1174123413979997055 +4149205691846701090 +2316381565674273656 +16893287380996526150 +23407812836603577 +16795611013703809705 +5156152806621458455 +1359483596465457173 +830681586991904477 +9870724661473067 +1873618493337898614 +12020808312486431384 +1734238246012407593 +11791289438853537418 +14344603765597551206 +2862105560400663417 +13960824438201266102 +1197790749064241857 +2625039555799491926 +15290243428933784866 +16248903974505166584 +9129110564755681516 +17947829764244066139 +14665059300632856 +11547019543992076059 +13975303952082487911 +3599895466901715860 +18331354220614263 +15289397375427680551 +18331547681905956 +5348239349666947951 +2207492698791414354 +13480098052608171793 +5835546358453836233 +11620459496146295973 +17822531669036765568 +14947075702982868 +61669791 +16355799333387181857 +11722959831148081636 +5716464859759119898 +1334641629 +15913750286224409138 +4131548689303163373 +17581471348885307826 +16096830904991034069 +8973926108277324499 +22561802320417768 +1917322269 +5865888353649363875 +9513659435428876401 +2427623891363173227 +17192339668121046913 +9870725370114162 +15289679310147961308 +30740204913384535 +297272777501250753 +15292781503473927054 +9203109967767622714 +15288269275422926553 +9870724635193088 +15289961326550343479 +18045759934914912981 +13819022990066963 +15291089443750627470 +17608376027316034956 +10396086031845777063 +814941090 +1479528444216158891 +16833730410848479826 +15291935523051100092 +2156289463756081271 +830399583486104185 +16885380374869314205 +6377932383429094517 +17712185275002068954 +555090760 +14101039392448290 +1842511416005692464 +10215782083327823122 +7512697620068975190 +846986163917831089 +15287987228927224354 +12613788024133322735 +20305632407192782 +881905249637191548 +11241814380293784908 +2420599844130600667 +13962979271623790710 +510460641 +13497440626312435062 +16107267423789995645 +6101795998557937562 +9009022494402625323 +1893141995484240987 +12761270247079242437 +5868888317270845623 +15287423239112381904 +18279507473155497810 +132588445788167395 +7161700558465288979 +16205457387048549478 +3276187016433442479 +11194288657586867398 +1956852058824708204 +1357540577836543633 +1873618377260542172 +98370083 +365427573343 +1954315371909098518 +18097467579192382783 +10756726254828199887 +1683466373829699898 +1005889904790015849 +14167941469871480535 +17022546770964200564 +4635205151382007238 +9870724716523365 +15289397306642144628 +19177605488658112 +15896859674142005088 +10170797497109462098 +423114783877513964 +15288269309816936216 +3808100943988341509 +12881181537194283769 +1289442601154385686 +16977612306074968195 +3142001183678086952 +9870724671893333 +14313146937930355601 +309539857468 +13819010092244193 +11683150429801163112 +1873618514834107947 +4977791693940394179 +3040117549151964122 +11287403619712656532 +32714379920409891 +1884960856243917032 +4710890694338818471 +9401014509618282046 +5349367342193968413 +4078298779338676329 +15240694497161794181 +123222913558127603 +12994192120810323587 +9870725102333977 +14155843358497331372 +16180994959163006217 +971869146271660957 +5565348488711963913 +1732546160493470147 +72090103 +15291935454265555015 +15288833260939595426 +11286969433908725923 +5326128019379678298 +206360285863 +5003335381653079112 +8874660352487273105 +17945855688117137066 +3706395295427792401 +1786360081768990303 +1839046014815186337 +21433680821964313 +15291089473842724819 +22279760122415532 +1873618364362733133 +15292781524970121926 +16485991221836262403 +13730025380299361477 +14407856235795454053 +1838763942525097708 +8744196618956192434 +12131998248365143829 +18371162975441852924 +4000906973558224917 +1785796091954143467 +12698591854931289690 +15861615971894123096 +4172389696983602145 +10109227365611624152 +14672693143383258939 +13324948904832359377 +9298403556870984109 +13547746171705505851 +296642035356 +8328637008159452159 +1873618501936285414 +16271604403119015564 +8052459688593612318 +15641901585737789440 +14322803783379342962 +14664602498504613938 +2625039564397883787 +15425072624657511583 +16316925693461604277 +45810044 +3884829294353720523 +17569748279156551491 +12613787998337703170 +6472358642045510589 +747829823970020707 +9463915751678819098 +1784130019891160058 +1721745878105148797 +894686142499726146 +802207808143626134 +8910392170934395761 +5160383069858375872 +17462940091740217520 +2719268023842509177 +21715546752964327 +9756520449420974403 +5668141230723449315 +31304323701671300 +13068860251950950089 +4630504023418150880 +10905173367761798655 +15518650097086176128 +6100103913039007254 +31586314309668386 +14472011330252579887 +7884312806825598540 +1776768899207752435 +1873618351464927273 +15292217487881824997 +12157859360937101034 +4705842481946503761 +2698559735878266921 +16645742821133206863 +14105033451515939293 +8807982124992894167 +15130493023850933933 +9511403330001777914 +9870724574694707 +4286889866842355829 +15288269284021312040 +4501477955215362649 +16579436683666002194 +23125624467902882 +331036056085 +5722409915130923327 +2685403204063663343 +6078575874687443813 +10846196352290801878 +19530026 +14481165621045246016 +11859972865562602476 +400166564590865919 +15291089405057188304 +23407808537179928 +14101047990840068 +4510578561880249213 +4432466727995060199 +817431474 +1873618248285381924 +14622810224014617567 +12272177195838352366 +12913844036114207792 +3428442689044178771 +15288269228133593803 +3541851256594893702 +16473811078916435318 +1746899701160150410 +3650607199147730969 +17783567716017909659 +15291935475761758493 +13382340243164124709 +1871883496280168971 +5995296096946884737 +1873619129604067056 +5878959376267361340 +18204249488608200784 +2706496571107648539 +5511666307615174192 +14322803714593785119 +17819208509888008897 +4472979847181974054 +15740733274947783803 +15293627599972422653 +1041707167918414475 +17905516655205033447 +3172873313800750756 +3125653335454853738 +11471712530814412590 +15290243368746636247 +1944044206891624561 +6189500847497953495 +17407775140466477312 +1785240324424088740 +31022238513759415 +6311975513081787665 +351107415670408327 +7914451125984965228 +4423402962283488782 +6205434785478358745 +1418462186 +16627944354070161120 +18331487494741982 +927164962729302643 +6621247738664280395 +2576160900711141952 +1785796113450349986 +7601906463523230503 +6249688395151850832 +9870725929005268 +9870724611403413 +5065688602556577819 +9199495963937421701 +13819018690639279 +6100103844253474362 +16801251341757864463 +18001524892029102283 +9870724719013753 +15291089439451202924 +7952683120371521736 +4608457496156914403 +4657106642463886071 +11769801357615510280 +23407795639356361 +11484387203384759226 +2043722288069349731 +6787015431626370124 +9870724566773228 +1873618476140671980 +5876790318555282101 +12962168919906468639 +2002437706943182625 +9046771106483169471 +2073238781901429545 +9485530111972878783 +4544359526476835601 +17438945520885436798 +5938217001568447785 +16221687395840842363 +827861392871080603 +2760065766243124424 +11600084 +8662827860221301587 +4291298470786117111 +28484176870181368 +8647619234969444302 +11316617531700238300 +5762490722748215607 +2366626233766252409 +1867087476190701904 +3692739666077180577 +13590834881984402906 +7029736260327332256 +11777433560238018326 +5142301044413893172 +3544343203374192827 +6151097687483029767 +8556747548505695628 +4282792076282319716 +17956915698262956945 +10534537747099044130 +9295726340262742844 +8501508317230011806 +9870724585123408 +4255178349871969606 +6624249281482940323 +15290525419543014964 +14444307189930152514 +21997696430718449 +17283531675898625463 +12236526254365951093 +15293909603476986276 +3595101175157759076 +352532251130 +14734581879071319501 +16876626903155560471 +14493022793443918354 +15287423178925237195 +1038887003891386182 +8101959421253346745 +17648172288953812474 +5671848295744364466 +12281502750000442736 +15291089426553393380 +16618104504963845893 +1734238263209183362 +1945545821847563690 +1180489761671173550 +8230974269260241971 +6868482976761263284 +15287987259021805869 +14862403357814377215 +11515458523954554775 +9818770033765721840 +17238671471831224689 +2625039572996268751 +9870724603473531 +6101796028652529813 +1997667691995674603 +13141210974699015703 +32432303330887118 +2134311698689694582 +1733362705 +17279716321830441725 +12240192446106372977 +10508045930744260520 +9248819890236503964 +48300418 +5510538211911092248 +155910777 +5151323916267252476 +3387142644522431930 +16589678623912640222 +9870724666453822 +4397798312210032146 +10972264154087446859 +1321272283 +10675690836223986039 +1873618360063307268 +1995137917125477429 +3670145 +4662355858196799239 +20305512030411274 +16195361978665280756 +6989558869551239430 +5566476545725106758 +4534407047512674210 +17274361511201155355 +5693180783976147096 +9224429033553684065 +1362989062738961351 +14447127345360023458 +15424790603955719522 +7692620063560262549 +9809129399846914655 +2546283272778427227 +13093664983604142984 +16888775620913273002 +17057560890512395166 +1441182034339120582 +342168584842386386 +1873618256883767201 +12655929084454725787 +15777881992531091288 +9870725375094917 +16633695839999756254 +1254706842170308468 +15678048125207406182 +14383072991595461 +9253061086608702707 +1873618992032977681 +1839892025332611365 +283746715973 +13814248578708682606 +1732546190588061504 +12301343579813473741 +15291935484360148976 +819921860 +302199059058603719 +5999247274060690816 +1410790436212264120 +1873618441749139344 +6225729497787011812 +8307814593626395554 +4127600455365962340 +15292499491370507950 +7437134223972314105 +134793217465410902 +5995385294646886280 +6812506387325859781 +4848567454122259297 +17504806456180155157 +2375980338408593016 +1873622667823764887 +2006440589973012925 +7086328669600820353 +16111114664945534592 +4889753140553207318 +16573439118994382090 +3758799186278494459 +1251040684823877383 +10859426818132543221 +40370537 +17625510097438586656 +2206716481647028839 +7159469842264445390 +1384869222252743071 +8118963725238417052 +15290525393747385433 +651027637967723446 +5411569836176269113 +17316185146008423850 +5862342343483942865 +17461812060522224810 +1836789874996565647 +13819027289031763 +520197924303 +4129856586586989491 +7353387594672007327 +10104450048439825582 +3062899443326529748 +3507502151412768393 +8621549700391522654 +13158388680245979845 +11019740593729789472 +103350839 +14101043691413827 +10201537397858061850 +6206603707173572865 +9538288095937838937 +1873618484739049815 +1306283359721427807 +9512531387014933769 +15740934727433544070 +5368870490263674842 +5885976143084283468 +2737848130102108295 +7448029710061607542 +17513349011919031566 +11255890434323263561 +5888796238325754910 +4502606038022905671 +15289397366828843886 +828707480769932786 +9870724569263608 +8457723779546819426 +9304043949412410493 +15287141252803338356 +1201738978701550054 +17706466419109553063 +9785799525420966633 +17621268784989013395 +10519641109706003662 +4507118339157150328 +9460366926602856968 +6219166228801737898 +690631645675594543 +13560019180287637019 +15732561919051246390 +828425408479841677 +5323116982516339827 +14090480 +17190940889022356953 +1873618381559513100 +1092700963858628498 +11230437631732097569 +369726540841 +4242482915514857015 +18895546093428865 +8838271777501952807 +1793158821936040552 +9870724632243934 +149879155364531821 +8915989727614999309 +6826847509569284982 +9932032122976683356 +1732546121802517809 +811991951 +17582061728004323522 +8657453455142643443 +5578193018144890472 +15522184518957014087 +5831548780687671449 +12270241411262135631 +15288269314115904112 +1735930305736498949 +16613270515290037389 +1693170535548588068 +1785796109150934910 +13316150991155898720 +12475063478969845212 +17057022104268448133 +16553459513266628239 +313838798363 +9870727070576941 +15291089435151788201 +9185852015288602046 +4114814762164105516 +15159847610356278613 +2481893878485568628 +12052265110420611006 +16114127461296325696 +233949656293315308 +395562737344075648 +4181978491129108229 +6205475624367300007 +14969859631361311241 +2006440521187486280 +12825132176711685324 +6428217763696359399 +1174393252567475521 +2625039581594655930 +6368045642960996241 +1195022271502422380 +294698224634646351 +3808100892399579317 +7839327041755099138 +15293909556187646063 +9184831288639235311 +23689855034150360 +5831598146012847675 +9870726550876439 +15289115337528654805 +2625321572202648252 +4454707768327289106 +13507380973636510635 +3968978705100509362 +8421458967022488980 +2021331689141374237 +16167901364859060944 +95420943 +3305725656989833708 +985919106031103777 +8899570986408683560 +701227632865390608 +3627925192078472187 +1564301621160393352 +13166364136636968003 +9157067900260925237 +16892159770455721406 +210659247559 +9870724605963909 +2015165380585464170 +7560088764967900239 +2366626229466850894 +5179354088391068964 +14720147820535625591 +8990911914467078059 +7910116554651939276 +2543159061238197675 +34124461934314600 +494159375524776061 +17277157789017248172 +2897916637889696772 +15289397298043311483 +1914732269202728895 +2574671718721672332 +11733273561305397822 +4450766235866702074 +6160551 +5255980322690975044 +10980920357191638965 +12133813286414922825 +8257138337164645181 +15287705238320011879 +9474650756026938382 +1873618312773983234 +15580874133512784221 +6524370298441503360 +6185740956063712768 +10525378840839152418 +5882159627828332650 +9870724624314029 +300940991140 +17689932811754818206 +9870725206995043 +1873618506235257301 +6204347614644278042 +9941287861162484249 +1630794378230961790 +14945434154337193865 +544211744 +2146200690583563352 +69140942 +15288269245330366556 +2625039568696846993 +9870724579683891 +9870725054754762 +16369420319013758305 +9588427625893093476 +23125779238236824 +8901104167878345784 +13836474390506180448 +16013808936578738573 +21715551051933764 +17019887270810904780 +12906451939472593949 +5835546371351184527 +5726925958800626135 +903780241349873118 +9566345282494802299 +8817102048577535975 +1028495276281502983 +1466296546184548151 +9784150154114773418 +18113807416795336475 +3754850956640721512 +2140013610 +13112992413209136128 +9896294839303091079 +6156738015537077479 +10769902892014381272 +7544288290210065096 +15441701681700821856 +14527810898352744381 +1873618355763892404 +17483560290603255579 +2183268023879882467 +18270887727380782270 +27638024484757005 +4394741386639714387 +12914263800119768375 +382626839133 +15290807392953765332 +18142877345697171235 +4127600408076638637 +12581750370228717856 +5251489275295839691 +7201070808445375890 +1873619043621280771 +5153885694974116331 +21997631941662877 +3436433314328699655 +5528340254170505362 +11312167780716915075 +6584171502140341868 +7852905038840995965 +11175145852358517764 +9870725136085072 +9870724661014309 +14801752117097291121 +258081459 +14101052289800150 +17971473236627701052 +11231170297014402071 +17083693235326683482 +5456613387318938641 +12074216556992400767 +7252173878354852240 +1197790749063786149 +2928740603216535990 +8468495303965871404 +11738987982233685252 +5745384143842643344 +7093139039356461842 +14383068692161494 +13355672496972057376 +11171834454140931806 +9870724616384153 +8757529537601628326 +4133714571339325953 +1201738987299945676 +3971798847632579330 +11075661853773667142 +828143426470229880 +987047197435784531 +16119588793697383636 +3329716108959896184 +5835277254346940309 +4145558130873281828 +61211034 +938577221244433961 +4651906966371123529 +10844617942550921410 +1574206422333474450 +10687664758509301118 +14015938822769560848 +16987676926294253792 +5141454935018381481 +5778348223150556659 +4240304631855520361 +4112791961403535816 +6225381587283165573 +11644549546702873104 +15289679310147500880 +11425304743223441633 +15037583526713583359 +3018542230307093165 +16580883 +2116750858326574509 +15287423196121998792 +2191665101444099675 +10935693860259701467 +4394978118089186663 +9870724634734329 +5724666020557560431 +9870725109805110 +24535844055356010 +5353476789791099071 +9298403582666148514 +13819022989605116 +13284440917668554961 +1843558285856881481 +814482337 +9870726275166463 +17034137172525141517 +3781972879453336522 +1873618544941619233 +9565499233286432827 +5405598659939206416 +5837815401970358477 +3069305016885191258 +2524806027085153844 +15287987228926743334 +7946632537211285492 +7592740758242532349 +12751507481748519803 +5335841618940145517 +7799373112474164504 +17632571513726788128 +9142309226578517801 +11997456096123432929 +4538640632148210557 +3760491276096395955 +219257638430 +15292217457770912633 +8099682237308012832 +18322884876277260381 +5892269654353720241 +1170593922858361578 +7201342231718609196 +5287581206121746652 +30458222904546125 +15396553041799488314 +14601726539490149068 +10173910595829720020 +7276278207116748391 +7243018067057256201 +4038284438175955269 +4873288184791187730 +572982104 +2244942767106366688 +97911325 +1195688319375337365 +6396306851230665193 +3973490958945441235 +15651192077395968089 +4289606368069954761 +15292781537867479397 +7035944040138092910 +6996567784476921223 +4796324079630691030 +17782439654706128145 +16981577515082264074 +1211499472176435872 +2479300263529634582 +5152757599270030479 +4755315023003078335 +8537320823041974909 +23407640871069275 +160891523 +2624757560892874096 +309539383784 +15224950321694522433 +14592299539730094787 +3599049417692886001 +3427679821694722565 +2509417099813654168 +1873618514833639109 +16756399206176673717 +805679481429165719 +2295119206548507606 +1933239676539516498 +15348353837155642043 +14424533014481867938 +100077101650236165 +2625039577295232855 +5302200977449766091 +6534244500804823687 +15326223367111451686 +5563295851210940842 +9870724626804427 +1254706859367087911 +6041909478096836147 +15291935501556917198 +8060695083515660540 +33278386930321618 +3812049126336301758 +15292781580857396349 +546702141 +2865782827145963202 +11490110516122631568 +15288833260939120364 +71631344 +5835546379949577426 +8734911291959948828 +13516171036001446806 +206359827523 +4127600472562753301 +23689794847009190 +16341147457515838112 +13012951802392676509 +15289115277341501590 +451651625195343029 +5851982645744112930 +13965352538567036744 +3861350819560825542 +2368935519853614016 +1873618364362280305 +16306478610627899609 +700755959387 +1251040702020667625 +6848542126596623056 +5717857927307869709 +6365225405850259690 +21715697223871861 +829835524885261363 +9157293160736112472 +3967850673882557227 +201123445727841488 +8267988241087940594 +10475598666844167043 +2673769396100994105 +9126223058424237061 +1822334607228610233 +3547323528789692014 +2842209283296858449 +88027128063809418 +692070281466488770 +1873618308474563552 +7449243090672307284 +3861350763673117826 +17215336595868427389 +3599049404795067661 +18217503229964269809 +1788616212989560256 +1873618501935830822 +10186509983545245010 +14101060888194398 +6166185761967988897 +1734238254610336197 +6600019782220399739 +12484855343804124176 +15948081610625997302 +344865122756153319 +12416013361138579047 +2115495962058373835 +9590625039312757093 +17256051675370573617 +4728424806065127664 +15510209378605209083 +16960155082630836399 +15289397384025619531 +15666161088595514344 +7761375828471797192 +5269884197671280925 +12391346703585463772 +1873618446048105184 +5441210068766630499 +825887321043129624 +7419721786877762745 +731978371111608629 +935489342896426201 +1368312660931337476 +13267515303399542046 +17619527108083517000 +9870724726484887 +17856119810358341020 +16121927194312984957 +16875143922971971926 +18170440081713087808 +15287141214112401426 +538772246 +17355210765852886417 +12821325205857461484 +63701435 +15240688955519415914 +15732261793843276642 +11757848817797115076 +9870724574244358 +16884073780545607812 +3865299044899163405 +1844130888301291808 +23125624467429965 +2422447575217103186 +6884966439934648948 +13819031587993955 +3595902834776288976 +5887799955882383159 +15291935531649021077 +1734238289004351893 +11303263004895089969 +15291371468750931835 +14101047990358725 +15293909573384412896 +17291878089005950910 +14478830953308499549 +17931569726871638598 +15288269228133141508 +8110193322947581212 +10030000340710014233 +3541851256594436230 +5991347858710271102 +17285796694619411155 +11835599067419648594 +14690944206747225314 +3760491284694770368 +9386257309953099582 +2430948649855552942 +18106652298826289358 +2682397267632742616 +5995296096946427270 +935489377290431851 +1839046036310939400 +28202117477451807 +15810559946062502126 +18051090208345712669 +1873618385858479129 +4387881809898721374 +3909861025052310208 +16043288328478203175 +17201605079460102087 +16644853988270019663 +2191439168619025215 +883931539947067963 +9568319453202432937 +15070874038479104287 +9148988306963108155 +10831084194895235709 +878291194695799486 +13522950414391072053 +18412263918078459945 +29048140890195335 +15291089439450751763 +11738792369437098170 +11214563466576463780 +5599207760805187396 +15088171056967913348 +6906705291011910613 +511599051947 +4972010266952473676 +2431124533 +9005649368411410027 +2538734651 +9870728841949504 +2625039585893620596 +9870724566287831 +1214077050265015188 +2625321576501612583 +1626046314769706207 +5366885433712131583 +9265818392980951682 +14374004967118748592 +25381790082492040 +11141327 +13672484538110864710 +1042835199137174740 +18144287406214884627 +214958212644 +9989062842342650396 +3188833133853148985 +10301391189392566899 +12018118280286399268 +1923954582274468229 +15289961412532201536 +11631333933802346689 +7471843678522054102 +15017601951624339617 +3758799212073651272 +16826462082941730722 +8653863962701483704 +5954720417470245961 +6104586261131037638 +1574206405136244219 +9870724584664652 +9870725059735506 +2599235317102220281 +17483560307800019370 +17619012653768771484 +1733674230403983390 +14017573175544266926 +7626335208600001499 +15293063524176043752 +5516892818902226488 +1730289999178190608 +17624265186421585939 +10348848937718263535 +15288269305517058462 +3595101175157317460 +21997696430263186 +18410651940481942345 +5477831076623309286 +17881795351005320900 +16960764295842515710 +5944302301007473717 +15293345540578434574 +9870726915387684 +15290243347252460158 +18214648635594907215 +1873618317072938011 +13487493291780736605 +3655854534109181805 +3491703458273844677 +10668197763104573447 +7858872826243996893 +3987538481976727691 +1776768817523936159 +10593863286695160330 +6446689652017025369 +15288833312527432065 +1410073577 +4437407485689356940 +22561729235012582 +12748270311860298774 +15055604049392244637 +17217602274965139191 +15290243446130107720 +9870724603014777 +8597672046546802653 +16306038205786627423 +3648351106617975033 +2107398388291156618 +6879842073353195856 +12275078297028029517 +763683708240672752 +2065251783917069591 +31304332299601191 +5510538211910619350 +13907846419638732139 +5679318733072838862 +30458205707308380 +339912427826522940 +1041707189414159802 +17621561872099776146 +3917984887666136325 +12415707403918462509 +4289606398164548238 +3597075259882622246 +15290243390242363721 +3538129620529666928 +1320813529 +11289095756821916632 +3211386 +6835946745916508637 +18437616482560188766 +3758799199175857583 +15634688076282798022 +546101337650576278 +12197551629056742014 +1414738713140155313 +2167318415571298984 +15287423213318775800 +5652457623480305518 +10618847259384614993 +9676863164935066934 +8932140517091062451 +5353476806987884368 +15289961343746646853 +4237202434228902105 +13819040186388977 +339633986074 +15287705229721149422 +10968759497312252149 +14618480844285364180 +18895516000854009 +13416806523055515959 +14973914568267278173 +10732925687981163811 +469378718330470125 +1706624008 +6818341508412941427 +11171752997201924061 +3007579288618489077 +16886028145707391910 +13957376916945776796 +19177532403229212 +4287350254045696443 +879419277504564709 +331038084209 +16921919712692624690 +9870725374636162 +13669152211453951084 +13237708561380147208 +15288269236731522036 +6047549806150888505 +17565104825770122613 +10184535855828328804 +2189469973429050746 +10274127280773012383 +10756726327912238542 +7210631800401648849 +1254706842169854383 +6153071806601889790 +17693599612532639061 +2696943414038843777 +1410790483503630384 +14218381947021252032 +17431203975445947094 +4501478054095046654 +17432002522046227180 +4120982579551285534 +8912223887528181968 +1779024983138983589 +12608429712480752977 +1873618441748677997 +13669583374543448385 +11249534381851944112 +1133620917580466754 +14159046612948228344 +15292499491370067376 +1873618394456877559 +10754349667962739941 +1787488181771578847 +12865485395353365891 +15290243377344549335 +1785240333022008887 +969464150649162841 +14239554260952116522 +15885176260770017633 +9256163344421559557 +11361114803662442624 +5155859783998389214 +39911783 +374027977988 +15291653510947222500 +4654977494911762907 +13513632858283003698 +484693349019704441 +271134689774410707 +13819027288563703 +1251604691833808584 +14324052883031205950 +9474789777278182015 +9821766011289419399 +1873618532030422018 +3569974137420062372 +7408735874679270519 +2108115836142635043 +102892081 +3324580952041273089 +1464040393466860033 +2659975169031695607 +419755570676455656 +12127775262335518130 +6364338509154097633 +17296410966260729023 +2625321585100000596 +6269466218019635006 +4357085316269292636 +2330884775762356722 +8430474765433179073 +13396710932674524552 +14428924761094501806 +2270565663367126587 +13942734464598876342 +9870724568780367 +3723926533154614701 +15288833278135910625 +4567546894484846274 +4793907513734228570 +14458654042895551171 +223556603670 +18331539082585826 +449096592362641826 +15291371408563788187 +634374056971166092 +8106204001714655739 +14930532519163211462 +1633977097952958878 +13840919426802992570 +11297907915483255029 +3542979313607578224 +4662355879692552621 +15292781542166446863 +9870724631785175 +16091025253775588436 +531434938066023585 +8870800327132077951 +12265264896448746165 +1732546121802072433 +10913745283874236878 +21715714420658218 +4560073991146465688 +18411981897376661534 +811533196 +1838763959721420138 +2464803521824048887 +6155045934317125187 +5112676103981313032 +3187423099130618055 +2864654791629817348 +15672251876763839813 +9722527200174757165 +15307507726591872914 +17153706217936791674 +13360860627143247216 +3220611591653301455 +10605165955244514762 +17067764934673781332 +9870724587155037 +11292010839550994458 +1873618325671331099 +2624757565191838882 +8071825618779855401 +11078763948222784541 +10329634847901969350 +6151097640193243004 +18239754057486709426 +17465760333151943297 +10288813949842430793 +7983693352627148457 +13965057806789381527 +12804866760264209051 +1945545830445508873 +7142560837383494352 +9301902937592313011 +9982897322469183637 +10002788007134773227 +2625039581594196107 +15067195226474692288 +4517143220465783177 +13845264618594375270 +12236526207076162122 +10858454366052818771 +3653145333875366237 +1998795817793895932 +1682680408669380267 +2625321572202189041 +2558937682620330513 +3755932877294618416 +13124256980473288254 +11775490430040476325 +9391897638007148650 +931541121857055409 +12491607776217877143 +18425890896230957982 +1873618463244891092 +2107833776749108382 +16579035830826177799 +8847415897280753675 +3388270649945579392 +5622546645511783162 +7953753204275615923 +15229092105687316 +2907303882175415846 +12534760674296150010 +5273640214415756873 +9306539558694625859 +1517290312029725764 +16723638723969360664 +1873618368661240742 +17255000776570573217 +3878614004656907792 +3706959354028514837 +2322094249834525269 +16828480190656766029 +103461380164903190 +15250067007241733839 +12284124821458521275 +9870724668473030 +10077595329594396229 +5512098595943810546 +7133807369969165928 +3875602719820160710 +4447100014032473373 +3125632139938701090 +5701792 +17822466140243971871 +15290243342953037676 +113312346 +4844858457232050089 +1837917966400767096 +3867407656721261305 +15292217539453793862 +18157608516165200547 +1873618506234798396 +10054619210544329024 +18328329116060105292 +6097847786116483627 +3421016723433340387 +16720904468827938813 +14967622087111563996 +17589214177399485301 +17092164759424403479 +5566476498435329511 +1873618265481693662 +15288269245329919579 +68682184 +13882353207404138527 +6814198477144533962 +1214077033067778849 +9870724579214873 +9870725054296007 +6510049370960057712 +1733956186619208390 +17279695936640199581 +9673409247005970950 +20869665212279466 +16429189338032073703 +7884876921314043677 +5629329310599030821 +24052042 +16276789399840503755 +17465760264366418516 +13010374607273422153 +15701294198255332588 +8176552852973567032 +5299098874402571932 +11310405372725706412 +6516889468507341798 +17270842598361737846 +6925759835249836137 +4891407656087067383 +2946293117444165641 +5151911554360631466 +17006904569361148201 +9195440111775795590 +17675034304410565428 +16305822396991360890 +16857050431361927769 +12057566325940836268 +3405734518778310327 +14130447924925248780 +9390205591180425648 +28484151076598362 +27356033876298083 +17317595189331377274 +7897457512796989092 +3595101205251900508 +6517011693716180143 +12923326087537570838 +12284124808560718562 +10647918455472478961 +328478129841977007 +8472178325545428091 +2694036540298775877 +10348848920521018899 +878573202500565770 +2255355866435046277 +2471556026839755859 +1836789883594499917 +15291089456647513578 +13819035886963463 +15522720727336769967 +23125822227683468 +12913069230492955780 +5675796564074653150 +1873618493336979326 +16089088430329106181 +9870724660555550 +2919446581911115823 +15936300577150744451 +988739304450451427 +11439125141551262854 +1208016563901456148 +3805712294748829348 +5724665977567196288 +17697330236687389125 +105382480 +279446836366 +15528338683745418196 +11403208935359256493 +15289397375426759758 +32714349827412641 +15651783581169435610 +2576363847232524991 +1252732787539141957 +12219047056026965911 +1042835216333952609 +6051485356288903427 +5352348775769919253 +17606950212998680959 +17627202200153845084 +3784125305237867347 +18108263957602983342 +5303047026657661752 +11411502596545516573 +60752278 +18079875014902433765 +18175237612192935537 +16367545837494290268 +1873618390157454058 +1149335070655657069 +17747435299319931167 +11828357933481005012 +29612061917792295 +13687263889331935947 +2175225902564057936 +4930631980557601532 +9942444135736153715 +11606621136182397387 +16533453944884978200 +5352255495639687788 +828707433480130387 +883085417653756499 +15287141205513544040 +16567942547986324992 +15289679310147051277 +9870725369196656 +491193030 +8204095468854008470 +16122124 +8392045041254749669 +5706434729109437918 +4176701084968833714 +3069894846806910196 +9870725109346353 +24535844054893958 +6921661861769322973 +6103488079777762245 +3813741220454418270 +10840261800173375531 +9870724634267610 +11924686081222727911 +5687765473224969475 +8653997017376381230 +6936665252445697352 +3755979030849411264 +9653576301509486877 +9430316131201989900 +12266871665304279476 +1873618527730994922 +18217355801013468833 +8582815132800394341 +3668422945874450633 +10325967164613343640 +2625039590192584511 +2012231231910527956 +15293909564785578659 +2284412389694637269 +5410231956402039575 +2625321580800577563 +16324853745603185849 +8284246656382408854 +1576744569956413747 +3297856681506178941 +10397253578163949840 +3812049139233669191 +10374084178165436240 +1060718949161917859 +1256117005867093601 +9009022494401702229 +2800041077595530934 +8872404178275419332 +17605145422753908165 +16642065601678371107 +14366386701052821439 +219257178788 +1465168450480008119 +2785415278947600352 +11102157563493105909 +15289396747527919306 +10770155859627543824 +2018397021340393516 +879419204419598262 +14127627778093759655 +13074554434366034138 +6835555811876477145 +1996539656479057136 +1166485774173871497 +7334710693914748038 +904009213691960925 +9870725083066366 +4190010276730917882 +14317912644329025152 +9326722067131424886 +8833119082998422867 +7988310113853329053 +15289397306641222853 +16608774888522139569 +17307564817282580710 +19459596095729600 +12133908888584007923 +12767897511955344842 +13607538666478846999 +6975291514694876957 +487275566226418052 +16635669954819197974 +5727354401416743090 +2624757560892419276 +7610997758436118504 +16857290923428306440 +1873618321371901344 +7631966286953263290 +15785558567545286098 +10424129612606878677 +1873618514833196294 +19177549600012129 +17801855500837605739 +10498528553368433361 +6288511205539515238 +8192198 +9539521017755356193 +21433543247485512 +12853486020814643362 +16893851873170950707 +6570062128880313968 +1573360373124655923 +15324931919367587460 +471264295128876725 +9870725101416464 +9870724626345670 +806093689 +2529047214861001043 +9223297463438162411 +23971867136646850 +6152225697206387347 +9386257335748284259 +3762709759136386353 +71172585 +7241607920556328664 +128426738000288220 +1873618458945456185 +7450089126982398526 +1028495284879433556 +1629148490900909719 +23689794846537272 +10501923726327900402 +17592510880283258087 +6844496701510133496 +16797867192214510929 +11615938700899272843 +15289115277341049714 +2224138645678286612 +1133620887485417426 +27356042474686002 +3861350819560367806 +10906583514261360413 +263935036116185654 +9870725379616928 +6365225405849801388 +10924362274963207668 +5000990673008793429 +11002202554770598970 +19177592589921403 +28766176077357879 +6156737968247288574 +14430173321040519265 +13819044485354323 +343932955660 +31586271318836879 +10403206179900382444 +2156289485251364768 +13593480622905777978 +1873618308474103631 +2098736640164054245 +1728215156532073876 +14101060887733215 +1025668042035964329 +4859408499100439524 +1873618501935371556 +2308641272449142436 +12348454158632969851 +12509049980725891827 +15618942810311123392 +9673023095609183464 +1197790757661721205 +152502880 +3579103466063934191 +16758489844492275047 +6700459465055540545 +9870725138116690 +11077917976397096966 +16487205989854104201 +1756099252980684265 +15636380174699072146 +1646710721800247631 +9870724726026131 +9870725201096801 +17304285656786102897 +17244619249001776823 +2375344146902423655 +12157859360936189295 +7401639787228445404 +5778348231748501255 +14299680457632147913 +15290807435945719698 +17306856587979066781 +63242678 +538313489 +12508739422431234274 +4396106243887412512 +17621658575450946467 +16979823887004677231 +16426962334971532209 +9870724573785600 +17150122061001614415 +8929038315166239946 +234824926652089096 +14320265566969471450 +9297281908017750209 +16873513716505454116 +14533547322108620638 +8835169700249943618 +12922559974772008454 +15291089452348087059 +7821450634948667835 +1638857646421662401 +17542236467437182133 +4717573181505345610 +8086055022667975451 +5832726134239993360 +9169483786284636801 +13670711392863140876 +12753199597361570549 +14046429662446444612 +17628168594039845220 +6261263733545503259 +15288269275424506800 +16776825159717826694 +816513961 +10727734062962595977 +9749066209102617884 +9870726169587960 +2625321589398965240 +3701508675985161598 +3890792205434448704 +4974759074281293673 +27638110466608648 +438812023727925802 +15294191589786346982 +6155327912028543730 +23125762040545241 +3759645205393855905 +18331349920276862 +18034522837647564018 +8784323283773890568 +16165083386072688734 +227855568531 +260072390568074107 +1344496671617409222 +4484701299906329910 +16518586991831488385 +8803810636239091474 +2160237654701988332 +8631928107028408076 +1873618385858024613 +16799516451087476582 +6061683567564373467 +17961737460734889869 +18411699911067631643 +12292314286161478022 +8415243677325672938 +883931539946605906 +14391892836177499386 +2802801844172628632 +4291298427795298157 +13590666056511797714 +10367111403802350171 +9675056182159545408 +5993604063017058107 +3076659560453662897 +12770153587287402981 +3712382134374651358 +647953526041821151 +17938696013394755087 +7630443591734791098 +4484797034591757430 +3698845504642494803 +9113918727170058375 +2068681175348635843 +9870724718096244 +2624757569490794986 +2727527751902060685 +15292781490577690069 +6081426209917775997 +1873618523431569790 +15349711462261331783 +4719964915573344830 +2430665780 +18105608778974253369 +15287987271918694959 +9870724565855720 +2625039585893161155 +19459548806402895 +162923155 +23408337326382359 +1005890003669226092 +3224843666202518931 +15735927946891051618 +8099286664680784420 +9870726098677997 +4396106175101870747 +1733956203815978632 +542887929096453935 +2189223466372832564 +2931517260112749900 +1444082191694709450 +827861392870167757 +10682570 +11288259060278176072 +3144873647871637317 +4329752059351341182 +15091099644146754411 +3721851243619439694 +1628020382299021492 +4563816462554646179 +14947105796681137 +11941637280282644832 +16146503436680580786 +11239731202191801070 +1197790723270207348 +7406761759861377295 +6156738032733408914 +15893182424592109179 +16765215479188031591 +102051250861185891 +9487740897869456771 +5458848587099997499 +2890785419192834816 +7329222073103765010 +29894155706569747 +3429373643474753304 +11448486117430080496 +4392017156035603273 +3758799212073204451 +15292781533567599249 +12302836948233035203 +1730290046469561520 +9870724584197003 +315050981002076169 +4682429100742563596 +1386796956420345663 +8856014178162720913 +7836857277106829261 +9788517128793245318 +15290807410150088282 +15484720670844008861 +2624475540190620039 +4447100018331441033 +352531342327 +1093547025963894943 +16267906072528770394 +16885380404963006147 +1873618317072483163 +5880992462816830559 +1870891592944915964 +18216242462685554247 +138984330194540915 +16786227350376898289 +14283993375642765056 +15895720572215512821 +3967850626592737364 +6439903805786562167 +8955100642615303530 +3980785683180559647 +8300077830978167899 +9870725077626853 +18413109975884759113 +1920901414660812260 +7973052230774383472 +13526789043488837125 +11508187390394242872 +13234304215848992302 +9001559220918447317 +488748054659357482 +15099773312345253177 +1873618454646032908 +1734238207320548312 +9761729058129658517 +5780604328577995744 +11040187364284702326 +15512884641524686764 +18266077987869759799 +5539784066175100440 +7049363126783135296 +2581508047683782932 +8502756838484617269 +4937017507177905431 +2752627 +17935149165637146266 +12043852300752739005 +11848796902029289429 +7874673760297303562 +1411636519813730646 +14223898422488557012 +7980262123708880936 +12279096094561356171 +878291216191534785 +1841584106552451848 +15944319596814220008 +5461950758932274465 +6622799668090653505 +17954056120348448299 +819141253997939981 +458355780937655259 +5888796307110366941 +15289961343746192694 +339633515155 +2141513421469058406 +13819040185928867 +5759560470823897206 +8642529546809206908 +15288833346920991812 +5411521012994803182 +10181433744184007449 +14426789085515294763 +17359928778200927804 +1873618304174664629 +3862478876573504871 +4029075847290504596 +13124581940915677335 +9300257224644839841 +109394696450803010 +5837815419166665198 +619982405694662761 +1788898272383866922 +13747186725612756220 +18132460199058353753 +2625321597997353452 +15287987246123070480 +7383208489205976861 +5730047846718983101 +10619901526976783839 +11979683904682142278 +15288269236731077566 +21102898 +14390084566831550931 +17603806066300962498 +10592171214073567831 +283745801660 +29048106498198701 +8790289859117401575 +15291089405058766640 +3702447087285328617 +819004351 +17785259896117865632 +236453959139 +1873618441748226373 +5578757020856633858 +8156749573992101526 +3806757595376794844 +13263754581809432790 +13883199269509861069 +5330701959385780683 +6053472093248037689 +8876352433708341477 +14420963297769689895 +2613596956402262415 +931373894990326896 +2758840926409264793 +17106628117232305221 +3541851209304647860 +1849351318087880118 +7872291577486781710 +421319345246 +15793124911245446 +11127945220196076778 +11609569900956886638 +8382080373991629627 +6595419905013475815 +9941335085727487683 +5871895778191894954 +8211561511893755946 +15157591436144436017 +14202605824724066418 +14425661002709010016 +22561759326641719 +1836789874995641887 +2624757578089182177 +1873618338568679286 +15291089448048667537 +8180059236188099034 +15625593169460349277 +119263647604621796 +520196991814 +1734238284704470453 +2625039594491549395 +5461104765611607541 +2625321585099542348 +9870724720586619 +1873619026426079043 +2908260051937332390 +10869860987124474162 +12759860117774624285 +14245100990001007082 +20587627313252942 +2440135173153506594 +4557830122993488128 +5052423619832404851 +15294191585486923756 +1575898520749304652 +5888796238324840484 +14095300693745346379 +7664780934043340477 +17103185351383001648 +2538375794385634094 +1873618476142240920 +1573642406723804687 +9870724568320021 +17949634429793361359 +5197675280937390374 +1804450484264707008 +223556143025 +14271504830546203083 +10585929994435716240 +18411417890365833232 +15291371408563318816 +672085941807878238 +17634556557382063312 +13172970 +9393060547051674733 +1873618381558594403 +5572365141172365476 +9870724631326417 +932669196066975134 +171387371971097858 +10766835278948555965 +9714244285664604193 +18895391327142385 +17758414033733372552 +17560989008122810211 +1411918557712307360 +8663192652060369597 +8542811457568120454 +361129707266 +16797867153523562702 +17893685359943247070 +3485224758199265790 +2624757565191377174 +3474373832267994541 +1873618325670866937 +15291089435150853769 +90244561210992858 +7963688554977900887 +8694008321347227184 +8424279191236987056 +2685480919060200539 +17954342474369802168 +6114840380257350236 +9806857829261129984 +5961825453481274778 +14106887050504264826 +969023931668849849 +2156289446560422731 +9870724757286814 +4485295814511246673 +16922913474155530710 +14665085094873085 +17305164455170811684 +7516530610330085595 +4182047870956806289 +3238291700450484311 +9870724605046400 +17677583345021375495 +6153353844500012114 +9870725080117231 +4304615452755257948 +11203378729712572191 +4127600476861259138 +14107823478185859098 +7309688964236012234 +830963573300807443 +9225016448664221251 +5987138895810617397 +9870724820266928 +13520119278536117807 +17145755290456966932 +14916910260283926039 +10754470179494765171 +6225663603685870640 +10233694917695593283 +990431398568553474 +204346183240996726 +10401598182215587395 +16431645030565889893 +10477405321844699155 +16990917635978692369 +8466277885064012038 +9870724668026702 +6208295835683989748 +1903640920853056624 +18140703315258974099 +2000487886116384076 +15291089469544873140 +38835447835006759 +5243033 +13819048784319704 +12051137027613405319 +13122856944941683735 +6456023583136573199 +15290243342952570297 +16317489807949585971 +12920292833030072494 +12156917871598975027 +15280372721565328924 +2901086003357959625 +9870724623396515 +1873618312773056283 +409156595892772592 +1464040414962603079 +416346978214688451 +5511645657542431944 +10392071676938956014 +18412827955182960702 +13374898155346339702 +3735453693364143828 +5215971481900302887 +20305658201451198 +1456297742063308754 +2937635740379929450 +15592058013925444099 +15290525359354963707 +68223425 +15288269245329452162 +7354959756031825227 +28766124488597551 +15424790603957278626 +7621113172139591286 +9870724578766381 +10097620229069890843 +7729621850417738968 +6056466500778596822 +16876908906661681126 +10223260508461423070 +13757953135961268017 +6971520520943982841 +4500349945492680882 +1890039827952519223 +5910722419484013556 +6473669550920643936 +9870725376667789 +13495668012831566061 +1923875870 +9373474503306448773 +5457785514812518150 +17434969792771869842 +9986779853778672378 +13260298066176725115 +6107189549764908613 +283748271730 +12073663230344699507 +4141551246163852293 +10694515140971663054 +15441701681699888287 +7507416457453451060 +12237654281284815334 +4131548702199581670 +15578923718029153070 +17194977454376563342 +14183257303130793732 +12870225580817390364 +22561815216870281 +9673409191117796937 +12752173109860512124 +3785541221791502848 +804039605316229085 +2201358182893030945 +382625921368 +13320467611651025839 +9411230538297529989 +4452740346385486719 +8329765017882351103 +12382810445733046924 +4127600408075709573 +14322284629040564382 +14108981694050160315 +12881851757641421641 +1198918767385535050 +9666106800987523598 +9037794287812437751 +41943405 +517014256 +5098241858427569480 +15288833342621575660 +1574765567 +17097120331311894511 +829835507690064268 +933515240975915291 +12287601267178473523 +11888218815508973537 +360260087008225943 +15287141162523190700 +990431329783002690 +986765107949229021 +17585064889486830516 +15290807384356953152 +12065294427711950430 +2625321593697930351 +9777290512356628416 +326738187399 +3547491606144227280 +5303047082544938399 +15107224894534131381 +9720112053199449402 +5875647804285670638 +12239343736245150600 +279446379064 +104923721 +5374001325769374810 +1783539986527382939 +5269329687486686238 +1734238237415139569 +15290807483234595069 +3275364878270929745 +9938811492769473369 +11416607069839450032 +12648272961983364722 +16217875513543315764 +232154535311 +3910652401006503585 +7761581441878614137 +8356702227516363290 +1038040997674507572 +3448402978161509901 +12234112454907738492 +7692990102956744034 +5904789091956114202 +60293520 +3581851302813389815 +3973491019134155585 +15610783897974421490 +748808925650097604 +5070156033137338734 +9870724570810095 +684134210602468610 +9199725758037892021 +10159110354702912411 +829553560071986535 +16374905227699111874 +417019921504 +17107415614619919727 +7402989653604310077 +11573994809263547091 +7659237507184987575 +18331491792794172 +490734276 +2624475557387397537 +4599743200770987053 +15663365 +3914931764629027331 +6156737994042445956 +29048192480512516 +2558626525887401831 +6665603611953617211 +12663159459949982107 +848678270931573595 +9870724633805522 +9870725108887597 +6241711479099055950 +9730290476299406463 +9870727009169707 +2624757573789761262 +2804495565993962916 +813564822 +4451048273764379395 +4959080534869678408 +29330208882900756 +11266287558165412482 +1873618527730534170 +5409264954858301683 +5160101079250244971 +16357491449000578119 +5133829485925763690 +9195012299735698785 +1043399313625606914 +15850359680816538080 +17274157458060290701 +13859301711093648726 +16044698410491643447 +1881294612916279126 +3649479120639507457 +21433749606118262 +9870726597079324 +13787132815663778163 +2988890703046454545 +1418275848750645333 +3701600990787603378 +7694474574468618220 +1873618471842814391 +1410790466305927231 +15072636887023640250 +11033411317947121238 +15741609139262220716 +7372527710464579249 +10052154074354107949 +9450798976826149302 +1803181542485676347 +17587804086796690559 +4730610357785666238 +502468769495191024 +14210865168132150789 +6206453551322832364 +11966722661120890998 +7575512371193212289 +2843459484954538510 +16355799367779826634 +12611531854218737864 +3249068390006196153 +13302722670275794231 +4300193865453103533 +8329582776954602035 +1709826851010988698 +9870725082607613 +15974263039168749835 +3831400973528284226 +2033779624402503247 +651499399329754766 +8018575674423394901 +9870724822757304 +15290807414449065430 +2624475544489582198 +8093487987437224223 +527434500 +7577630114940741194 +18164535293412591041 +17368417748487329398 +17205553309096938840 +18169457873000670773 +6746177333161777811 +9342770169617403961 +6152225753093640048 +5408781293408961556 +1873618321371447932 +15291371494545625085 +7398819614602564840 +1873618514832721746 +16507299597917842807 +525102955160283371 +7733439 +19177549599548552 +1521238502976076154 +12756019744192616794 +12676331488113081267 +11481232176874266970 +3238521318178972790 +3722189998311694481 +16997228164223813877 +6155045874129520610 +1213881476426243837 +17630049038116469436 +5147552749501749538 +16266276988277103278 +1254706859366163284 +9870725100957706 +7038218837934480449 +12924038885740067812 +17089062527404544544 +9870724625886912 +11946207383162670200 +3648351110916488144 +5357989069430735717 +15291935501556015358 +11108455524822237511 +6152225697205920990 +2395927253977484917 +1413046567433611835 +23407778443708597 +9870726266319099 +11787590382489057856 +2790209532000156547 +8339857016756587799 +5495810026726501529 +1873618458945000849 +1146796961723534459 +70713826 +545784627 +1495925747 +9870724581256764 +15862097501686279636 +18895382725801627 +9294757478662491040 +17313635914779932393 +17956211265708314410 +6840616336330867713 +1608060286573173418 +23689794846074337 +15292781572260588474 +9870725379158171 +5153886253855417970 +1195868721826577159 +7417183639253429183 +2055181243785817266 +15291089465245448680 +18412545934481162291 +7332738546017066177 +5792160745191252000 +13502153632419561295 +2902523930611490668 +12975115987733666958 +5397105745613954795 +15196522894414004859 +6854780383166538106 +2523959969279970191 +11980175439545981539 +2679637056 +9013091190501541709 +1075386992618250221 +16536863397737620811 +2625321602296318353 +8709821640159728875 +10044825009624991100 +18015051914722295668 +1467988648899334958 +15752653831718978898 +17461812021830359171 +17256155806064642777 +128040853578473922 +259654328 +1410790487802143696 +11074967922378891861 +11508077306068625355 +15288833295332237755 +15289397384024699008 +11961082158416466366 +240752924470 +15798241642875394603 +1597536180772867045 +1873618446047186810 +14692217879646987780 +15291371425760087333 +15290243428934883138 +15289115311734595657 +1582324813964006920 +279448847671 +14424532945695419244 +17651881376765865392 +7975509434649175271 +5992475932919734616 +14531877633067197536 +7022345251720870221 +15169360783856789298 +7861659208588340434 +16152901408141624130 +2574671748815347023 +10876344215514716547 +5997143871888711169 +10161366550410040871 +62783919 +11183855682536477839 +15287141214111481942 +15397349661003757219 +18064567851012006341 +6366030620467751873 +30458188512103543 +5403791111229625301 +7418767925660372148 +1518418403436412771 +12984915175632350428 +331034666728 +18292060994905591600 +16984625117551016944 +10756161196621907156 +1609417154577197597 +8484110767338840400 +30740204914497599 +2434558245493882008 +15501473033754248808 +1873618467551335565 +8918984013914904294 +15293909573383510568 +3477193970500638094 +13161702428830159942 +6155045895625708808 +816055205 +14139999246989864689 +5614192975203351919 +16876554000686015327 +4766599581297353284 +1366000495400062808 +931541139053357358 +23971888632376752 +468608238897 +9355026716162928974 +17299231091595110956 +10598104538955388634 +15585531722088933671 +11278952716654303526 +17088877222950947488 +7744423793210566813 +5869180766708442490 +10477334394070900886 +4287350189558675787 +16896582888638318388 +6054774376566249977 +9078366157069561215 +14258849822134193614 +9241910669145356911 +15287141248505489340 +14184058584951496015 +17330360441647948432 +2146416200306212103 +14835085571082162597 +3230891007074313895 +17091318705916150977 +17255585803059798886 +9948159316760870691 +1252732727351519880 +3884265283043795319 +1241710799806748546 +6100103891543939988 +16875577158506858156 +15290243360149343057 +5190328460328711157 +4434531242274219510 +17630879359421408899 +11286425114966502141 +9870724717637489 +2248112069177510680 +5885727629920133131 +1873618523431110190 +16427890617465718105 +1731136082779658240 +6986235638051510073 +15290525376551717170 +9870724565396961 +162464400 +5078155348812458801 +5900230737333390836 +5251489249501794524 +6206321673575531611 +12568108876627597224 +2538093769384400733 +5462796808140181829 +3143228437741389376 +9301857539287305939 +1042835246428073082 +15288551278928610465 +3971798877726246151 +5727354354126951946 +10223260478366376808 +14994835356864565757 +12757875013931260408 +10588235868611613499 +4181978439539449721 +4085019129245361667 +4472348301814413164 +12057284352529139627 +17542946455516547053 +2108397835349814569 +14319404355994407034 +5832726211623476672 +14383042898127425 +15290243403139279313 +16590518779153955496 +14586538897092845545 +8610102806501591788 +1193321391706299086 +15184655604326605173 +15289397349633174143 +4002320314711809851 +17706682253397084719 +16108156230858195279 +9942444165830285542 +894336773592404395 +13747155969343188166 +9870724583747143 +634354464864934457 +5551357435004660444 +9870727909241145 +15030275339982364087 +16792558479081232954 +2203332276215481610 +17288317935700765323 +33560403334287667 +16378103672764001504 +17750109864738752812 +6364097417622529932 +7055348881832356268 +3099390545804094561 +17846664389777100680 +24535874149025753 +18026193457867999567 +23125645962722218 +14902316069337319524 +10277476906080547615 +15760372025019280871 +16502274974012826897 +10397242955215036450 +5745004228812950241 +8344618503923984994 +15040978729766689065 +1788898285281235680 +343934978575 +16395404801410215107 +947090059664383740 +91554312 +14975681650483333306 +16481554245638172809 +9870724602097269 +5539841078735362031 +17735566651085687884 +1518136331145077251 +296643160709 +1410790496400524322 +12911947907506782777 +2065251783916127931 +40932558193247110 +13770241597475262382 +2170878889691528705 +5516046782590753759 +1072846184361252627 +15500223444650440345 +17787527020662123433 +17848838676548887545 +1873618454645589452 +15237957809679051184 +40245529848929333 +154534512 +17190940914816586457 +11022244257706097639 +2160237676197721261 +15846834187141327062 +2157172349215267669 +10375505339483621145 +1149335087851984324 +6151097721875664077 +11040187364284244444 +16410037266265215954 +11567419905860135359 +17825755834711742502 +3542979339402298626 +12751507455954466128 +1319896024 +7401639795826370898 +2293868 +1895398083715223383 +15291935441368846287 +883085434850076822 +6366353518750208002 +811970500388802468 +12076494400592754509 +1535116279 +18613499597581564 +12004529765984524500 +9252215063194592857 +1841584106551983754 +13464322011058687555 +1380892748811154227 +10862662076345028982 +23407864426021558 +5353476806986973994 +1893705976700090512 +1873618544927316658 +16893287848962893820 +13998401902284715775 +1164234159400957738 +15287705229720229796 +9870724575817238 +5778348184458694081 +10800972690247279024 +10523161160733575077 +6366071472254485645 +3780916401837009267 +10241062054382296870 +5267721725907251442 +12986607308441392790 +2625321597996894992 +15289115363322900683 +17719087608558079618 +3649479137836289280 +32150347115533297 +8839539261532367765 +13674659639697226172 +9565191053992736547 +12348736218027264207 +9870725373718651 +3911601570557990692 +29048106497756707 +19177485110480973 +1837917949205568786 +1413046597528217316 +5140044853005595741 +17299513090801491751 +32714354125903308 +236453500513 +575239712866634722 +9923447858191473174 +14024382242062670175 +818545595 +10195897056907304647 +8773072981860493766 +6678552048861399233 +8675802429334167867 +18446442990319852813 +16511122746743609180 +4449074137450301435 +16275197394076902764 +1873618394455950073 +28766756455328940 +17160329975787685834 +3749134244271891840 +421318894680 +8059269041518569023 +1211499489372300280 +2000487911911547937 +11322331317246431989 +14849110254373922339 +11921229948732378784 +7082192198531945816 +18153075185595077215 +13513632858282073770 +16737001338585433984 +1651696980087297022 +6151097653090126690 +1745891129545527055 +2624757578088725069 +11955334658426016402 +1873618338568221755 +18115683526094564134 +12595141875602255275 +3226817772423559761 +9821766011288487605 +2689712338438413026 +17318159187742433226 +577045344 +4753934500331275784 +10042583961566655970 +6316393479032998553 +16138819695825590263 +3968978765288793141 +17114220222374351914 +4078298796534086126 +3650607242138772251 +2388600903224539702 +3648351128113255057 +6605958281447026537 +2764039351954268914 +15292217509360789238 +10338899821598498590 +23407795640486992 +9386257352944605195 +11506420668899594861 +11699700707221921919 +9870724567861628 +2180307102810319962 +1873618476141774348 +464308803122 +18293278536774000845 +16885259953617962521 +4793744914108403232 +13324415624934413659 +1252732778939835340 +5169926062054926899 +17640196902632887914 +9559718133693759428 +4473117350019076021 +2622783424577869767 +15289115294537365004 +2992561296015233425 +12714212 +16991151781330562604 +7879092499898976403 +290284644730540912 +10697899350700788395 +14186641512859918958 +15287141244206065395 +2144486676264855928 +15292781542165527639 +5458807696621841249 +4374969106776731356 +21715714419730017 +810615685 +11861791587311571393 +6660092369580937456 +14418748516443630401 +9950019055828534995 +1792594759036576467 +9870724846088127 +15293345596467732426 +12994373673115140657 +2588868452679566635 +361129263692 +11232653835624605210 +11327137566841769230 +5021744610238616038 +9870724586237528 +8046459006308081 +8166887695337996236 +15232722856302626224 +9010588495091151633 +16456135136605922902 +7096937031595272509 +4199805580057579091 +3711747923390121923 +14536367473238624526 +2676033356038547567 +884977258589005904 +11969641950059192335 +9018208235494656681 +14584707747332308549 +15287423178926348531 +1868611368115261892 +17143196299881428598 +1001445804886534275 +397091011435386637 +28766137385947729 +6224501813104814247 +32150321319928694 +5251489245202359714 +16198812307162411039 +13976609324281188147 +13282278299792582417 +10589915121543821278 +12121733013976200864 +13612893882922528169 +12794742673428979182 +6703975934721734448 +15287705195328713066 +14428481257016094059 +9870727239790900 +2558368823777377956 +2115587870189163928 +15785973014643103622 +14771857506873134055 +17068870086068090045 +11730882721800416067 +7697026996393675938 +4624146031334143207 +985747851051424656 +10316944353037986226 +1522366594381982717 +684134236397639724 +825323275340879110 +1731418038994878410 +8858552325788143405 +15289397345333751533 +1233175638830771644 +13065070596957039006 +18331517587959608 +6366353527348595732 +17614187946780746710 +33560399034844286 +18412263948172132400 +4784274 +19741651190628036 +12292529139749315379 +3810357015023334984 +9069519261342176368 +2579787565372159267 +9870724622937757 +10555463259816154731 +17690426914457402732 +12185761058806317376 +1254142843756963718 +15287141175420537721 +10460733961090787969 +7465404271947625523 +5620239770592103206 +5026396767403462353 +5461104787107351969 +2625321606595283106 +17221884401294579563 +7107056528873510426 +9870724578303983 +15294191606982654655 +12982659022915898414 +11205806960972550412 +23125779236849772 +15291935492957153881 +5125990325547058422 +4397482886344479973 +618429790158799488 +4694804975192714992 +245051889226 +23134531 +1873618450346167355 +10955223681225154023 +11441894924405969565 +10628953736434486617 +1951690094360816023 +14828871009175425647 +14964196544878032053 +7126195226022785085 +4900544073974694907 +5141995361070296903 +11176433417179050090 +9413896110296749796 +2381504242832522349 +2125501255296177411 +429917277952 +17787173786700893271 +14932478444660614016 +1730290029271861010 +17466346332330615879 +3595101205250974564 +4075478537927145945 +15287423209018449511 +4460967390017578168 +5462796881224676137 +1842430228844862150 +468613216733 +8874660335291154156 +18007176226302804823 +10192709339164140786 +5972037568399564324 +9568671246589696406 +15291089456646601990 +6813843502384089093 +14235290684968751152 +1836789883593571602 +15468982935875297592 +4467733406394310307 +15290525393748501372 +2416232173744371973 +829835507689611659 +1197790796354244080 +18153204036691776565 +7723840643347011573 +16733496955023337703 +279445911947 +5707451689703716386 +15292217517959173100 +237419273278591511 +104464968 +19741582405102812 +15668850572958645992 +5597173628943686533 +1554757201290082064 +472907211104 +828143473760687333 +1042835216333018678 +7718319177568489865 +18413674012989259870 +8746686216596974200 +6225099618171233672 +5249797159683425776 +1840738065942003288 +3974700764184054454 +15292499534361545050 +13892586743661291959 +59834762 +3284211602680925847 +10059824231573429129 +1574206422332103266 +16940553195690134509 +9870724570353994 +7276444594547989917 +6156455977639626297 +18331539084155027 +1926569323316013965 +16904712944498838074 +3241336572904957375 +9587648737439473162 +11333843801103359784 +15270990155687075247 +9870726210810106 +19177618384621659 +13616371214793664245 +417019463453 +1782138208481921011 +10926115372385718183 +15724675377899249836 +1466296524689460064 +4023065593200188368 +16986559721201296362 +446711754671013563 +15204606 +4092873675725294371 +11196008803455802960 +4074350528204129595 +1947716014106163392 +9870725108411979 +9870724633358058 +7867619042724899833 +5196829253224783171 +6134332588001005476 +12573073537992379603 +4449074077263142522 +3862478906667656941 +16690402772992935945 +16434346325777268933 +10951380036272473780 +16811908588824178857 +6831141456550245866 +29330208882447676 +1873618527730089805 +361131754125 +3397787842937169201 +3655119465890343316 +10441350570743960109 +4399490410626166071 +4890558848511063361 +2862387658487057401 +1007772810305033704 +10131666604213886806 +8016433819468768798 +3663231167962834327 +3813741164565775208 +7515448154541134338 +30176206500795374 +1873618471842356328 +1464322371178604919 +2530457361360557590 +15289115337529770793 +5248951067485151430 +14424532971490583814 +4238894532645513517 +415484128988116239 +15292499521463718826 +15909127193986741246 +4643874909529787537 +16166775548975861506 +14383047197092112 +15289397353932146728 +15291935458565627839 +1732546164793563934 +9031918278946143013 +17763448248357489818 +571605843 +17094376519214184381 +27356055371580547 +6549705653208172440 +2401522090309921916 +4971715958973479676 +11214613651591212394 +9302231339464270114 +8207049193561800301 +227110219176426752 +1411918553412430748 +9646433465344796645 +12748816074743703975 +8429910788516487178 +4660099752770818430 +12073088508578767116 +2676033351739114988 +19177549599089563 +7274680 +5248951110475065783 +11626061263276163141 +1837917966402337308 +15942884970698462159 +17291470039463323504 +14270655938778065294 +9870724625428154 +10633803756594486360 +4023356732265137752 +16544988014963939273 +2782533206060848579 +2597848126 +11849360870348231155 +15291935501555545001 +2481036767169558240 +5778348145767765461 +8306595689387934327 +3200373601203012746 +15711638307477866220 +11397440162344027883 +2677725742497283350 +2790209531999700456 +29330140096911955 +545325868 +70255067 +9012726398277803040 +1873618458944548046 +15291371438657457688 +7545409860112566829 +14621052405285282659 +2900831086130577112 +17620704752184150560 +292346212850 +4525236812567615896 +9870724580798009 +16239270496562975430 +11062667009424766213 +13730298762966166722 +4504298192326782321 +16462507637094827685 +4448228028054789849 +10981511187954474624 +13756852346898633640 +11451760621033054708 +15292781572260112937 +8935535651358647081 +3450640455353252177 +1251040702019291125 +1732546151895739199 +27356042473771168 +18411981927470333989 +17807842525266732640 +1359796670366499647 +9218778931772201424 +18301894999067281176 +15841848400679689080 +13669583335851559254 +10021823291859211536 +1873618355764993038 +5405598728725859379 +11370043909508046170 +9608971514272880425 +13407762898220160482 +4180850404022036784 +196215461 +6538234364472141014 +869873594802717842 +11815401635570464992 +5199085482290714954 +2147544240122113962 +3905576028373605222 +1572232290317461723 +16874077736412733192 +5251489275296945148 +596244007573731371 +2625321602295859611 +10253095196509103601 +15638354272321292552 +15293345523382767679 +5782296426993826392 +1109792901628697010 +23407812837249923 +375393205545672102 +1312691032915387894 +9870724662128435 +1873618493338554799 +17596398020674603520 +6428369877210065739 +20023581611479316 +12280506176574798230 +12178000866590462842 +15906307047155262653 +14753222603358482330 +9192901977047588926 +279448394861 +1497235361463878911 +12687672595831148528 +807958179742554179 +2541195932617814720 +7194608100425405078 +10926712257366606186 +5197957314536098218 +1873618398754914617 +9743112694134282322 +3970106796506294402 +9870724725108620 +230045241759918158 +5992475932919291273 +2615163269120012014 +5835546358454490899 +94733363965661171 +6068098564606930580 +12753590887734798958 +28484146776247610 +13497082958031232398 +18410727087053171823 +6208295865778120698 +14923712027778036166 +14446270833247997551 +62325160 +5425080494120915006 +15637617634654491871 +4501478002505355798 +1893141961090885280 +2150364451439708714 +18271169786774179159 +10883825772539353753 +599078861880643272 +28202074486155576 +14448182458800614026 +3278044478431513679 +5514354658380879037 +755643360619350296 +1873618536328472409 +1992881785903857233 +15292781503474588338 +9213319722374294196 +827297398756691324 +16281405738549595011 +9870724635848452 +3431717726747190281 +15519826062115493805 +15892618430478637276 +4144790818200565139 +28766107290902008 +9870726276280576 +18413391992287461459 +9229505251418902012 +5245848917147862643 +2541760029909929642 +1091290881845382491 +4557266064393902051 +17069215829953623070 +6453783688492569470 +2592039302459046209 +6019830301742554952 +17572367682666376561 +1873618239687647262 +933515180788303986 +10235128877322808431 +9715519715632307536 +1198918853367390844 +7421688445623024278 +12862732108132005578 +15733389799266724579 +4029511590809125000 +3493395552391008859 +1019072135694281672 +4451330242876954974 +11268149246643618624 +1996539665076541751 +1731418056191667419 +12232941055145615198 +17791354712975039176 +43823160197213581 +14260896784227324776 +11264524322900493479 +1120032512935613261 +10490476657714673523 +15287423239113039681 +18212326332966267710 +6140108314426091471 +1007582084889056560 +2262736868094467537 +6444189713816225654 +4237202460023144578 +18161909144966818726 +9985717550982648537 +99025451 +15291089486741188317 +565586061691341483 +9714279527212397981 +8876352369221322320 +14350352032079164987 +3023824601817767138 +14959880358790309153 +22561595961980755 +9908927092227588269 +1873618329969374374 +16426766960961401310 +12549622261011521326 +10863790172048665181 +25099894056749168 +1873618523430651633 +6504968775580071122 +12830519767028079899 +1223283082387410830 +702355655485629145 +3347225047026709628 +7562235540534921217 +4574167560718544210 +1407669396950960688 +162005644 +5512098557251945790 +66093704493225118 +15288551326219988264 +14241988030872962491 +13121836371098946421 +5283596354547244919 +17165169411364360643 +14454416634920313317 +1733956203815066609 +12514692545578880293 +3801029561147463561 +503001777494 +14755893415135952212 +32714379921074865 +8934971652946662657 +15292217500761933118 +14101026495287094 +17170845012500291365 +1873618467542930701 +1415013408097570507 +9870725102989338 +5327730873329919443 +16432849329658227187 +130892669640585600 +3973491001936446780 +15583694336231430044 +14830323918951832825 +3645248749925655013 +5356714232528118561 +14383042897662257 +8383464655762758188 +2708712388481279214 +15291935454266212493 +4027868986110057460 +72745468 +1732546160494133851 +18301216972082383618 +13779987578959321936 +27638041680168303 +13647676496476007342 +15287141235607215646 +8709732826087622782 +4079990856258172292 +9707340264918356758 +3550840664241428880 +9789486956897258225 +3754850917948401713 +12163423461833712462 +10590197086357423689 +1092700946662503041 +4000515045254372773 +4025969582498383295 +1919627395655994930 +6667929674123710807 +3416455939372761789 +1945545869137547138 +360260104204532933 +6785332882202955700 +524948496318606678 +4399490440720764257 +11214586976423852371 +5303047099741254752 +2625321610894247837 +343934508506 +6360349248204128073 +2364851882646508051 +238774704081419603 +2327459530418636675 +18213996499704942794 +16161846605293767847 +2549667461012471041 +9183302404537140088 +16954752487389140994 +13480762901537765522 +13515324952400178338 +1873618454645114642 +154075756 +4397798359500019836 +9870725139689555 +14063480800060650057 +13160741469951644016 +9147860258549471507 +30740269400134491 +3542979339401838426 +15291935441368403972 +21715740214890963 +15920104769656204383 +18071902650785863059 +4713167439824750602 +15289397336734905044 +434216253040 +8035231345285289840 +109445719 +21997730822908331 +4076606659426397113 +15788257230634753112 +4221282834348782682 +6156738011238783406 +13063530465455446612 +17098944112019976917 +16893287896254256939 +2035272753930062798 +3599049447786100165 +15891669158839084755 +7482850383114809381 +9525246920338989417 +12176198824579523789 +1873618544926858849 +1414738704542881365 +6209141871994876989 +13070886371126478108 +9870724575344439 +2115904740333788300 +14848239906707278405 +2048016299960188254 +2522733585047579418 +9870726108180721 +18315937218011467869 +13038998368501000828 +15287141166821694068 +4184798637958763722 +13522668389390157414 +6366030573177933896 +32432337723076170 +16660466393254414764 +17734759782129672655 +3707523343843206934 +13941261607942841787 +651404411106761210 +5245848925746254604 +1873618489039132594 +14610564085569111776 +15490089463971912781 +1410790483502262179 +5240852582657493474 +818086838 +17426894917853861250 +12813567607291396229 +7241043887751895900 +5138039729847608945 +9552217677991005072 +2763449963075558544 +2926114800292876176 +15291935475762425205 +17464068196043339559 +12314650515995440492 +6208295861478694540 +10863660303552891036 +1986481357388331191 +3443694572301214327 +1869294573099966990 +4759048207614420054 +9254753202221638106 +2901543272456920980 +1519546395961742196 +1731982071800418885 +14919199795427633350 +1873618338567765131 +15604668241884680396 +12317069699553504173 +5152193553567330824 +7739503383441914791 +5331013002655575492 +16055501959461085994 +18061482934504740622 +4033878969755921713 +15991329612793777185 +365430713235 +2519447650948042312 +20587674604162039 +12286098987865819770 +2006158509085184292 +8054758354584013306 +15290807375757656760 +570256568893710441 +9003422479159138282 +1873619026425160021 +15394822466617412826 +15294191632777815339 +17157870623127836563 +1772166286878195988 +4129856577989254640 +18305914028471692768 +6152225714402235894 +9870724567402585 +1873618476141316771 +1573642406722889682 +14101035093680877 +3757107096460017224 +29330157293667421 +1322073399071682652 +3737546937501301206 +1873618235388216580 +1466296571978343377 +447360420122266222 +14206226796729219947 +1467988623105727898 +13545255731073344253 +18191072227770244413 +12255453 +8608480117059179466 +2570000727861509512 +12388067938964350956 +3461791464603261918 +810156929 +7738162237860699275 +15281500705493050089 +14517406836956661503 +1592459872626106317 +987047180239644831 +11844848603606308329 +2965355789682620326 +11331431558187921111 +3384875524276576527 +15925946803693423456 +934643263595824286 +16114501440638959219 +12921633150132111411 +3275368580097917344 +1205890305561803604 +2676033356038079832 +9870725383680191 +15287423178925873832 +505676503 +17742276506148682157 +14270141548948173736 +305241078599 +2311596397202514391 +10546947034642076867 +15509513448850864927 +15287705195328265946 +5881704967874103538 +17600557249351981168 +14377170520674936759 +130269940204125627 +13455211411485508614 +7303449720790661567 +2218876188428416716 +707696598575759320 +2787671431665157349 +17321554395095449064 +2807022821090739235 +22561729236114459 +5249797185478600999 +4792614539776965024 +828143452264025783 +4200511986436426802 +6153353844499089111 +12314601354656483126 +9870725079199722 +15287987211730632982 +11522409198213423610 +9112482678314977915 +399811749952817933 +9336987532144479796 +8721125903693269488 +7393621068155992563 +16051417139579346358 +9193038184917383965 +5348521357472386351 +4022228683851195474 +14110461356857430009 +5835546375651263675 +4212103010529071811 +17344893487108796056 +9870724667109190 +9870725142179928 +6206321759557388696 +5462796894122029977 +5887800020369606783 +15441725066593786733 +5569296722649360473 +31304285008889193 +4978071700066687793 +4325515 +12771845668508487919 +9866850807948721045 +7791039443921418144 +5149373406735848208 +1992881803100621054 +14607325578284117839 +7150386713576490090 +13078006574768991429 +10861968243828345834 +3595101162260606441 +7073102484926630551 +5728050221689420849 +5123595923779447125 +511975936434587880 +6985875272338714177 +3883415041176704291 +4393850091170063263 +10920637407696349337 +17402812579345032389 +9870724577848871 +10943666403577237450 +12535112539958361143 +1373913227021802982 +1974153104562411355 +7088020785212496289 +16153465402254959133 +1815348248 +933515197985080286 +18145897085588033983 +9870725375750282 +2625039560099114911 +17457597103457790333 +13438424846118235456 +22675774 +7593888507932715618 +9524125248559798839 +10587083886808754025 +6060555514851763988 +2490696961521168026 +10056311326157724471 +1252450728145478108 +12004437043652013923 +820577224 +16855076355234878796 +13719626382719785978 +15292781563661262868 +15289679370335308078 +16377260960560187819 +15247522875101760776 +2105295650620515369 +3541523056543361977 +14938334394280402678 +6587837650889036968 +12537862846127017692 +6119741675792637710 +15289961386737691952 +1456277662125218706 +252562806505150350 +17626633272741334961 +5058465025328114218 +5687300831469715085 +21433663625388526 +7373655750280030047 +6153353775713551670 +16150710423697378037 +1890321788466260420 +2106987774831187238 +956348125470594785 +4396136365600364820 +516096747 +2158263565678815745 +10054619244936971100 +41025899 +21715680027759936 +2473567754888886694 +9870724659179292 +14554031644319298764 +17843343571841870509 +2330447533672305672 +17887942737686776551 +4709060078846741586 +17958290734101235336 +1731418116378350386 +1193603335023233930 +5813899511977043099 +15291935527350703681 +6672837949675880436 +104006209 +5354604863999665656 +1873618484739705502 +15303681845111837926 +1894834033712776103 +9301385328948897656 +16051520737623174210 +1873618243986610645 +11973532095252095581 +10775484697845000067 +1767766352370614530 +13486365294955410752 +2183358971233783252 +8138389933240493889 +11266915032714840583 +4451323549999957434 +15945825479404380717 +9504974943638478896 +4342856295231075854 +1337484232950881869 +1368876753925116732 +15289397366829493820 +2859003384270886225 +9870724569894177 +5337765204523766604 +16864738023016502547 +4823338247739626343 +14745847 +335592258898911133 +8408210533955934284 +9638113321641200886 +1806610859089211551 +10375505313690040446 +5887799994573980828 +1188221409487376803 +16993530958884068640 +13294897524111587223 +6205475680255681779 +11850781971479751540 +4832616225180118467 +1873618334268337500 +16337104745240476694 +13788819762462599956 +9232993931526353452 +5734824761360411401 +15292781494875743054 +18104757980346193805 +15293909612076028330 +9619947050333462054 +13916323858583020499 +4534407021717709561 +4452740324890864323 +17467452392876363590 +1693170535549249189 +31243224015702806 +1859607805736543461 +1043399313624681954 +16044698410490725659 +15860561610643614456 +13819014391870758 +313839471592 +96258212848692384 +1800007179749372672 +15291935514452897108 +7188036157125576810 +16434804525676115635 +32432320525830439 +15656221584031226836 +16892239413473718780 +12979230768085550694 +2785415326238066493 +6120385133579475505 +1810755611451154472 +6368045642961655288 +1625764319863394884 +14101030794253500 +16954752457294096299 +9870725126320197 +9870726551531800 +17006567137563975105 +15289115337529318262 +7924179306407551594 +14295133425996407600 +5352762575340768836 +12102598112229863084 +1647172074010134621 +10675295313843995764 +1785514015364042513 +12631642409355132873 +5568582435113414664 +17498716319787862949 +27356055371143920 +15291935458565177956 +15853506656536645182 +9870725081690104 +5368306534843506763 +3649479210920328377 +4082933432107483990 +18154664940773722443 +5058465046824308428 +12583873178280597349 +1136519902700258625 +13726068564214883807 +7105448691678271850 +1836789905089323779 +356829373538 +5255735640102102199 +1734411945051167404 +127914135665264830 +6155045921420412650 +15288269301218745516 +6455746023987425378 +6815921 +8692390532950212920 +9934159705040443773 +1627738404588710270 +114426460 +300941654634 +4448228083942057289 +294416195335096411 +12817829052282052069 +9870724624969395 +14783835626996128884 +494402956106 +17377537000932076659 +2202768282103261673 +9870725207648728 +1944417820723601304 +544867112 +28202143271231719 +2235142484806165088 +4729938940919880301 +14910538073096141477 +12975428192621638013 +12579547732752154726 +2497817165163673291 +2128371995073662522 +18035384405365761748 +4448228028054326016 +8991012634238150738 +1410790444811308869 +987047210334243273 +9232711936620171449 +16367553597842353272 +23125684655249750 +1104816004688080089 +1519546413158510986 +15287705281310562857 +17311379792157626404 +9429188082788342240 +9304480456320748248 +13559180645580621850 +1873618355764546436 +15291089465244522885 +8078674406524480774 +563217229 +5356296979613161691 +2858235436512923675 +15293063506979922725 +14420158632848608138 +6151742330269348376 +4733558161601029409 +9870726974042406 +15290807392954426725 +2543452102530568296 +3411546352286965902 +12439947348243538292 +16778118726452662775 +1728578573 +1873619043621946974 +17463424374412552726 +11841602811682566485 +742583929184658181 +7157740250597050455 +518587129 +288043848562 +2906754232540948547 +12361695702868840889 +151126621 +18147141886506250855 +947491522035323220 +15288833295331304979 +2135400849061260017 +15395492066576313712 +13485237160559133277 +5995296157134227520 +9870724661669678 +3583096215260900862 +9305844401735625834 +5357143003025907714 +15291371425759170001 +5863606022259492826 +3546645479553521056 +3910337726729176234 +6564779258036103378 +2625039555799691814 +5437205686656571628 +15290243428933978904 +16738267560997248460 +16269065739603502565 +10569185367028016839 +9870726992392488 +11737100232328036406 +1575334548130318553 +18313223193769100830 +17209422487295978782 +16560332262221096519 +11286969412412730777 +1494902074756979932 +10595566391331074100 +984867640908593024 +7886367719221110880 +847550209620594262 +4076606650827559816 +3764031824902033460 +7609869710022485597 +6415222970935284736 +11659535399388778406 +12738276254631804620 +4648417872950089796 +8774519406181757801 +4292990564902389466 +18019610867533695192 +17142371033437134245 +15953341572844686834 +5517738915400603195 +7343422898977461943 +17236251 +18412827985276633157 +492307151 +686725623109533975 +15326505426505638647 +987047141548698191 +9870724635389697 +936335405003270569 +15288269275423135870 +12452346157130395164 +10428582693614591905 +2861086850443975944 +15291935523051285927 +9515351559639735135 +15287705212525026859 +2388225538122393781 +1072037457616916063 +1518418347547781571 +9080544794164534465 +6163190042159571775 +10750585189167880546 +1544372109263394894 +9966772835707137229 +18425890913426347716 +14101039392646494 +9822511720162536209 +3759645205392463019 +9355026716162009364 +10692085539022708522 +9696088671876502506 +5459976644113468289 +6384132939295241398 +1873618239687182106 +9325672081535223735 +18123094555302189519 +15287987228927396675 +1839019217048593536 +7721139341596321277 +17618500289837362270 +1467988627404704528 +1258091056199517036 +9058418294164966053 +12318365723907597465 +9870725971341531 +11501195652629143205 +21997756618049241 +10162787617149556122 +14109615247461919234 +15292217457771554571 +17804752012173721390 +4996002199103874468 +2390185312237133253 +5384245063844388602 +8162797955961799624 +9948159316759941792 +5522024736058652856 +10464976386601991516 +7718319117380889821 +3478039985316562895 +3437045076364957499 +9870725926711507 +98566694 +15292499474173932796 +5561192151909210595 +15290243360148429550 +14655309148374720935 +6830013382341894716 +4606392329728302582 +15290951459400670530 +11403275119319064805 +9870724716719975 +14471678324407810135 +16222815414161206054 +8064147145284597267 +17628048184875491307 +15292781490576312301 +2676033360337056251 +14770363635410095872 +6310598981596565593 +356831868751 +12300297158579526315 +6103488066881071541 +11078361536363433136 +1338485804233998167 +13819010092442785 +12163381674616883890 +17309969723041078441 +16113243540925202505 +503001340825 +1986666393029200991 +1734238267508810439 +5153756500002946774 +5833854255739590660 +9145878415644830890 +7621165437432839944 +613166273235723548 +8529883931945687447 +5408471212899110030 +4502324004423927097 +9991863360696360184 +11785248268986627227 +12846750210874357524 +12771845728695162109 +5570988833963444820 +15511400850592414 +2541904157621442294 +10655427086318127503 +16404630304092470617 +4023356684975369164 +16948240854967077598 +6365225461738636619 +8503038889280879320 +14155065869643747955 +72286714 +5565348488712166543 +10466240859483683838 +14996900986698865206 +199075413713238156 +15290807457440545396 +2786543383251193103 +6387551633765000474 +12450654028621562739 +12546421573674877028 +892741896583010987 +4179551994794956718 +15289115277342163041 +4664893967129922192 +5459371768119121480 +8511792369591787083 +13841817523557509782 +14497144097732314667 +1144540826202172765 +7034040473057914251 +15222009040885002278 +19177592591049712 +15289397293744523027 +9747938160688979439 +13911791817300794775 +7054414733956703722 +1539084261782992780 +343934061697 +9000175551589663034 +1788898285280313428 +1839045958927663484 +933797274574141740 +1444869123744603125 +9420097755978886490 +16481554245637247036 +9870726501462292 +5016761928183468341 +11078361523465622754 +8722535938415342895 +7026070094382699515 +1788616212990210549 +9870725183860828 +8304830761476974460 +1873618501936486350 +16484583047917818601 +2181241488241930925 +7805538820292237011 +16918675908887334161 +1042835233529357949 +12389845650708195405 +17631161354329134611 +2625039564398079712 +2421359666 +46006654 +1482883811291915205 +900613183349464664 +5960226872374539797 +12390925765471182731 +21433723812067436 +10997179706937455435 +9500398502017512993 +153616999 +4288796583291461928 +27356085465714511 +4715193929858636232 +1574206439528412055 +2592192606712980025 +3812049113439150094 +16759426304739641933 +12423571160430433365 +434215788820 +10635921794709211946 +1788052248969757091 +16040216177439937696 +10339165646853184517 +7476248159049233565 +16582895391733275304 +2067113850180035935 +4447100052724068660 +17619177932243278372 +16918529989954922387 +5832726190128837491 +4662355849598604637 +17937003854791184749 +9337115527177134779 +1873618544926397300 +17606420371222388921 +17204989276292524516 +16222802744732624095 +15665247498475621169 +9870724574899723 +10166171766691991964 +8396161047500240343 +14851938267165104129 +15288269284021516381 +2898198611301117145 +15290807388655005498 +7418029705657673769 +1251604696133883684 +4830412376448783247 +11287131011864548201 +6764961555883638910 +5357989099524401796 +5980142852615785094 +2869667856882147128 +5584408385225363584 +5110537861164586623 +5386207961880674846 +1254142826561745454 +1568829035453364012 +1413046597527284127 +1873618489038681281 +7060413825517710596 +11646876411505884726 +9202545986551358543 +3143159605221802517 +1873618248285577681 +2368479942246745019 +828425468667192622 +1785514032560826560 +2007004545395279530 +6061683623453209438 +17945163558153962383 +15291935475761943321 +6458752725082789396 +9870724593249898 +11690021256879958213 +17464068196042873886 +7511968970221315783 +7026323620478599146 +18613533990671556 +8046854805629641545 +15160252096864276676 +1601401898984882183 +7617951678880701705 +5877092734509854979 +4397798338005842429 +14966608164283169023 +18412545964574834746 +620757861 +20023667593325578 +18113219906700450944 +7447272838844917212 +1144540847698369036 +17268586467140130023 +1130478201313114427 +5211524168612731761 +11002936678134539020 +12317069699553054800 +5357143089008221521 +12207475163967738739 +6783004000036997388 +15289397315240728552 +5994450116524249874 +11868171643901667799 +2840357278731082240 +18150347534711723338 +878291194696442271 +20305683995711067 +6154199812024909046 +10766942018603208127 +33560368941827284 +19177566795402134 +9732288421442822403 +11674591130302441134 +10898149942002916585 +5539270545646881104 +8854886146944601831 +12060104512255840587 +5701610621477129021 +13819018690835416 +2063036625509617760 +6100103844253667219 +492722805206561746 +4447099983938538810 +4987909742416571697 +5258533425167020200 +8150830429996001555 +12202820934352391506 +4129856577988801362 +15292217509359869933 +3430094327326323037 +6152225714401777998 +9116081041306376445 +20869691006076731 +15524056333951586128 +8191639813112407788 +9870724566969839 +12567175869885339384 +13670576049708994496 +3958929323532773476 +164037275 +14101035093217440 +11615458675145708791 +1873618476140856959 +3914600725226548445 +17250533012671124825 +9165456133652496617 +871001638917598251 +8277079119226301096 +475082804681644195 +4935889458764266929 +4279983450203828811 +11796695 +4736709352635194627 +440358679437077054 +15287141244205140113 +12589899362083680276 +4501478032599498981 +12432294066686546434 +1146796923031669614 +2621922293099290216 +5196265237615086368 +825605304640168185 +9829380274729659880 +14836382508930370955 +917761617923233281 +7706082920376050963 +1309203743886743290 +14092212362992500704 +18263821886743185772 +8728679725505130035 +5528062368493082105 +7251500498494057740 +3445610551068332668 +16910251405893520588 +5863211220867695078 +17122229925258211441 +14959692054351324223 +352532454452 +4079990808968386372 +11659229900329267748 +7406275616552084313 +15188321804664516035 +5574057256785746211 +15293345540579080147 +9870725965902041 +17778250071320304256 +5782296444190137868 +1817172780335317059 +3224279646295451545 +5895024564989802597 +10747542314255327312 +12592603749474129476 +20023598807786478 +6209141837602893925 +1145668896113119756 +11660754516412341592 +9741420587119950166 +1734238263209382875 +3284152335116213559 +6889169680069780374 +5727238916730197092 +2625039572996465136 +22561729235663771 +1519546473345209656 +18895434315674909 +501165545441399085 +296644709200 +4454707759729105800 +12126270554500902690 +18347035773045006847 +9737446257049161165 +4449356149553583172 +8927346208150993575 +9288819099220980689 +1413046563135762359 +6051786176702917947 +15684162590040353529 +13510731800083434962 +6947374277897364903 +442814170389 +4436378712987412717 +9820384599397850476 +15289397345332830644 +13101127915625800787 +13655523387674213350 +17475623036696859945 +13455211355597319916 +9870724666650433 +1185420269881012882 +2007097425177484118 +6985392787171329956 +17406007983559763394 +15290243390243022480 +11530680413559804423 +16953342405374333570 +8838364843547440325 +5153306075531843444 +5569296722648902934 +28202091682476307 +15801863628634597162 +1182589355307181110 +10906583509963051909 +18204000979322092746 +6667196546127308521 +3866756 +15293627574176992567 +4662355858196993421 +1143098876954481773 +10302941354694948876 +4661227740996709006 +15130192006825794836 +24817813164869606 +641217140218936166 +570157671109836508 +9870725097091078 +15564529833679083909 +363080268232334374 +14055047205356791219 +7660382775690223630 +15287141175419607293 +4662073785906890031 +15601595588513128716 +7162990143641111181 +4184798646556694968 +3717985454976225575 +9870724577390116 +7492400794217421501 +993756262263298633 +4183106466458307862 +1873618304175779978 +282067642 +3757107117955753169 +13207638922979921477 +2171277651429500134 +6213874949885069218 +797826839967388319 +5464488962444512457 +10585955816899812574 +15287987246124189167 +1890039827951145800 +1305664924497172422 +7033924864732638290 +1256399022268900360 +6204347606046083061 +9870725375291527 +2625039560098657338 +5249797172580327707 +8411259318042180416 +297236307772120809 +13626115134928150094 +22217020 +16964592658668655774 +4067676013579037024 +3493395569587326774 +1998795796298345337 +912038644489066702 +8515376930132871119 +16712174081697144022 +1379230395675991739 +5540680986801154585 +8502756881475650572 +528614683759162711 +6156187872936204218 +5570988816766210581 +3962482802667575753 +1413892676830257536 +21715542453740368 +15292217474968331436 +5245848878456439955 +12426051065400527122 +3870997034531752803 +6471833751608640786 +1467424534411570096 +1873618441749339865 +3101815889301670444 +10897792120706253481 +282995442491217982 +8074562693751261419 +8618954206934993224 +1184854787186235107 +9870725070811099 +15131353489256221185 +15290243377345220049 +17364762922491455391 +15348646837338318101 +1334707079751929668 +4584387768578949163 +7349047731883806514 +8437076122447003090 +15610464942188540934 +21715680027296911 +2437381602884412336 +9172307150507947493 +1240063138944728300 +8422587032633423706 +9870724658720535 +13529168416684907253 +6155327963617968394 +3343621948189118808 +1641722396656625802 +5353476794090723879 +12239346396898210015 +5153885686375935187 +4129856586587198441 +1923721613081729429 +4500349979885333198 +6634239828521735872 +103547450 +1464040393467498519 +5305355559708142999 +5362937130988801755 +7767605443550715300 +8812300966546980527 +1873618484739253894 +2678007758899985805 +18272015780095158938 +14101043691608603 +5726358149067841561 +17480593072628501093 +7322075253637915597 +4280732318042494527 +12943066728187449531 +6248375418015599583 +13304414708505260877 +4585577831768206959 +14383060093977176 +5878200460756541542 +16948240872163842578 +13568379163883083052 +5568018385112682433 +14119902126930660937 +16108156248054046183 +6479942129004124270 +5565348505908943735 +9870724569433729 +10489348592104705629 +5160383052661333281 +16904712944497920326 +7256417795175102445 +5622264594716057016 +27638058876476123 +12300862889302760385 +3545799490531822688 +6078888131079322816 +13516154755646772620 +618266364117657263 +14287090 +2857298572705729021 +1466296524688532949 +8752346611156860324 +15289115294538948711 +15794456952549301147 +1873618381559710593 +15289961373839405535 +4817732052453110085 +8380327196105138167 +11290917642050014780 +10028063380012219281 +3090386640103688983 +9870725107511329 +9828008905086669883 +7739503426433853824 +9620696530750224820 +14249921989244033157 +214961382512 +9870724632440545 +17484406395699534044 +15289397310941321019 +17517494253755977481 +17627766198566473648 +14264208198271043974 +1413892608044707684 +9723252749133244117 +4819849461168353565 +10452600916550176950 +17499978031167065471 +9870724587810402 +1839045976124438367 +1836789862098938995 +4002902834531943011 +8421459022910396210 +313839008801 +227485570797945711 +13819014391409550 +1125989579737876837 +5347608075563259012 +18209008298942683982 +15287705203926191205 +17428596285504645350 +15288833321126468968 +507708124 +9628020868018956517 +2374936041605498895 +2147544210029093564 +305243098454 +1682680408670024326 +3490460290412004654 +4292383463593693152 +5803642704635848827 +17298949057997047589 +2537811727186748299 +5782296396900802366 +15132199491175256723 +11886734650887064399 +6688203073032043207 +931541121857700975 +4352898200719795743 +15583694340529918291 +3541851239397872655 +9713395898231441203 +5467243183464064909 +24253862044721930 +17094376519213261821 +5572809636518234139 +9870728774185276 +9515351495153166020 +5055605519643134290 +12369348373828426600 +2544016079448390864 +210659444315 +9407311746210747951 +6779138548877443377 +8207049193560882215 +24535878447088948 +1080565106807035116 +5780604289885677446 +3810357023620811263 +6151097683183797493 +1873618368661895640 +14973755244238032969 +7511127039787089884 +2718238867518020692 +17986050518452758011 +14969897171663153277 +1687633383652216552 +7418593785752532651 +11638293600493988003 +8055831057862766916 +6357162 +11914033385203063784 +11180753484911430908 +13490114059969452339 +4129856608083381232 +15292217539454447551 +7621113180736601052 +18010211477477541290 +1873618312774179808 +18179418362103998511 +17724004206334462259 +9870725207191653 +1873618506235448739 +13196216608288288790 +6319049858861653820 +2842331449438720682 +15291371438656547993 +2625039568697043290 +17209702661824670883 +10861968196538555883 +5249797181178709209 +69337553 +9128498766157728138 +3541851273791877877 +4393850043880249598 +4922099011032715416 +3605651160022606050 +828233872141346498 +13146987887805687114 +15292781572259190780 +8626938315809381015 +17257283880273643533 +11127650530064345164 +1437173080522903720 +6194279471740576021 +6050815110615223241 +13958585917746135293 +7990307563599967869 +858398218214576228 +7528870385169533979 +11411195069654059851 +14246473519475596802 +7243068524281020734 +5814312089830246383 +2071895132541364563 +15580874176502892132 +4056396827994568646 +16093881220281274225 +1873618355764082776 +85348920764927349 +2880062506237892853 +14065038233622153931 +195297952 +9870724598230640 +3701601059574263687 +1836789883595155336 +1845861655795212084 +335335219265 +16322655732121358163 +27920040887322186 +17088205463377873568 +12509175466786557638 +15287705225422382681 +10759828418061804953 +5583280272324051861 +43057525 +5151629580948802356 +1091290894742266541 +4894454632541732599 +9870724661210919 +9870726561493274 +15089863198376021901 +11170480721379023151 +8445365264947768221 +14394657552753905377 +17092164746527251701 +5154449701984686731 +4078298757842226231 +13847046279639293189 +7194608100424499629 +17783567720317063166 +5991347863009908118 +5572945699559986657 +4222974932764606656 +14926165161459649868 +15289397375427420351 +14665059300368990 +2743611323352310719 +9558534580536750758 +9870724724191109 +12151297627922785720 +15353397586595619637 +15741464833937988435 +8976976526060176801 +15287423252009937919 +756030260498936592 +860891621129473593 +9870726364623114 +13145441259432329925 +61407645 +30458188510743218 +2265433577080240208 +782242303113436612 +4131548689302885404 +9443989419749104436 +15287141205514218691 +15292781503473657924 +12060644004350613732 +16777494 +10935036893209179191 +6364097387529046615 +14021752200148692753 +9870725110001720 +13726068529822894439 +384649113237738934 +9870724634930940 +4453022324096785324 +485463575221254705 +9450836199162472240 +16327925331576709650 +3132165618835798229 +11786712501505700888 +3810356989229291881 +13819022989798634 +15287705212524578773 +15291935523050831730 +1543897520887845462 +14263926160373733213 +8908700072519087570 +15501550415560786413 +1564161993477482692 +14101039392173658 +5249797202674912471 +9870724590300776 +619366483213246746 +5995296144235971636 +1251886703937403635 +3255779776847703339 +3690475717042517542 +6334248476752950665 +18311460837185171507 +12860589340109840384 +3921651208379450739 +9546289116437490606 +6814198451349565321 +16112245313716443289 +35127645 +1460339693 +5831383648635412699 +6532095472223852953 +4995920145560198066 +1731418056190737873 +7771697831659064954 +3843303877637384937 +439490216513048181 +15287423239112119918 +15419324667599398996 +98107936 +1873618377260289904 +11740202404159819072 +573178715 +7476812191854775291 +5787083718919720300 +8487173076311556090 +6890349946557761313 +9870724716261218 +2843925229233771993 +15289397306641887838 +15290525423842183114 +944466466062802466 +8773316688777395840 +4066064367101163150 +4203104183320722480 +14695260031721098870 +1873618368664388798 +1880166538707033194 +15958135924774883377 +13055421963249404421 +161088132 +14530733744791175051 +15869995859650226934 +1873618321372569678 +12628608773943285399 +5362655123183592008 +15288833316827059848 +2530175340657839273 +9787880004680691716 +13728164708410733454 +3808100888100343209 +3814305214567624162 +5352348805862656188 +2625039577295429203 +18197008871679083134 +9870725102071832 +13713940465522533134 +1441063386750533487 +1626046306171504559 +11302508717964532990 +11083988851659773003 +5619444456482955218 +6438099331113955411 +5197393273133271298 +17062153896009539349 +3234866947851553000 +16884063401366475122 +546898751 +18613559785837171 +1467424551608330951 +12621145023895131861 +8507715619828734940 +1732546160493208684 +15291935454265296948 +71827955 +206360024073 +17429464387318341036 +14887447490140053426 +7099832442789185581 +5461950819120058507 +12915164710029630328 +11514789185312918199 +1469680738717087943 +23689794847192181 +4742067642791909313 +7599228952498684356 +21433680821684597 +3944001801547297101 +14465977220360256113 +17087641439171523073 +15289115277341695462 +4128728542471407690 +4000515045253449269 +5778348244646975267 +17993074031960539567 +1092700946661582453 +12540363038546225944 +9870725380272293 +1996539643581904204 +12367571560668021285 +1873618364362480381 +12899647259444192436 +11577446719729447275 +2491451799234961538 +5926033321115200882 +19177592590582103 +12243195703567128718 +10599796667465347683 +2502785113463407945 +1445774942907271091 +10704030219077568879 +15110668359538523125 +16913787429901308452 +1148489064437865604 +14474749879232849728 +17126097606958210620 +8503894835705165256 +12369638835304805966 +10683050209305650640 +15291935544547036648 +14395142952506911651 +16589954806536216789 +1464040410664294608 +14268731398150296273 +8406609175603594162 +17631552790872272318 +18878876897073272 +1873618501936022824 +5303047091144431105 +10476206345657258525 +1325811029470492714 +1873618261182932621 +4385540065350324414 +1031583703478717941 +45547899 +10611945342233165339 +11865746456183651769 +17781311614889966274 +1166485804266627441 +16930902619033575917 +7078572155669342182 +21715546752696015 +17090190657502534251 +5183103457040545302 +10309053949146063928 +688082513325866460 +7239069803025663720 +17417263047611538361 +3691603799851275610 +4539654357497877658 +13134019728606977702 +6045857703435395305 +5510538203312426943 +1928986057181235415 +5168538745295288713 +16148339639238672390 +17168369927962890203 +15788257230633832916 +9976735803327387769 +23125680355357638 +7583418349130950579 +7641505215916295575 +6041909409311498720 +27356029577545912 +14463310864315785552 +7449919019336600171 +538968856 +11985907604016014423 +3172866420814208587 +596258693554520496 +5996988259849478117 +987047150146639383 +17016498717541033760 +17243773148204516588 +8342619791447246500 +5457829388192855469 +13819031588194832 +10720425910717912406 +331035796707 +14490647810019058842 +19267879 +2137449994706708782 +17953567922356444105 +23407808536904833 +16998920198152599009 +6223971552560829134 +5558136817694803400 +12628362812170004121 +1873618489038218678 +14101047990576422 +12826909658979572197 +9407593809903240427 +322439895721 +817169327 +9460292951366525812 +3547491601845931767 +16485733270290647131 +13237708552781955078 +8102805470461441415 +3541851256594641534 +1522366620176235863 +17136135974801188634 +23125762041194802 +15291935475761492897 +12959993612909963813 +831245589702595529 +6833161505063583291 +3374038090428140608 +12076011538210559549 +18613533990193666 +6616883720368166671 +9843081593884529663 +7474551948241100569 +7403331834054582320 +13519566239053201278 +2901543272456006951 +1873618385858669669 +9637918964669370866 +3866991139016690640 +8674765056937646498 +5153885733664807314 +1873618231093310183 +1732546126101693793 +13725015683390457666 +10139438201185111279 +11027859546261971616 +17524419317323295001 +9836098812192577524 +12363581403452875655 +10469575575568531982 +5867051617488678156 +12061232556372405459 +33560368941368890 +878291194695985110 +6984556889450880212 +11982867488766957971 +13726068525523478861 +3522810865597948451 +10375505262100812181 +65328991615069908 +15967933392516835614 +13819018690368748 +1873618523432225060 +13296708539219597786 +17329663563731781201 +3812895115357730009 +9870724566484489 +16408909217851576008 +9870728842146114 +8418627805372568713 +163578521 +4396106175102523774 +10196949444845310073 +13674725198354205609 +14555507962055777067 +2625321576501808484 +15123507772593952947 +25099799474686661 +5109693820200817092 +13439822856906099605 +10114666733281746687 +12774749518464557245 +14258849865125210847 +19741565209438214 +5245848904251626004 +8840379995512922590 +6074624751477808015 +5938098004633727437 +10498048128495980357 +214958409445 +3950544335185858648 +17490170222977955855 +10923537525684066988 +5450820461064636366 +11921229983125026883 +7921261106565897321 +15290243403140374177 +15881445561639371975 +2211622227514629247 +17190313216042025536 +11331431558187003702 +13843873562394059707 +9432352330309579665 +7792373120121047026 +10967349376607587326 +8687671170001756825 +7519876478708574271 +2224234517276395067 +17634738440501085326 +7384649264646930203 +15287423178924957834 +9282455518003534828 +13174099600966507296 +17088205480574656547 +17314774982313399129 +4604702688230001559 +22279712832824061 +2624757556593650654 +1873618317073134955 +305240163829 +15375116627154454305 +1576180545749469378 +196694351502978232 +17826052294924060938 +16388947490127744828 +2625039572996007486 +1095239150175202128 +15291371442955505621 +450713825271441583 +890886484313128072 +8544119418517540909 +15370914289099943792 +11066048138937916445 +11131448449823093591 +17314775081191027535 +6386508245877403431 +931541113258856500 +15292217487865691914 +5967789407322381598 +1873618454646689506 +12826221827947183890 +16380751128033967459 +155648632 +32714319733014069 +14437962511803369695 +9870724666191675 +15679245927777250216 +230324560330439209 +7410122313245140513 +12864384740147405926 +5873390430531623919 +17305728453583460950 +16889057594325484725 +3407997 +4081144042642301917 +4279043148 +4131548706499659810 +1873618360063048861 +16364556099866137350 +10813994005317361948 +1521848059890461782 +2146416174511689735 +5580449110673927846 +11264012024349478216 +12588069258829510187 +883931514151656497 +4502324090405786020 +947600859937591428 +7290339324003420579 +5512098587345622296 +3865299053497761275 +6483565123786379440 +1755968139084389125 +6431170477344757991 +2762911303540622926 +9613532106557448424 +14709406741912494662 +1981238373894939473 +18163823913337776903 +5509410184992282154 +1873618497636600365 +6097847777518292950 +1873618256883499104 +15289115363324028337 +1974153104561485523 +5464488962444039889 +11312578691943513317 +9870725374832771 +21758263 +1629430520200061142 +15288269236731721413 +6041909508191621547 +2158545539090372895 +4385107423620917041 +16014347215455075202 +6153071806602085789 +9435617308852819578 +15289397379726380616 +6863925680637416296 +16165083394671723904 +1413046550237490727 +5946696443085589628 +17324797938978137527 +15618337011239628072 +13728324704035099285 +1873618441748895756 +12629869613005551383 +10167863869407233224 +1519546404559205173 +5520804745657784457 +4125719476531127084 +2904780083328607959 +15290243377344758675 +12623424624422504132 +1251040684823625609 +16151845835603731296 +3515151174665987704 +5283032364732737196 +10604601913840330909 +6155045947215131464 +1730290020674584371 +14549447925366212002 +9941138681621846041 +8874660326693884440 +9992164300180900575 +8532865917640261733 +10872279011645156724 +6555946565195869538 +3575875050819498791 +16058322136386264197 +9357000818083654233 +5248105082763224030 +3271138316861312553 +11587747989287351823 +8794768896894507324 +1837917992196588516 +13819027288769153 +4726732638863055640 +17593400006054859831 +8139517951562235274 +15291089448049315943 +6206321690770951733 +15288833334023837100 +4129856586586740995 +7919800555511686197 +14067497977558155229 +15568274597296807257 +103088691 +279444546581 +5779476288762293430 +1873618484738787248 +10580074100703847393 +1427463126434521588 +5849955560047530426 +12491853146642926285 +16221687404438952453 +4393850069675419871 +1095239124379576867 +11288249707613744110 +4133240761924805984 +5052423619833063133 +11585541199623371859 +1938100171486207406 +1969772432002322773 +13052649433567615752 +1855301614453539980 +9870724569001460 +15289397366828570297 +8383464672958634444 +15287141252803083581 +3168546442372861780 +18331539082773742 +5833171446177742234 +17105441538492413390 +16952214309669773926 +15289115294538469959 +21433698018468367 +1626046267480554244 +13828334 +7820815413033635723 +125502650066736740 +12152601868746496207 +3861350836757797823 +7721139290007098889 +17309123703926843402 +1873618381559259157 +4732539839761628686 +9870724631981786 +11585485762321673488 +16139637609167872593 +1414738734636557756 +16950522249946470742 +6366353492955694732 +2572415617593713056 +6098975770045320996 +17752869452711816630 +3773122177597967623 +10859115960119485901 +7503895773261348374 +11104544319455578112 +7572974214972066265 +28202057290482949 +16910582413616698276 +12814575729135012253 +1551701861793940963 +13699565059448658745 +1873618519132801026 +1788936369720671257 +10342523920152022337 +6814033208644867116 +32178524 +16038494049632258844 +28484073692860260 +2754754882639057504 +9657336766457403394 +1730854040581529603 +7241043917845580222 +734843566066640986 +5250413499738165850 +2625039581594392559 +15293909556187384089 +879419251709130961 +2625321572202386378 +15782158822290181035 +7660974197664793241 +5248105013977701557 +13352392100613928179 +8080880096685540554 +1947237954656352558 +15294191572589765648 +12105446909435186010 +12012735189037878155 +9567543198176062707 +210658985303 +9870724605701764 +9870725080772595 +7039234514412380491 +9234597529149245860 +3580814869236944221 +5139394742353927284 +12826571567483982742 +3326110669390306457 +5299098818522992743 +16702765178698607416 +6154481914409146946 +1092418960352550075 +1787488203267990409 +3347279017402897709 +50528646 +10267875198426027028 +17147561398476949564 +5890488375432726248 +14839389941674698602 +15289397298043040830 +1519128206754131805 +12084773689887976547 +16706536709832579327 +5488645667241613082 +6971710725545264615 +17943317531894613402 +17951898368652543383 +16858460530570780960 +5898403 +15290243342953227646 +15290108271393981989 +883183489872504055 +13489466036702427994 +18613413613431782 +830399609281003718 +15288551317620222804 +15831435936122152987 +9870724624051882 +3599049409094225259 +4451048252268811542 +9827020170334259566 +9670853251230688650 +12071125155805214282 +936899437808329875 +15291371485947900301 +13942716829043742040 +15290525359355600021 +18279521768686567661 +10693070054104899343 +14497535081682580052 +7442100133155523570 +15510256655233006174 +16112245339511596607 +15288269245330105689 +68878794 +9672281104011519560 +6044165583523679915 +12180761913526199422 +1043399292130055937 +14061389393247285475 +13566705862512228943 +9870724579421745 +2200007821168632995 +642636517009794001 +11076096043879262046 +8453377129057749572 +12269921124803751784 +9086129450390086753 +8630878024782208561 +1893142021279132838 +15453599118730606298 +8925815691991342514 +16758489801500072881 +9089484691973612721 +1410790444810387970 +16610380121150988125 +14109897263864615607 +9870725377323156 +1873618450347267774 +5780604324279238177 +5299098874402772796 +14851060135220743194 +5779476207078951779 +10106558980070862054 +17416860949419338739 +8804410014392923222 +935489347195585829 +14531855176403198642 +1185817877413444987 +15287705281309665794 +1998795749008548890 +2106141704128190035 +13467415675541208532 +4541777000930298680 +6832280519783489466 +1572796400505996604 +14729829438500724139 +13538494326603408030 +2681814701524780811 +9473994526259025980 +14951499744970164307 +15287141218411547437 +4538390390551618464 +13117159209037203716 +6043858605727491828 +11995199952005578411 +3544107405012443202 +14262516039668417095 +2553424131400424283 +1880166564502189696 +8006157077928496633 +12767098738078919602 +11626061297668792522 +7248943748782494370 +8582759827220607487 +13022850749797322759 +12826571498698443033 +13819035887160968 +5900230763127204579 +3519426621714161264 +3652299310461566998 +4106370589627001186 +42598769 +17219576355391231479 +517669620 +23125822227900093 +9130453325961581340 +12542055179952414874 +15711638341870511808 +9870724660752161 +14101052289543000 +17083975299020625412 +14424532992985404668 +1197790749063531520 +8181187340489998798 +8210619437363836106 +7403597951386344457 +15793417253295176 +12744728034573096493 +2949328439242859099 +14241281038845957058 +937181441312903713 +4291298487982624471 +14132881668213271404 +10159392401199270768 +6051786206797047301 +15289397375426960304 +9870724723732352 +830399540495455542 +5246976991356858158 +12648272961984031779 +9274447120509768363 +15623212610978141780 +8618954249926943050 +11434534198373320614 +10436529559778645288 +15854517778466101141 +513768284874087190 +15471768298077296679 +7541956522169744404 +13492563677958250652 +16113373387926360441 +1254424911749998520 +10610253252413579856 +11841255428288298656 +16318735 +15289679310147232100 +1893141952493596190 +1785796117749059582 +18120304561411537062 +5462796868327967227 +15475002871350890909 +13441088501525074589 +4336821560032320542 +3857974274121939539 +9870724634472181 +6362646380644225400 +15289961326549608306 +814220189 +3599049430590436659 +11155177042651386040 +6097847807612890459 +3933486056300622199 +16882226380627140760 +5212269942938874010 +2230449884356225254 +17753726137380181278 +827297390159422292 +15584540329550678645 +16958823041360220797 +9615517176008825338 +6106446224568558583 +5812662174917015208 +15292499577352579604 +3069899191281854358 +2625039590192781247 +10718984542888093610 +2625321580800774130 +10146360051686992312 +8006157009142945214 +1258091056198584472 +16408485201949056291 +2623065733322773957 +10786597878172764022 +8421458975620615709 +2015038418678128119 +3755978974961871892 +2327063003298022617 +13489474181814298864 +9870727870705975 +460010506133 +10497202079288864139 +219257375260 +17951052353838195826 +3439258273440998542 +230324577527216317 +30458222904283804 +1278770520813613528 +5249797146786737426 +1092418968950959331 +15948927659834103783 +18383714950999659892 +4929903884461088597 +550068418745623382 +1873618377259831411 +97649177 +18411699902469439513 +9870724608192138 +6830013382340982601 +6539527888315497976 +9870724715802465 +3226253748217074740 +12015487504111449101 +9084437390665536814 +16266809556791551039 +12004847539945361607 +5459935835318193896 +15288269309816236291 +1083742089127617055 +9981769256857391844 +2150364429944620611 +9561085320276486543 +14320651656584763266 +160629376 +13284158914162477348 +2624757560892611620 +3207010306707713455 +4662355819505607585 +1873618514833377412 +1254424842964450314 +2137404943656116072 +11127961588135188223 +19177549600212993 +2338464757253621765 +9297801894190781597 +17843061555439815127 +14601507731586898985 +2625039577294970181 +2243411901919871975 +1785796048963525514 +1254706859366829465 +14279207073581980815 +12193666400801988522 +15291935501556666533 +1735084312418066914 +8761676844884300833 +806290300 +3841873322109323016 +15292217492164645631 +12013643077216724952 +1014586120351727101 +13762653909580729223 +6829731400332627521 +71369196 +546439994 +9325309112749471330 +1873618458945656461 +8629931994826618990 +14947097198474520 +9870724581912128 +9870727907406136 +5248721461509825744 +3866991164811863779 +15292499508567021529 +107356700000258304 +5353476867174764365 +15413769895921539704 +1204131931776305312 +12303655060422878059 +7948801202848161390 +3861350819560574365 +9870725379813538 +213797988952785971 +1873618364362021915 +4607651442236795468 +12689613402799605860 +15293909642169694807 +16232392974776679043 +12268190774771014296 +17363034096976485039 +17336839796298881941 +11949535899568649179 +16915128496853970205 +9654763145765792583 +15290525410943905644 +10157982332082727297 +5111808941541827225 +11866314916162910590 +343933137335 +10908568553618343357 +16322284022309808734 +13819044485552015 +15291089465246093865 +3491985487575013349 +14098297469516998525 +1873618308474298755 +13199203610271502605 +12648555017078128624 +3251207161467584909 +5329936956889318917 +14758160561175487460 +1873618501935570784 +2250769226459528184 +17236738792057942632 +17085333595876449966 +2341393813528056304 +15226013478378683435 +10441809166173275876 +10787147896205678753 +13824860123674654858 +1197790757661910132 +45089144 +1467988648899981634 +18332619666187899526 +5722409872140275164 +7210486241685418770 +4884114084172814524 +18413109967286566983 +152699489 +1252168741835518014 +17475526178377115727 +15739323154242222681 +10003084053115964048 +10706103907963048035 +9407029712610679058 +5880605058071743379 +9448371426434110712 +5160383069857656112 +1873618446047842251 +15210536763325812691 +14268449424737376212 +10452048994918151308 +10911952827834046088 +3838174829573532320 +799387631219316140 +17717689987511701985 +7116009405336476447 +2487491354099451134 +5301072911838753767 +296144716190460224 +788505299329822139 +11161453508845583034 +11633356565151423835 +17877509356004052233 +15290807435945917927 +63439289 +14087010258140927612 +4076606650829118212 +538510099 +15287141214112137763 +1256116924183958623 +3976643618022181529 +9870724573982210 +17309267256018536307 +20587687500599925 +15293627556981789402 +5353476798389229003 +13819031587734696 +5541264770713325219 +8114359576701898265 +6052895442602443431 +18809125 +14637124918310547326 +6716515055005551331 +1734238289004093084 +14273877355873836516 +15291371468750674435 +5250413516934940017 +10166657031755156638 +2625321589399162008 +3189796500057304195 +2543734080242336183 +7949964965958008671 +5071732803364607431 +9370260837314880563 +15210662859794633991 +1711003895045842531 +4761420805450261704 +9067117985047909387 +12751507490346634836 +15291935475761026925 +3610873996367638472 +8863761891274930236 +2564752444 +1732546181988959613 +20869648015256608 +6314795737296488111 +7235144330384651283 +11555545866497370976 +1684187501505359507 +227855766058 +17465165107689117906 +15775477536895808749 +9788358908483623248 +14437962537598526508 +17564225130024155015 +3489683241489683763 +9248819868739583818 +17945855709612611447 +16225921418118195738 +17311379822251295960 +14676036658166575755 +1296001166564741901 +1841584140944157480 +1994009825720082500 +7042167076170048282 +15291089495338210844 +1873618385858219708 +12306053747120808570 +9870725130383431 +12743317986952749759 +252379820 +15292781546465599651 +5761348878962158358 +27356016679276903 +5155577784791753345 +11719664095548743756 +89551741351239380 +15081257900341620021 +15882855708139391266 +9774827789264381244 +12473686146370589144 +3653145394062249413 +1096085143495401636 +28766150281948091 +9689865922271196957 +11130039777759856047 +14170810794691998799 +8207478600223433041 +4290452447372648952 +15291089439450475270 +17625228016549373862 +2624757569490994111 +15358091014989370025 +511598808657 +12481510747134636349 +6641861280600709005 +16354660846094455374 +1873618523431782030 +3366665070349868777 +2947421187354082029 +4450202142873303627 +17251943047395235971 +5242386906302796429 +6736051675792293762 +15288269262526901463 +9870728841687358 +2625039585893358534 +17441996526578194545 +9870724566052331 +163119765 +13306508515026147472 +2625321576501350687 +5831598150311549426 +4396106175102067360 +2007004579788383142 +8244000842282446824 +7996062048899655385 +16696975802530159262 +13541032504321382486 +23971682273934142 +3935460239906054172 +19741565208960872 +13453688972047966385 +4269475550692841899 +9263349690548752226 +9347818859728933183 +455711087284 +18383834891218002914 +707856658681126190 +9828660055263613048 +2017529478150501543 +12551372671573896531 +214957950334 +4076606680921217396 +5726226383096781287 +17202169176751954362 +18411417881767641102 +2704904941361057224 +18895391324839914 +14582861630346497690 +9512531322528086824 +16875205771930779459 +10096740648173396049 +6095117356077038857 +1149335053458624593 +932669187468772192 +5158126921440630419 +3492267568463487113 +1732546113203415635 +7045454411325772810 +6384455843948350385 +2542888031033974788 +1730289999177932260 +3229648972764832419 +2902806011500652975 +575630498357073704 +2786543335960945906 +1873619409044465657 +12629788734211449533 +9870725382303926 +16351995421707810661 +13605998671606326610 +16836181742493326060 +1839045967525129713 +1107456968074727324 +17535964194350263072 +6152225748794871245 +2624757556593188316 +13267441880705144169 +9257009393629660721 +3188724864577591382 +11191778574611074798 +4078298775038527628 +11866314868873576109 +13729170697355274482 +1095239150174745487 +3202253521892417648 +92209676 +3345964072790671842 +9786182059760242566 +5567604645729145655 +15345296219882462688 +343894602810274604 +16385074671182940805 +14665076496681157 +15561569756853593078 +1413046563134851460 +14472667508302299870 +9323661042597063803 +1783539956432988728 +1873618454646250576 +16262948613760826465 +155189878 +23407726853111960 +11269183585821354386 +32714319732548627 +3695785885653941202 +8597156797828894009 +16936874979922368939 +15292499504267605978 +11530680413558892428 +8814740290813637815 +15290243390242099942 +5831598081526006949 +15291935441369514631 +5208260076065795025 +4561910316531657847 +2949238 +17074939079306393030 +17724568187549983486 +10020499556556354603 +5246976952665904306 +14318336791420407278 +2146416174511252596 +2703776957432421842 +1414738713139895915 +15289679327344019860 +1304290564694297761 +2562857395266065315 +17998986783096720454 +1160107295621122785 +14055047205355868558 +14256452938553695464 +3865299053497297432 +3158171969379764633 +7604559487852233362 +339633722612 +13819040186127079 +2673382969485886910 +3425382256696108075 +849524367429478234 +5044274253921798841 +14304396158180354372 +5885543850455012056 +16887636506090869074 +18895516000586505 +5199085337156342962 +14784113342073683399 +18398400523337423492 +15177483003992485186 +1873618304174864617 +1734238297602478476 +9870724576472605 +18412827946584768572 +19177532402981420 +5490451758066192339 +9557289197010628421 +15787842211549829777 +14163281729483924096 +17731928685282142985 +4668335877129457030 +10276036049511469182 +9870725374374016 +4026740946294809810 +220421203678071202 +10532987966327967503 +6245583177832864804 +5661738460217416124 +15349405047219047841 +17230081976582607156 +4950735722959805923 +6153071806601629730 +1236559904448732956 +2485203881828828870 +2001615964625136286 +4021100601043535054 +13590665243542948895 +15292217474967426306 +4500349936894485056 +3760491293292908083 +17938415983754368947 +1873618441748426951 +688165077222762956 +9142602039418637296 +18164832428166506325 +1198918814675066668 +8961523727179728352 +1873618394456609337 +3866991147614627373 +6276398748627902105 +13107407246761728289 +3541851209304838436 +3652299357750451406 +8790845827308415702 +8097312532666336759 +9781090067067060696 +13058301027258689683 +17348630920863426771 +1626624519582196724 +9615343272732856790 +9355193091131312182 +4543926375081584412 +10587647911016210528 +16075141313797160 +5181987387955824736 +7666030179789458036 +11340219348171432008 +1915314009234745364 +3685001861620443368 +7160449488865146314 +6537053438712962891 +1873618532030177951 +520197201059 +16502466945095455164 +5153885686374994062 +10758418422029301358 +8990977686124377800 +266042267409980769 +2755423003356959784 +15290807375758770483 +2272905061487347697 +2625039594491745805 +8504730966200040415 +14604797433968681788 +2625321585099738769 +878291147406186748 +318140004013 +691195635489709998 +13979993521113622415 +15411170636081143435 +12604752454333128675 +5389310142310398976 +18156237098482275236 +6431807885368630309 +533070599 +4758736699762630534 +962327146969831739 +15291089392161148982 +15837567593198137370 +464309454125 +9870724568517151 +165610142 +12121015432604302215 +223556341551 +15921313018688258237 +11745203609402431042 +1256399000774261819 +17783605070231314205 +3345494224882646553 +2389164936029950177 +9870724631523028 +27896033019503972 +2541477931824074592 +903780211257061741 +3076135121411313050 +11407676948940601717 +15289397310940400620 +16484767890339211161 +17489156252860357474 +811271050 +21715714420389873 +8313915084226500515 +1894270061095050095 +1052394452359057604 +3242630737960326507 +1890885829869258037 +14735012445162910031 +9870724586892891 +23125848023046728 +10097099034423091868 +3397138837805755610 +16889333080374580560 +16871407059445830291 +14397928622703527225 +8096828770015335817 +2624757565191572901 +23407838631052015 +1892295963471920224 +1873618519132346826 +16254343951695232421 +9870725384794308 +6157301992454637201 +1456931819 +6024147224583891468 +9439886321921561135 +2071645033680477475 +5312856395495920228 +689908916968900610 +4197831482435135843 +8540705002678719058 +14000669212585107681 +7243867462131131339 +15041066182058449250 +9870725232554088 +10654852030096690437 +2442023618815074127 +6155327894831515348 +11889338562280302600 +9859438898534163240 +985919106030394244 +1873618463244630383 +451411665341 +7372527701866399316 +15287987211731736626 +8773225958283947345 +3698312210412676041 +8073943833384938901 +17383996669785420805 +6067323895618609089 +4449074111655327930 +15425352558107049479 +4657115645993180367 +7908445715160191069 +1347470986546727120 +3878455513181271920 +33560399035500221 +11549275701007551889 +20587511236070012 +16457343533087867844 +9870724668212570 +18155411078871986346 +6364097413323754682 +4498719805530002359 +8743729689797340208 +14298576506808115375 +8072726556923202784 +4447100014032205548 +8483828720842049762 +5439644 +935489304205208469 +13819048784516356 +15290243342952775342 +3004107483102454977 +6587399347873672465 +16434823465972931515 +12758839919644056463 +9870724623593126 +15292217539453526243 +13806855580317125108 +5386207979076523650 +1873618506234530930 +3477193987698089072 +4370739262394951450 +9480521367486343333 +8172237583342847713 +7028608203314241961 +5837238478365616286 +4770420554471650755 +14654464656146897946 +5780770817303013086 +3166854339657940894 +5566476498435058968 +17907997845737182741 +68420036 +12282996768745346543 +17988623715793909652 +7457755598791719199 +4453868373304235130 +9870724578962990 +12795225925853718661 +15294191606983308385 +4798202644785009511 +23125779237519489 +3648351102318288942 +622214679736831073 +5152193605164690285 +13131588232993385712 +18331560578523547 +11276479179859633949 +23789896 +3545799512027105927 +17351535160019928897 +5779476207078475458 +15126544789913026724 +14714880334493272959 +15956161762664732258 +8716401002755729500 +2946293117443911637 +12606726616442361423 +15876751444292411146 +11265167757449175898 +15721176019378787137 +1873618527738681292 +14933352661695020191 +2332012811279025897 +1730290029272521543 +17398030574076849608 +6443907667319932739 +8095744054172337892 +16879165037882907798 +9970931136116767918 +11653222680468930741 +3204066844433995030 +32432389312488142 +8992704749851528610 +2846721623123827657 +5727354427212124875 +2759017917421074388 +2774219784353502506 +18287350848540469013 +42140016 +15582002237814542420 +6949171313489679905 +3965243702909152732 +13336764187834149758 +9040588457434096963 +10709931946762527681 +5160101092148254207 +13960390059206392393 +2520588540573599852 +9870725135364173 +2625321593698126810 +15287987241823844032 +8119117470609398302 +806447488480990242 +9511403278412289853 +3478881230198940020 +1467988640301126518 +16004864765535467515 +3546645479552130676 +105120332 +11375119844675882506 +580191075 +7724719747828771518 +342928503145892901 +12162857194685686964 +18613585580549643 +15288833286734036101 +8271400217824533655 +472907842721 +17591280239370067925 +15289397375426499632 +5883005685634393287 +9386257314251803173 +7971624072491715420 +232154731446 +4704231087254034659 +5135521648828822608 +18895601982913587 +60490131 +16524840699079573539 +730895392316136245 +6770804041312785008 +4249311151961291946 +4472433831650740105 +9870724571033081 +3226817824012527405 +1172729686433280126 +5469235769064828310 +2046386157851205249 +5139623313921751564 +15289397319538794794 +7271679108734002174 +13675269681075400884 +7451468154385613573 +16089669977036706930 +19177618385299233 +883931544245786859 +1884960770262909264 +15287141205513283243 +12541871105690588014 +15859976 +13672685481887618268 +9870725368934508 +490930885 +4667648448662757276 +14806389545741082049 +21997713626773689 +11061539016898402903 +8718869789667627553 +16114301711380473644 +9870727009366316 +24535844054648278 +9870725109084206 +12535711295515927511 +9870724634013425 +104025408671195501 +813761433 +2624757573789960402 +3652299297563302803 +1873618527730733415 +11346153491073745819 +7270258020499876348 +3494805634406032420 +4660099718377449297 +6204347636139758051 +2625039590192322827 +14537758612514172140 +4075479165595563716 +14399488102094933851 +4026740929097588280 +1358668596158030136 +5727354358426570723 +1459422188 +30176206501460822 +509280991 +4790241261806370364 +9460680749727833832 +10167299845199168903 +4291298475084353849 +21997563155388075 +5811097509171711256 +12555509166525858993 +460010033079 +3545799533523309208 +13065116362012437519 +17940106095408864315 +15811084091959546063 +10492168756132066957 +1062265432630566737 +6511526238378276196 +9870724759973798 +4991771961662462655 +3547491537358892273 +15210380804700055032 +3920523035290508182 +1873618377259374736 +11630357923075867126 +16488501822810044449 +2698559761672719342 +30740239306197230 +6081185451114719324 +8127099841899143622 +9870724715343710 +15289397306640964299 +18613516795011392 +2292473882248155155 +4203104183319800430 +5557572763392946473 +17610742277697658943 +9870725880705226 +356830502012 +1038040928889160565 +2106705758428686300 +12555877004103073175 +16158858703724157669 +32432363516874567 +280569158667936046 +16894133945460791425 +10673121812476142572 +1262974493279214829 +7401639709844266549 +7930050 +3596229240768578521 +16457530956312373453 +16095291319491521057 +9870725101154317 +16366386920213004940 +17802959724583855030 +1947237997648309329 +9870724626083522 +11074977296540377151 +15291935501556190620 +1522648636578935620 +1252450745340874086 +14412651613346992442 +9563985093663794240 +17968836610236044229 +16926509157610829879 +17163902602736658866 +70910437 +1873618458945199979 +4149668843845129033 +2027401273281697304 +16425697477189527550 +6097847738826887428 +3793440948435043101 +15289115324632621949 +9377770767912554794 +5257222861259937344 +4127600472562026042 +13569277581708580681 +13252643833685291292 +6503203085685187081 +5501482065124007113 +15289397341034985216 +10185253761964851325 +27356042474431834 +10243536095984563530 +3757953149968475085 +17291996839861096697 +11225812687234998553 +2141783083 +3795514208959670288 +3545799464737791373 +7992947909422555563 +14465116522071263669 +15390728623807287893 +11722522519282148857 +14282027259104724924 +3137008822602523433 +7049927138092665399 +126912766471709886 +18374729960680745738 +28766176077090826 +31586271318581284 +10493014766646990044 +13819044485089805 +2905626171229488121 +18613456605374575 +1634139868571264676 +1662146149246717040 +13513914891881875478 +1873618308473835096 +13887512020184293315 +5461104782808583112 +6271266931893031114 +335336768790 +4609105965428400501 +17298949088090729675 +13889891833454681943 +6589949121119456916 +5880738582585887888 +15080950934196065728 +541394510512609926 +9654234581728128164 +32150304123324262 +288044958211 +8932433501023258756 +14636253952577251125 +20023581612124826 +1410790487802331975 +5565348523104797810 +12930286096412913431 +18331556279109847 +14777427271178987892 +240753120976 +10983291128409706617 +16706536795814433662 +2576363855830653936 +2785415300443552931 +20305598014508030 +1997667674800208255 +12611249885107142458 +12245079979070733901 +38835486525706879 +10781951560498493156 +363886829052257971 +7775491464613355850 +15051681314809401178 +9870725200834655 +10878955617237472428 +4449074094458095536 +12277052476333773761 +1076810110067498452 +16290600787564584600 +9064803316561045002 +9127491855471231561 +538051341 +62980530 +10733618018216265695 +794930435070568539 +8336200085500660803 +9870724573523453 +4675738890213732935 +2647655962581088966 +871847679528688637 +23971751059017701 +12045128095674879194 +331034862668 +3547456411520091199 +12174121939176137419 +16096830904992345994 +15189064920766156370 +15017601921531521420 +12579170400201283018 +3934614182098834147 +1873618536329128428 +16887636497492025705 +12986607299843201336 +15777957523720635747 +10676818914731366282 +6110845085391395318 +18275311419835757722 +2914356978958493975 +13671275447165062990 +2625321589398702921 +9138653839875453655 +10913080833258434939 +4989419314252950444 +8697674538880541381 +7513570824695918704 +7106783930712006960 +12451377428844719275 +7928975693336372776 +227855306718 +3690475717044084611 +3754850986734609216 +3401748230520916540 +4390855528645402054 +12037736283602183954 +16471678447353206515 +23407705356462221 +15447642462950922526 +14552996435662221397 +27356063970624739 +1873618385857753680 +8942580853430826631 +437376733844694284 +15287423239113680514 +1732546126100775915 +3819298692489613500 +13618775005140053180 +2093273903861080559 +15288269318414159299 +2103039519398900914 +5936157350063378180 +18181080380579994118 +1627738421784105850 +15287705255516064294 +11644189250161151139 +15290243360149560171 +16241555818165258294 +2624757569490540699 +1873618329970039425 +15308473002627656960 +9921844627374817074 +11858858524383526794 +4928375806344713785 +1202584997816653461 +11303599740469197363 +4280602885598750466 +1623790127660231601 +9870724565593572 +1024536057620025498 +14106274658388552763 +9870728841228605 +15288269262526435217 +15511108512795217 +162661010 +12799016813872633704 +6119791393893991584 +2605266760616185153 +13001682102565734253 +6968961260058973551 +4396106175101611329 +16827900250325788899 +16636332169133043916 +16874641764919941192 +15292217500762591180 +11484370901403580387 +2885985010410089116 +10634395723342110212 +1873618467543586372 +3207856338718387339 +1436145094782551981 +1438979322237953084 +6206756537831613738 +5305637558914854724 +3524535802145101479 +14443179094226111164 +3973491001937124159 +2521073773052973766 +9870726269006076 +13913275829828995031 +548471621 +2719063642933237396 +15291935454266872694 +15292781533567336204 +15287141235607870962 +16378103672764192013 +11601522788719083098 +10050941969593493997 +12640696470018459947 +15897859265386515143 +16944123511402940170 +15287517770571588928 +9232711897927854006 +10197025096723876659 +10913522755810505307 +9870725381845170 +17203834559493910505 +1518418377640978568 +8443432440786587812 +1873618317072224203 +13991391226545779846 +11897516709942660902 +10570916982235810181 +7993599274919922706 +16204231200463070258 +9230737800304730286 +18150567613437266806 +5293539447540681024 +11129919386604493830 +12303723863410364049 +17776290961586272799 +5303047099741907888 +12707409336090767303 +1225133547190634606 +14650572868612416867 +553316173655850414 +8551803522936424255 +1927715141858912662 +14383326641327005 +18045375457690271814 +91750922 +9870725077364708 +826733310063626131 +3849280189159130294 +3666742284239587587 +6544871850248130739 +5178673268998816919 +16402773879909923887 +16888390078961511617 +6803771475061512735 +12715891404812072657 +154731123 +10109799026223681498 +1873618407353966788 +11918547727788818651 +16384670846731506340 +2251871061326902042 +12393440069873436875 +943902441854284052 +16370548384624554320 +15289397336735559652 +2490479 +7874673760297049226 +8500500724458871742 +6454739775841057753 +18412263939573940270 +2158834191224746218 +24535861251435727 +9183139190223016887 +3813741237650930185 +12229886213732643435 +1477633638841602605 +5411521012994540776 +9870725893615825 +5460499872422693597 +15287705229720436740 +14273081993167839442 +12265264866355915840 +873242573393060484 +9870724576013849 +495995965980042480 +201762150893173740 +15515140772745448064 +12776333659030628852 +3808100918194020535 +2625321597997091447 +126072371936574949 +32432337723721245 +51823359828112625 +12831459332086123510 +20840752 +8011792219191519643 +6817260743125508044 +2152339567527807785 +18332501117187679803 +6581622301004158115 +15291935484358974782 +3489447322753895731 +17307420547699842859 +3760491293292435918 +2118540511074651839 +16165083394670794810 +236453697084 +7733570080055252852 +1873618441747963121 +2429880031183911287 +5783988546905721702 +2979056044617774398 +7410231591516644646 +691676978149667456 +8606154542470025070 +4449074137450482853 +12634045215106555842 +15511134302989410 +7754989484937652198 +1251040684822704108 +4856234466303485213 +514261733 +1009366474452586440 +3220426554520570467 +11483777213875048331 +4238330585822488807 +5153885733666370016 +5248105082762303857 +10913240739406877605 +14648423506775771515 +14977809576148535095 +7030864343134907008 +2413793875927437989 +15463390673086056969 +2624757578088920258 +15291089448048399038 +9763671964213721680 +4288796514507035635 +1873618338568416402 +15288833334022912531 +11879474329648119076 +6245381305531188381 +7881616335805887767 +10911548679683577651 +885059609857318934 +10912798812556641371 +1785514075551847799 +14161425405569670167 +15290807375758308420 +1991991098769624156 +1668925422262431409 +17517572610983095409 +2013910353068175571 +1470296917966148240 +4201690375267292928 +231161255217746331 +13366180180094504926 +15291935518752974339 +4820977561171741945 +6365225478934037607 +5353326642538957116 +16011761122456966078 +5354604855401923869 +15291089392160692966 +9870724568058057 +14758160535381894040 +9931059261557323315 +1873618476141980491 +3757107096460665634 +464308999885 +5460499803637156023 +18413674004391067740 +1041707210909636695 +2704904949958969710 +11924523768689397574 +5234408266889179927 +6161599542427675845 +18895399922782185 +6101795994259823709 +21433698017556282 +15289115294537556737 +4288478302459732999 +12910822 +12967490521444920739 +3650607186251240190 +15582192398883048810 +9949811476134836642 +7765640443113515822 +3371253340359830344 +13802657059030850790 +16266809608381863834 +6667929691318674565 +936085261797255391 +6275924038228912173 +9180319043391533433 +337192052980782960 +9098220215894287581 +584908711048724520 +3823465125967637184 +2902241931406105635 +1635660363048900068 +2624475548788746597 +2730693653255575055 +6098975770044401989 +31586288515357700 +357157953867897341 +3491985504771331703 +5418869474106625700 +12818223021127910476 +15630445320883366940 +4288400957833291069 +5778348205955099417 +2312694796415231493 +34124418943225968 +6206603741566403719 +4802215744658945681 +14457971324883194284 +4662355823804103576 +1200046888883724936 +4350138122305695045 +4394978100893727437 +9250793996456843307 +5150783505945139790 +304499091899573074 +1139622044438577442 +18323280586216593774 +643025413929642962 +12391274328196594910 +4429679826488351093 +443731401105565767 +4236074403011431549 +12918036676014396596 +14448472746991231758 +4692548874065225798 +1844100778258208829 +9870724604784253 +11200245933297193525 +15287987211731279538 +5576782918935071602 +4952762403310491866 +13820243756826975701 +9870727087747375 +7095086046245380903 +16733712327762925425 +830963573300551238 +3213959497729526792 +6101795981362009123 +13307516880336134189 +16117885714855306931 +15293063567167730092 +17892452776038969497 +10820393376177875747 +13516735047310051359 +8872175822845121427 +2108679847452959435 +5516046735301624921 +3955329463884854504 +3595101149371388460 +1787206130976971654 +14268351123313725246 +17269675928743781668 +9256796864594468547 +9777797301382894036 +18332373195682893944 +16210341989777807141 +13819048784047716 +11839726870382000212 +1041707142124084064 +12890040283581524523 +17320415323264333885 +7931231880446357622 +4980885 +15290243342952321281 +5193163009894978630 +5994450090729739072 +6209987959894396129 +956466122809087394 +7109030579205004513 +13780637506563355426 +1170460877184841904 +14835085497997415609 +16204632762007445559 +13551547664790864591 +2625321606595479619 +15290525359354697878 +15515478115210906066 +9049144019411420413 +28766124488331386 +4393850091170719069 +14533751210231554677 +14119835462094176533 +9009653541058733249 +9870724578482244 +2150364365457593124 +12216316833227881467 +849524320139697825 +1836789840603854705 +292343928523 +13130418682781980469 +15755267922579101895 +2623347749725475967 +5300226918518892152 +283181761 +23125779237067511 +9352943157693277988 +1379700696478258660 +8250235334236778690 +18331367116777634 +8070938101082033295 +18006947710298361263 +5514616536229109754 +6614769327816394904 +245052085439 +10877349019110291035 +4500349945492416487 +3204395739605580947 +7351694380232217372 +1146796953124884254 +16058886109004178344 +1720270736420390024 +2839977016791871282 +5780604324278321632 +17066003767899601601 +4448824863274454235 +2544580120851397738 +3383183348476563109 +3561916909976034314 +2789363542978673935 +8412057600244518110 +15292781563661917735 +30740265101365265 +10756726280622189913 +821232589 +1306875073128720055 +12737830804880320658 +16854801861929756683 +12889947526522226617 +6262391790557143717 +18411981918872141859 +6156455943245810660 +12653665714742307037 +3410549374345308442 +3595101205251172623 +10131837242266048152 +13079931275337543417 +14354165962701300381 +12238878728738070039 +17015590480626129639 +17015954193730843853 +1030751454793177821 +15076033560720000213 +1873618347166819098 +17219576355390295334 +11341778347310789591 +516752111 +13265283525419231841 +13456106549468220755 +11528015352773764471 +147824411169267534 +9870725134905418 +15287141162522916514 +15288269279723206907 +2625321593697668091 +2227629720329532731 +6799093328678498333 +3716898846037788773 +326737923180 +7244228363853454619 +1453730913755878161 +3657089592748763459 +15462816074920251683 +9743002503222923132 +5429433323061448040 +279446115902 +931541143352522499 +12236377454035276240 +1873618484740361925 +810414605541860898 +2962388616195618451 +5596696239185879665 +18276979675029780008 +2787671405870197607 +9870724722814845 +1629148516695826412 +15292499534361732750 +11210176612293365328 +1846993591153811325 +828143426469055489 +15229113601177430 +10501085353026661113 +60031373 +17087641464965774984 +3260260216671258159 +15703528257170515798 +2339592797069066820 +9512531339724398580 +1873618390156727778 +9870724570547380 +17462940074544293745 +6050238139720474636 +1842148199544864879 +3542979322205257257 +7115729702434597997 +844100032176793609 +13361048879788721990 +12118718711565468631 +24253827651809218 +8263358500300267068 +16268501620815837637 +15401217 +9807927549284017791 +4074350528204312506 +2015194087480770921 +9870725108625449 +18895546094732024 +4025048779092094155 +10907429537674630809 +418283403591039584 +6481871188466881769 +9551365454677034039 +9870724633545964 +12583654612056476062 +12066601831253031042 +2676879684690720843 +15505670362358572090 +2146416148717642738 +1873618527730276800 +15293909612076684877 +12753199588762473988 +2566692452070005268 +18030688619934930972 +29612199490631813 +6711292992039634005 +94010468400058220 +10363686875760646962 +1285019398775400416 +7534510998261995431 +7884037138607205497 +7604973056686579991 +18413391983689269329 +1857012904269592910 +15892618421880446271 +15291935514453554520 +7443582215714384949 +6832820917208182005 +16860569648395794788 +10142017398611986535 +3874225267140666071 +2713838510145036704 +8328636978065706496 +1410790466305675376 +11040670310895327997 +1251886695340122879 +9194029999668617739 +12315494074414993976 +5407707525201267705 +12769025564667568159 +14743369764108311252 +4265757568819538500 +10482669878882282746 +16323412087919634108 +12596551949017945923 +3649432975682855767 +1785514015364695262 +230324577526290598 +18000874969471339896 +3596229197778216602 +1522366602980579026 +11215879281815658422 +3229084970052969893 +1996539656478354006 +15291935458565828219 +2573543657410401974 +14473057767918617247 +1735084269427254348 +8510946303187306956 +16364556117061994922 +5884848086070736081 +1034135587140102020 +12313853487258886566 +1730290050768259966 +15339421027537585423 +5755891984757703851 +5697191325465977256 +17998986800293032644 +15239330738555612198 +6209647271312057995 +3189961199463959445 +5780604289886808630 +12020684574736647824 +1043963264747980253 +17480458144566689960 +2031300485804614045 +17372488103738221585 +15289961360942698714 +356830038877 +15291089478142986477 +6671860954713623381 +1420793819473864747 +13439364300622488027 +7196300228934454251 +17365146581181274181 +1873618321371176999 +11823326492945633272 +14165591608719862425 +10705712940655520125 +1575334470747047040 +2676033351739311464 +1148207005044205828 +1873618514832459339 +15043322265989680207 +7471291 +2528765198457901441 +15689807388408882804 +3967850630891453056 +9465847771170233791 +12427562674559266926 +11250317239755750068 +9870724625624765 +1195699440532197595 +15291935501555752465 +3648351110916222110 +13174048501630253854 +805372789 +3599049361803986870 +10264533437829364093 +1465168484873296699 +16041596230061991721 +6741138607599781046 +15292217492163733083 +15425072628957795013 +5969680712418618418 +18613559784442970 +16968560335088392462 +1873618458944740035 +70451678 +545522479 +9870724580994619 +9870725056065488 +9416912527474635223 +5560110984102091556 +125502680160414747 +17291573824845253535 +326731560776918837 +13734567323423563056 +7534510929476464160 +12452346079747133917 +16205893170720092489 +8320301918971440674 +9870725378896024 +16936615732340921712 +1589600004498925184 +15170248953810727866 +4224385031974368112 +2120981035582510401 +1359796670366683459 +1092418947456326325 +13689507212922795267 +14514761581726423837 +10441012557536775648 +8995550684990096741 +9308649427282178061 +9198943685302375943 +15395425049273775028 +17088031212435737557 +196412070 +15290807392955096833 +16254596003192774186 +14585410861575638263 +4354547228831848425 +8143564249694210398 +15226013478377757025 +2625321602296056238 +14546784569801180959 +519242494 +13979993538309929729 +9870725872316616 +9828234889745165775 +8892116297265260054 +17727106386763719951 +15291089409357466438 +6435401071020820051 +9388513436875233264 +15288833295331961304 +5901227768804952704 +15594797272826129469 +8986737118723729724 +15344331988932127716 +16606886541766453255 +240752662171 +50011031689890353 +1873618446046923526 +1731982131987765207 +8579829306004739666 +15291371425759833565 +6219166245997316001 +10608900034458831577 +5197957314536286311 +12367205880884508991 +17150669604793427931 +10280861171697594184 +3490605528813558768 +3124549171711140342 +20305598014042854 +18114450845263009681 +17633417532840154710 +16142517586844805725 +9183703291814092366 +8050488632800389513 +6154199872212707729 +15287141214111210691 +62521771 +6045857694838104464 +17266458675449843019 +3527355901684309732 +6170749808377010991 +13493869764049451167 +5249797112394286460 +14426789124208023341 +17790217346286900678 +17259210455121607593 +2428928023963905710 +11902668864698077340 +1873618536328669425 +30740204914217384 +17891616 +1414738695944689454 +492962512 +1901711630905658822 +5557963973649048892 +5141736951422061236 +17722312056329288766 +3233382516488212685 +4660099726975376230 +9870725111115835 +5623170421104781702 +5250413516934022944 +9870724636045062 +1814401611928395235 +6815608494671606777 +4248315653704067744 +3649479129237645457 +23971695170825999 +4656105560522559008 +16651030728834099149 +16280490219212711750 +3721666691459005659 +7916614371163648133 +607704266917636669 +18091454078718788397 +17764324346977457680 +18066747657552598667 +17028024531363257484 +2003465202451175590 +2521421795860691087 +1028746712054062011 +16558373245361412571 +7794629221248616041 +18159641260425093028 +11618186867803496188 +11851052968763482064 +1518982380353179532 +2332012841373164359 +1829144644315722476 +15194513144169588646 +9430716657581709552 +2482728865584793889 +933797197190869266 +5249939254983662892 +15287141248505241747 +7766516328432875633 +3067755498838059658 +5356297009705911966 +7260902865540482639 +2865782792753257804 +1919773413537178009 +13186249660293075254 +1309213649 +209763203034666527 +15287423239113224111 +14262516069762076621 +5299098848608717979 +15882855708138491725 +364900535284163748 +99222062 +11914033402398451069 +15292499474174584993 +17422075041605315709 +365428428073 +5728764444739437994 +6100103891543657570 +16872667624306444468 +5195419141117269072 +15287705255515594738 +3895628550832213223 +8531576047557365577 +15290243360149104934 +4705356441438608086 +1004761907965660269 +4625631396377398109 +1962768234876574667 +3544107379218385465 +14666376624573866146 +15292781490576957982 +13842430224671731130 +2819377816053305330 +6364097374632348674 +15146757117633973580 +227222435788643390 +9230173750303995215 +15751385425378304728 +5782296448490211725 +1197790779157207045 +9870724565134813 +1483455222068827100 +16077787910842633806 +8100339093104306206 +15901935982287480472 +5778348154366333973 +15288551278928349523 +11404871128947513371 +3599049370402363989 +24535736575220934 +5739422628533510916 +7737418730439134094 +14101026495484464 +8423108281783224429 +9870725103185948 +102051298152290183 +4272690292883939310 +6770804071406897080 +10654574963171861593 +374705279866848936 +2427153079854184448 +12588077379430726218 +1214318679823704442 +15207278607074208893 +14383042897864794 +17907754113323114552 +7732551331406174585 +15290807457441191032 +932669187467852567 +6154199846417076272 +14749580058850363919 +9307618050854764652 +4079990856258379432 +6362646410737881577 +14289069640796750547 +6103488109871634562 +28311895 +9870725381386414 +1282417308718355491 +1107456968073808590 +7600563027796235794 +2528483177756102046 +15287705242617784616 +2036204584 +1042835289417734168 +15185362616787929146 +6155045917121646320 +2625133190165048304 +17843343589039286805 +2625321610894444316 +15905575958860163153 +1475433656209913935 +10259573046193883986 +6605958307242404521 +4406517502034142934 +32432350621101320 +9870724601835123 +5124793967716024385 +1411918493225472700 +12074883489796928402 +5704633239907941147 +296642875789 +4448228079643277282 +15895752186576710089 +9870728142549306 +14964333713099010533 +2899608710510425350 +14971589317369871396 +16390551576946830571 +1091290856049945267 +1873618454645323416 +8428258315504212071 +15420842314132107660 +46662016 +16881177089168133756 +18158736581776007621 +153954628474769262 +154272366 +21433723812718463 +3863606976577548852 +9444897415120643213 +14031704005807711430 +6153353835900916790 +1682680391473908341 +14127627808187625634 +14485322628916323598 +16881139139804531782 +6280436218988869809 +1735930378822312717 +1342693798425551586 +15291935441368598759 +17107415631816447576 +17873245265531054477 +17316681810146381186 +5886573631838894397 +4047541379259827663 +4127600412374411889 +18103065826041149047 +7231170880984723151 +19177433524431577 +14256452938552777787 +5695777959819621519 +7862633061277246567 +23407864425745813 +486609399340735633 +2623629473785991939 +1873618544927055170 +17102621331475340503 +1128796743701314805 +1737254254678712139 +6209141871995064092 +3542979283514310652 +28484099487120574 +3505218283257337842 +9870724575555091 +15290807388655664381 +6803857177638881504 +4844422007895957969 +9557289197009705969 +879419277503368073 +4947378311988384625 +23971703769224650 +13712725023991359562 +9870725373456505 +13536993689470216 +17798486060942889364 +21715589743716984 +1413046597527942087 +1873953797573405553 +1488104377960386490 +16851023771309716984 +477206348880 +15167982246001252891 +17305802226190387588 +818283447 +32714354125662800 +1519546451849645365 +16997404948730493949 +16913056664662974311 +14838695640554105491 +98949079030710665 +3493395560989609301 +9650192177761497964 +9870725068976088 +1873618394455682936 +4449074137450033989 +5567604576942690958 +10347603113635964208 +6783113508174519702 +1521238576060318425 +7169714894971755427 +13516153353155596672 +12213795120255866805 +1150181119864095759 +1043963281944757631 +18325107233592061809 +5092441503082623414 +12749251354825264418 +4728860507982873988 +5141454930720264898 +13035898745205497193 +8843457619279611284 +15448636417986470923 +17007720368052373541 +1744698334901447622 +5778348218852443426 +1873618338567958978 +12504319158161657053 +1187387976542013547 +7942407828307653094 +4394978113791079806 +13065916646165141201 +19177566796071756 +3918119506796961183 +576783198 +10982145711434977640 +8790820602769260966 +8617040449022808358 +4765907252720068510 +9870725087326208 +1890603796270430944 +12376411630365916427 +18413109997380239438 +4129856577989466228 +9960543895307946415 +3541851230808062832 +4664047960912106672 +17639914886230270823 +23407795640220207 +6152225714402428442 +9870724567599405 +1873618476141513316 +1873618235388411749 +8308324011471822873 +6601865479546625309 +17417304627475125072 +89044515688180728 +6146715875973553547 +11573068603183157267 +21433698017098422 +4844421939110430924 +12452064 +9937836885805322972 +6101795994259359091 +31022281504523376 +7367210174299052536 +12540363055741621690 +17201605122451315008 +10066048840209604606 +1918961553063374270 +15287141244205803304 +9870724630605517 +15292781542165260209 +1574488477427647738 +5972106230260057855 +22843831619775168 +17392852282941837035 +17173040774849716177 +810353539 +17489156252859434801 +5196265237615758532 +8873532243886226841 +2671231282868729791 +12283202476531003470 +1466296516090801622 +2009934836734323017 +9870724845825981 +8600881962343274532 +6104586261132347910 +9034197851562593292 +11868006984486178068 +15995643366203073721 +1493907215600323645 +6366868653954509047 +17639717819159158490 +28202057289109561 +9870724585965408 +1483280048225079931 +5150501489542317718 +193555791363510716 +1254142856654496235 +10735236183146699482 +1873618325670142602 +2676033356038276482 +14612094360531587395 +10409585135452886981 +448065834402398052 +16993169885654359796 +6736241924278269790 +5996988234054981602 +5511701056162108759 +176197993773080705 +28766137385704792 +10705679793835561232 +9956242218935388443 +8734462910471684823 +14123679552755478586 +14739094180206437578 +1385729377881506048 +3398151189897439493 +8486888319115725460 +882619826975684580 +10116412599675871569 +15287705195328463537 +10615775302346349247 +5357143020223335935 +2796988996371826886 +5516046791188875281 +9227353569080969220 +1571386327091602237 +11878630053446878902 +7738023546023203091 +12137706698326297019 +15291371442956618261 +16912274529230089085 +15287987211730837050 +6155298040667702671 +2117937786109644900 +12613788006936942152 +12479536636615268510 +18285234040061436339 +6101795981361546864 +4548309565419816229 +17224768959671249219 +8506141078308071027 +2789363555876016194 +20587558526988019 +15293063567167270822 +9901350255127968950 +8869315475540089599 +15601231532638020371 +9870724667305801 +10906015674175274153 +7242735986167124166 +17942850211038499703 +2592168024777625260 +1147642989434984732 +15275860588097263988 +5780604281287953628 +10799878859156117809 +18185058707353440847 +1096931252889541798 +4522126 +16881094854354026910 +5354604932785383662 +16910582448009322892 +1873618360064163137 +2095607110066201696 +9251651008894625759 +16434823465972025159 +14683276054533401888 +2012415014 +112132697 +17782439637510195701 +6309545861193425113 +4660099744172172940 +16266809539595875753 +10563650164269851582 +17945290522297711569 +15288269292620561432 +4827315034957622843 +15287141175420265615 +10186509987843024138 +1432917014569307922 +17963415050392116076 +2300274332096880292 +2625321606595021110 +339635275824 +67502526 +13683081452873059984 +5513358431825443941 +4393850091170251099 +3707962172286588051 +496747170645216905 +17887683492421316547 +6545717972540526367 +9870724578045480 +15294191606982389904 +282723005 +1873618497637731283 +19459484316609314 +17284393169295326249 +245051624454 +4076606711014905811 +9059485294012421740 +5812638426488517077 +8634458757350122665 +933797214387660832 +2500897686785896635 +820773835 +10798321677871955718 +4130498619197493864 +2332012811278108934 +1571386258306059227 +17165264165777327483 +12939897194050561837 +4075478537926879432 +3595101205250720514 +1730290029271606903 +7218296651337585217 +30458192810827319 +5483309297806944717 +1518418407735101149 +3467191736134808349 +8499936657260896794 +1841866165946508932 +2330723363904167616 +17461260871863973841 +3075513064251206239 +2830394698076532282 +5356296971014964874 +3865299040601059897 +4992097215411792708 +13538679271994109073 +16499980877748906190 +7731877951544692100 +15291935527350915502 +17211249521736489219 +15292217517958891614 +8926782149551273862 +340775890163879375 +175197369956053726 +2713566483735401736 +279445644762 +12872274373742581845 +104202820 +7870725526360642767 +6922789961772913157 +8617826180017097033 +5022488231488072212 +948956379585133126 +12162857194684744950 +1894834033712967994 +472906933500 +1873618243986809042 +2866847675659794085 +7786083262071970524 +2152216378621958621 +5499923848323419499 +9870726147567862 +17302333254829498805 +17160956064228992920 +2704904958556916952 +6866966013877767950 +3444172667634536719 +5831598111619679502 +9870724570088730 +1996547934651620728 +5619444426388998007 +18049103865480689365 +27638058877133663 +3960279058364840088 +6423213095607550453 +17205017676797985931 +2678571791705392053 +6471725260171583443 +4162099616697747321 +1784668047839225680 +10905173350565414454 +14942458 +12663073881015725580 +490013379 +10756162204825833956 +10891020485448656283 +29048192479791616 +15755410569558969081 +9870724633095911 +9870725108166695 +6701567415484704364 +16357407289469259895 +1873618334268546023 +17752598067470343646 +2077762687573579834 +5112676103982638399 +11423179128525170763 +18412827976678441027 +1873618527729821810 +21433603435945592 +4534407021717882867 +129168850404183603 +6920839824714457238 +14757391685456714800 +9870726381138191 +5164964866752210875 +1679296233332627604 +6743921257827754531 +641508468596171375 +313839652959 +10753772974326627344 +15137686833485521916 +14749920010802767655 +5793852920991190587 +10547011333208945795 +3350797794817423077 +29894215892535509 +12120648229132178678 +4500349966988160249 +1780164054970804655 +17997001614766327924 +11895826673961089771 +15077014993470370010 +1256117005865921935 +14101030794450612 +15289115337529506798 +2244972557975622307 +1873618231088996176 +16628114650533936491 +6338204500074574826 +12962277524057237535 +14108728388800811776 +15233850904715864962 +7121343957112084506 +10479356147162766833 +18282355233941116537 +9870724759056291 +2500897708282103047 +4023356689274971824 +14383047196826173 +1735084269426796795 +1731418047593010158 +15289397353931868100 +9870726399488273 +7529985804650425834 +2652027345649414662 +1996555300 +1386146084913756819 +4069792389134698912 +16722630854123269144 +5502087143255978262 +356829579491 +8110899722842366159 +11340219378265100676 +11734883727065373087 +634323816 +6366071489451014813 +2676033351738852867 +8477811091809972767 +17939521506051046879 +1730289994880072715 +88972231336291406 +7012532 +348233686821 +15689510638968577934 +5822633321650206772 +10542598463376395267 +15292217539455104601 +9870724625166006 +6182033422578292314 +1427238547443354327 +8059269114602802906 +5779476262967791419 +512640236460459804 +7423139541412485117 +1734238258910612322 +10455832258799276723 +3121445287022504974 +1873618458944290013 +7604869297748139242 +1873624795909219445 +7892758634479565209 +9870724580535863 +6783807687633543602 +4025048856475561368 +2635993685957436722 +17345653805760010979 +18432990119880125797 +15547566717537239448 +15292781572259861017 +9127481006616878052 +13772803293243918272 +5931938921483158011 +438515402871 +4162099638193961620 +7383225640786800619 +5368306521945876409 +14259131864331458169 +1252732753146441175 +15690170833083709863 +276294892620233575 +13832769566562850441 +2414366301109641575 +28166486445668420 +11896816609923521901 +4438070835459857971 +2426839005745274412 +17279977953043892848 +17427577199299288321 +17587804086788043435 +15293064057263975761 +5703451428017740137 +1192315299587689576 +10906583505664282522 +1873618355764744359 +10513134777875774093 +15291089465244719904 +12512222345295376679 +6105318176154923697 +5942369916282024543 +13513229138993242774 +8373123327081851001 +195953314 +5516892801706297876 +15918579575086785368 +10554335258691243263 +15190206321329443958 +13711674224866900411 +2206727487867668963 +1575616521542970880 +12612941966326959190 +1873619043622132894 +15793124915495536 +4093218321690206354 +335335861880 +9387385366966312067 +953645941585617590 +288044042610 +13891052450257444657 +681145240220937434 +23407812837003769 +525512494730316455 +15859526965022960852 +1873618493338301729 +1410790487801423820 +14414570535694917418 +15906307047154976446 +527217468724489237 +11277590796338143147 +9162938373898912429 +6526103308831312599 +6877309693745106245 +15957289802481419263 +2625039555799888265 +9935434997637529585 +15289115311733877735 +9549673313269924834 +12459352830895723071 +279448144734 +9752004170917101977 +15289397375428069113 +7636173669067014721 +3861350853953196309 +1675756474409617568 +15323239296461459914 +9870724724846473 +17825639178001198686 +62063012 +15442713712222881471 +10472837179882544680 +16077174101468076236 +3967850708274914243 +15530835708042438707 +17236419517966919334 +3045536938113982084 +4267231879396670253 +1167613856981472318 +828707433481447597 +7597900317762402452 +6583596437319793668 +28203003463868024 +7893354151480669862 +1873618536328208113 +15292781503474321085 +9096726350102080036 +6043037543708439708 +8477529075406365036 +7119982512147816703 +1331604907921590227 +2582636126191179767 +4772239926547921670 +13526334602625312613 +828707532359092052 +9735523322323810044 +7675960042656580341 +9122061663617825917 +1414738640056507063 +1873618239687380110 +3261565670785291128 +4815044179179166711 +7565159886615633904 +4466721302205190391 +1731136039789023252 +5458882111834645554 +3816192232417276948 +17950407476166543913 +2219158222027765611 +14383055795219269 +13965621822399458330 +17976521840277872042 +15282346883676331756 +9576401684948997166 +1731418056191405446 +549245961927609045 +21997756618246082 +5516046752497929091 +1786924157565290882 +2850284722128893539 +10292014237577275536 +3205194871352864643 +1410790419015877734 +6364097430519615395 +11653222710562606966 +5569296739846327213 +15007091455370804532 +15292499474174122003 +8248084085548261361 +18412545955976642616 +16358402449810348030 +10768028940573946350 +3560777292679876578 +1776768877711937366 +1096085143494024583 +15289397306642555686 +11757671242301185044 +9870724716916585 +23689713162021436 +1574488425838897932 +15912051102934196329 +15287141192617056950 +6638509038243234319 +4928375806343780651 +7462549834646555859 +15287423183225049371 +161743496 +6340598769837609238 +13070104360983484302 +13819010092640444 +514614295390133452 +309540242450 +11192165972973010296 +7621113189335640386 +5245848951541609694 +5973993525963087004 +8628857986924945574 +9835909453397775032 +5412367062201998242 +11366435697098971589 +1184054382509714466 +15292217500761662537 +9444197008647264765 +1873618467542665344 +9299709572676858016 +441768309247514881 +6044741531890490510 +15012525532018795699 +14101026495022553 +8512937848331648235 +16231093522553775642 +9870726527938837 +8527618206112500435 +5513358393134489449 +5782296392602050661 +10300063737849735861 +15289397349632447097 +3738193552459371013 +9789319859965203178 +8111239755973018125 +3666803035281117772 +16436648502584616490 +15287141235606954628 +16625537648487652507 +11271522833692251562 +14125349615763202962 +1839046014815569788 +17200676712322449607 +17228018386814134237 +352530163635 +1873618364363122013 +13229900389757361517 +15210662782411826554 +8023447631643685789 +5758903550139959418 +15292781524970525069 +8881140784455961016 +4938567614984505076 +1873618489046812316 +1361488803175295244 +19177592591247271 +7973911364104509083 +8245891699519397093 +17089062570396235343 +1359796623076912462 +9104223071126964253 +15620129942127985944 +6369792075214641431 +6045168024915106157 +7172128103264900945 +15291089417955403357 +5829672628140658014 +10758418391935812957 +1873618501936687513 +1257527023393729964 +1894834050909759480 +12445153428583697021 +12683324163066653818 +11005714949943155957 +17516205877386678717 +18062328983712842184 +11246066946089429986 +2625039564398275847 +3069894919890218302 +16880857149196101355 +10452155269284434414 +1996539686572482729 +14427726834025504289 +7288365174792655271 +8907187969453992414 +10000701524266327068 +18308363830277509036 +15289397336734637111 +6208295874376239521 +15291935441368140710 +5512593570613178452 +15043322351971537943 +2835783133221828109 +4076606659426144591 +5299098870104469627 +1786924131769672813 +4494226498722155250 +18067105964243173486 +6100103913039400051 +15503800498811395377 +5949516568421537701 +3311802689905840903 +2730975669658279006 +17869638717220195611 +16005710797548184618 +1242408041073358506 +6485812764085798224 +8220099555939787388 +665679838131154060 +6893126722435428104 +8857706336766199103 +2789363491389444482 +4548898661544120392 +13959261993595976284 +5460499872421779233 +4757044588448397548 +9870724575096333 +2385405425685111764 +4165201771332768874 +18068572667551627706 +15287141166821431145 +17624945991548479343 +3495087668004278367 +8930986358196738948 +19923244 +9870725372997749 +5347531447742449801 +3707523343842937215 +7119681547335584872 +1413046597527498049 +283744612529 +4299887168068263196 +7243415019521383802 +10831360821402142464 +7245449768395890779 +5622264654903379074 +13337610262836753327 +692605781988811222 +4288478865640481465 +4200651629265236963 +7345281306589680633 +1873618248285774014 +32714354125181901 +9059667538013273230 +13036681964663220025 +8048953681352871136 +16338691374403566180 +817824692 +10053520477123791119 +5356475488652379254 +15288269228133993402 +2011891000885325735 +1803886434263249310 +10875382395507522692 +11662991811784166915 +15289397371128645360 +23125762041843766 +8095744092864392552 +1519264379559099930 +1413046541639771273 +5457961656012850698 +3575237076868881145 +10803094198805282010 +434977997061097911 +4223816177647290930 +9250292664872488924 +5882159700913704062 +2150364447140036133 +1039169063285311805 +492467341594991083 +2145831495932714717 +17090754651615726815 +4264363504802678150 +9700294587232641503 +1873618338567515442 +10531295876509927029 +4246373952440904803 +6154199812025105981 +9339868219275806468 +15979030520758685179 +751021333891195339 +10364366638615371780 +5888796285615485922 +267514312376397666 +14271233691723439609 +20869691006257762 +10264533455025675069 +3878613918675455567 +13941464732324734279 +5332949825900713340 +9870724567166450 +1873618476141073560 +14525678258175628465 +14101035093409092 +16487685181058078162 +17729573360749535039 +16545031380502993408 +15836739578038609847 +5523113384826251349 +14383051495782180 +12278677980014653763 +11993306 +880547325917675541 +6101795994258902608 +4661227809782440384 +5953855926417306969 +10044392307478320657 +6264336012520278639 +11655151765046185521 +15287141244205344307 +934361247193191553 +1783539922040089741 +4224385049170689833 +809894783 +987047180239390428 +4181978392249379579 +4074350566896854605 +828143409273851280 +1466296516090349029 +4397798325108237843 +1318416043355496603 +361128541263 +12275360279037230636 +14597841535548131734 +4030203865610717075 +4753256839399350895 +14666204015190040997 +11757180014592266021 +15289397302343124442 +16365628939579235610 +11061538999702738154 +5461104800004441485 +7166251869025477885 +6244455129419230437 +1890885821271989453 +15287423178925612031 +4394978100892810032 +13887458236232782479 +878573172406827554 +11762200424231032169 +12339597735124753889 +9730290459103942171 +15291089426553790442 +15855427852318036744 +4502606072414800438 +8059210156514225493 +15292499560156450698 +4396379171791445210 +21433538949368342 +9870725078937576 +1935660024149519888 +15327751541709233666 +15290243446130941828 +15287987211730368986 +8974011632178973448 +42353829286659275 +828425442871765185 +6763975686177957867 +5885976121588474042 +17088989650730820264 +4171825741561930621 +1255834924976988183 +27638084672297941 +30176189305784773 +9870724819087277 +1992020024008656341 +781570828132957190 +16262181890814466028 +7241607916258201594 +12974919760130954276 +2021332458341357553 +12654580528992553525 +8716320640120809304 +32714319733657145 +18219329924430580857 +4648156742090301680 +9870725141917783 +14812868408551497992 +9079834640048803925 +30458205708158447 +11991029848286050610 +9870724666838335 +5515050513045741376 +2851390787921730061 +10329316755526125416 +28202091682681218 +17996069787993648978 +4397798312210409148 +4063367 +5405598733024583451 +6151097674585612686 +704478739862012257 +20023641797902187 +2135718191783165058 +11546436691264627414 +17782439637509742562 +9113587964964446070 +7729864379741507194 +504901560953345401 +15515478115209971466 +4081118913271062263 +10397817666856033581 +2602164597383905208 +8506716074343490975 +8472318192705806414 +21997636241468709 +11548493110908749415 +9870727795470646 +292343012032 +18249294802471234012 +9870724577579954 +1873618476151479861 +9039378544126094143 +1873618497637255436 +13710641769366774414 +9888744810737385716 +14045958232268935309 +5505241339298524122 +16750363711397049016 +2625039560098851519 +4265917729098520089 +10159956468397444373 +9870725375488136 +1839892025333008884 +12966362425739928092 +9232147921011155150 +1998795796298538451 +14258849839330247035 +17620986807279234669 +15291935484360539314 +5865888413836448627 +820315079 +15289679370335052228 +12751507451654317330 +6130765796047197240 +15292781563660995825 +15287141265701558723 +3383183348475644360 +13665911791399744976 +15706321287750627491 +18248359852417696811 +1521238584658245866 +10687434986105096690 +7830100036718497456 +130051739381687778 +14949273699027977966 +14112137841937105034 +10082791751386933760 +12217235256243064050 +1519546404559861700 +3910652358015406988 +15292499491370895395 +9966383549812714103 +821147663836514852 +15290243377345399572 +11628874970248588518 +1093547056057293185 +3055188874828713383 +1873618347165898665 +515834601 +6017370950709948408 +12914077461652131129 +8386072762472213340 +21715680027494848 +12708738613967086373 +12163099675411496029 +8912304241117899390 +18165099326217401267 +7948836900347123394 +8036359402298161331 +255984301 +9870724658917146 +12623964559030440353 +31586254122912349 +3157274608668863831 +2707725182771857350 +285938480839135528 +17396808035473440340 +6364298420593714638 +32432333423379563 +16636332186328897581 +592969305695866322 +103744061 +13943016536889833720 +9467143020924185078 +107711973369991239 +6591652942651792303 +18613585579164348 +14101043691809816 +5399451562199289543 +1812372989648457680 +16879434455218349224 +1873618243986342605 +14286531454481942508 +571465146145520949 +9955919551289760675 +16271603835638319461 +5567604619934639012 +3137288237381257087 +837357024961582602 +12189960762281954023 +5565348505909153272 +15152142838163182765 +9870724569630759 +15289397366829229832 +18331539083432923 +14337715982133304601 +18172534385631584827 +27638058876667848 +9186686562677713618 +6098975825933706819 +14418466534433295118 +9155601053723083239 +3117425657839703971 +10904894610203874944 +6520857582409179886 +11683463230882604145 +16807470394773411867 +9870724632637156 +9870725107707940 +4288478255169494791 +10503529180571328725 +2574671731619883054 +17577217573156428583 +15292781494875470697 +14795036413642351727 +29330208881715920 +15287141196916014557 +16383116559020531567 +15288269314116313154 +9511403312804932576 +4502324064610836388 +1873619069417298557 +4819849461168551664 +9870724588007013 +9642820876323793960 +12454038173864774012 +1393181894523115889 +9483351736751297435 +14584406983734025270 +13819014391605528 +15291089435152177850 +5900512732239634515 +14650961624307427788 +15291935514452633942 +8872404225565603051 +13665300838886697571 +882239428633368902 +10942689785515558222 +9301398006975574033 +3874225267139747255 +830681565495647505 +3477193953305167424 +15293909556188038292 +5249797194076741235 +11678995252015351674 +14101030793982739 +9870725126058050 +5352762575340514782 +5303047061050041712 +15747006802214674785 +11484609632517968635 +1168553459834250656 +15289115337529046788 +196102744067161016 +7012403764072571613 +14426056237757184374 +12542566136569212976 +10574946679535508918 +15294191572590415515 +2442648426814390956 +17377565341394233576 +3307268826627466382 +95814162 +4069792389134237966 +1730290050767347975 +9870725081427958 +13749498212348803936 +9569729479326963208 +9870067407650121210 +18613516793636813 +15302584999598895837 +5783988521111666705 +15053771161609579580 +15925978862159221209 +5461950776127854640 +8743445116492213341 +13248972050516355009 +51184007 +1873618368662098363 +12095670581997559273 +1576180597338424149 +1144540830501331428 +17797834974452784514 +31022221316938156 +12745679913544334473 +11823326492944719706 +11474015373474349872 +12611813862024028663 +5746696284238583455 +6553773 +14479306195012236772 +31304237719298616 +17035774627164220402 +1837917966401618284 +3599049409094902327 +12318553408756796781 +2782815510507448899 +9870724624707249 +5379748283708221283 +5717788221838658971 +10438357983076235600 +92140981481122756 +4879743599932561145 +494402681012 +15288833308228869223 +12258258924229637490 +18413674034484740195 +2625039568697238755 +14081868407518539385 +544604964 +5352348797264470988 +987893190756819227 +69534164 +9870724580077109 +880547356012268159 +9870725055147980 +6054606349327285126 +1626046297573318978 +6424421716358359600 +14335351448779893764 +6221151345542835935 +15292781572259397044 +7299373550608333368 +1413046558836532896 +15901921307375778233 +15104544593369766727 +4935288705604662008 +17948433404338593452 +9992527074865666654 +8429265264936115811 +1410790444811042290 +15287423264907935802 +24904017 +30176223702288623 +1256398974979746273 +3188833116656765520 +11986612011671895729 +1493664750144141301 +11084138468834962598 +9694687042992935128 +16872949640709148084 +5778348236048764724 +9374590145005438910 +3465768822663631559 +15513125587922400636 +77980396628240180 +15453689147130125197 +6729754102968812754 +17483560290603639169 +15293063506979656826 +5376821558582008735 +2819716777652655202 +382627228092 +2574760160619150104 +6204347657634605954 +8501628790069488548 +1730289981981813622 +335335414644 +10133088037819325649 +5248105044070441063 +10936791446025562283 +15293345523382046504 +518324983 +9922925709294854568 +10591325139070885103 +15325495466374226914 +43254135 +1693561390312285239 +17648172271756969893 +5354604872597767596 +12163139241182508005 +3061427692979965785 +13709513622072680856 +9870724661407530 +15288833295331042125 +4133196155858663100 +6329310123471357969 +12591654146264359044 +10966376351062191191 +16892159800548203074 +1873618252584739731 +4986787633482244147 +15594797272825221069 +10608900034457902606 +18431027401344884177 +8192767926012229234 +33278412726359953 +12124871760000801531 +2884033186131028056 +8605926113043623487 +5565348514507542144 +14665059300568409 +9870724724387718 +1975574281736637606 +17960542557797637553 +9870726364819723 +61604254 +6952178319816673115 +5645276744311121867 +18064849841618833209 +880547287226728815 +13702827714901707594 +1715809214503924167 +1546607263666487711 +16974104 +10788340981746783814 +1414738695943775402 +15287423196122398968 +3545799443242690661 +8423666162811628549 +9654763124270246167 +5249386866600133677 +1160738176826560960 +11923578915473263059 +9870724635127551 +11405246090117384413 +15289961326550266825 +5353476789791497107 +8437901606391517378 +1999641806815974505 +684134309481433731 +13819022989999475 +2158545577781499945 +18331397210464490 +11928261446814226474 +12591112773288008473 +6668775723331360841 +12449525980206547043 +14101039392382882 +6206603702874550584 +17344388013991742053 +1102095384688070648 +14897458467886150298 +11456462975801175783 +5885976138785236927 +13237708544183762948 +943759021439519007 +10248216095869244556 +35324256 +13510731817280422142 +9881712940254169714 +27356063969248337 +9870724653477642 +9241910669144171668 +4222429934555782923 +6980484246517931100 +17486380489023441041 +2555880847050695001 +10815931410233181778 +9870726293909764 +4310109704341251841 +15513853507232416026 +5958086159560416940 +15520746560928950921 +1873618377260475076 +98304546 +17422075041604386316 +15893139640936114972 +2623911490188695636 +1571950295410558982 +4289606368070347275 +15290243360148179606 +3652299340554329779 +9870724608847502 +9870724716457828 +4719387859065989114 +3595101179457115519 +15288269309816871016 +15287141192616600939 +15202809222468808776 +9864947443628009409 +15293909607776348447 +4396106222392058131 +1779588998747329403 +11558293645137103971 +7647862184628931586 +356831614535 +13967877979414410281 +5782296448489295633 +2691365739792456180 +7130633574103786928 +9039378561322853045 +17885450446378507847 +13819010092172884 +7201070782650148625 +503001070095 +4392112055939237960 +1995983957735381466 +2931882945675401706 +1873618514834032208 +32714379920354411 +15330853713539784244 +4660099705480748775 +11293068859454066221 +5147552749503071873 +15717218084939712610 +1146660881160559977 +11357526040426528914 +4078298779338626552 +2148672322930150296 +5996988182465768192 +7960531485612861109 +9352957117104861872 +3533594415734468911 +3331820309606315919 +13729896468043229054 +12987787523270728863 +5706434882290257630 +5941764217869305943 +72024566 +547095362 +447113337545 +15288833260939535284 +15290807457440279944 +13948295699660432518 +5707546965160445600 +11722969585197595676 +3199388316604713559 +9870724582551020 +206360220556 +17422335794636073136 +17938730908242551302 +9896446094660291473 +3988819550530783979 +17945855688117074531 +12826571563185220909 +16397970535970126327 +13604571061217222341 +829271517875300383 +5398761655846378996 +5569296726948055802 +15289115277341906651 +9870725380468904 +1873618364362675723 +3090868095387260700 +17430539757768035025 +8235963316841553453 +1404346903847771234 +3501678997913224642 +7926320420120126542 +1144540826201900974 +1838763942525024908 +1732546104605684543 +6032423098437348397 +1179692887208770737 +15848937849825400841 +2879463126541221146 +3187423081934234644 +19459583198780786 +4399490440720033909 +15291935544547239815 +10583135700163108916 +18413392013782941784 +3489386788179550769 +13527189724059475632 +3452050541665856975 +20869716801434177 +197984938 +1873618308474938934 +502245687173058150 +13041281286977767099 +16505476999257598948 +12121874704610964561 +6978558297828117800 +4598821867781498366 +3489492654997257262 +4451048247970047706 +789242300058723157 +11234565534460369465 +15288269241031343257 +8485238802854597613 +1269789428801817810 +2625039564397818007 +4278834390613844488 +153354852 +15067738662042233019 +288046080088 +8977434609261682642 +7206877462704636760 +14023756403079070219 +15025010450384837658 +17530705634602605666 +10997765866085823370 +12754891687179066082 +18331556280207363 +2092145855447443485 +1873618446048496233 +6153071763609887006 +434215537771 +16924762704442703060 +10681922109301076277 +1117188795805150594 +8508972235657861459 +17274157531143610202 +29048209676118535 +11939363345222089561 +11632078233413881907 +8607282616679021763 +9637017574626315165 +8263989358369530004 +8734721047427488496 +5282750305338151366 +1873618351464853890 +4386777604706604034 +17528022603826352727 +1873618544926132491 +3308058812318627774 +8578095579050952777 +9870724574620139 +9870726107459824 +15290807388654742395 +3967850660985114915 +23971751060118044 +1147642972239772969 +9594414040416870537 +10616971527106873062 +16415947289038491231 +19464489 +4148540804029887183 +14262798051772022424 +17122536707882769344 +32432337722359978 +4505144202843474240 +324345079949168773 +15377371869015002500 +1873618489038408278 +5352348827359053328 +6097847768920106140 +5995296152834559435 +6439645968085885096 +14101047990765576 +12926226175109186570 +817365937 +5780604362970367638 +1873618248285303378 +1329348746606296451 +5308183081890293200 +15288269228133539047 +16426949196226779104 +3512998078655174028 +3270958027814813353 +10834678099584758377 +4613997209956193158 +6064440599225133976 +15294191589787184710 +5923957019092470783 +15289397371128186695 +15291935475761684846 +5565348510208106490 +15950694212153787555 +1056695793742127990 +20869648015900993 +1014643471084428473 +17416468689529236194 +11749368758553357480 +17937064730768979129 +21715572551003383 +1873618385858861985 +6158999882278773137 +1746572884498920248 +5855366851174684000 +11258663082281682535 +2946293100247785200 +14320547600568235102 +15292499482772052767 +15448636417985555295 +10333839787251271664 +7728957598346272143 +7410944675485008776 +15689904543889828262 +1575334487942903313 +14095018724633156796 +6002662938079684470 +2050117883468589409 +5884848047378859255 +17798498710984414688 +2682378738630405414 +878291194696197423 +12601357272775920269 +365429992389 +10248057448053554018 +12769025470087978943 +9870724611337876 +4783916140296556247 +13819018690573414 +18001524892029051471 +14479306164917183521 +15291089439451143297 +4080548131700366029 +6812506322839671564 +106292516019778635 +224909687267084809 +7172189672837434525 +2762450468293003559 +15071664566428394909 +11341629473176364500 +9870724566681132 +1873618476140594617 +12590629664748537952 +6043037483520843290 +5951403195973181787 +12716362136789392614 +2487252134248655509 +5570988842561595699 +16223350642495803740 +4652121899968521790 +11691015238048752315 +11534547 +13730273772193124672 +6751981162578326224 +4520586259801334489 +14029859268638500478 +16778219674098953350 +11911353550168013750 +15287141244204882351 +1867087476190634908 +5780604294184830225 +5109952608322939922 +5400084988098731961 +4397798325107760003 +15290243403140569681 +13199673782161134157 +17227551313365509295 +8743165639795223783 +1834963286983516755 +5513226571274459982 +18204453687339851857 +16186563438455117270 +1476216695435703771 +1414738726038352353 +9870724585057871 +12606726586348427532 +15514012724331822816 +6588119693086310445 +15290525419542963871 +15293063524176450151 +16272841195997511824 +15350120448097670086 +14684039612846654711 +6366353484357502971 +15287141188317178779 +4079990808968118618 +4447100018332287204 +12644080653953536584 +2169005683868174908 +15287423178925163209 +9870725382959290 +17461812086317786128 +1627738408887410989 +14934198676511272360 +10585618307037466365 +11377579827729880339 +1839045967525800564 +6967043109020903259 +9387385384162626351 +12344505928996038144 +13001845694847518363 +2536382392765995842 +305240367603 +12608993689399418947 +1413046619023223094 +11970588599140495531 +14587004619874846419 +7037372788726177185 +8985794395457015579 +18199185222634702635 +11098517635487303139 +13277179828830093120 +12163139211087468996 +15446880863004289903 +2625039572996203521 +8703842252661798335 +18147410470752697581 +2543884493003305174 +6718250187864425737 +4347925833117020174 +13731144893856695696 +17170441321857043063 +9248255835934248855 +8260985405216398323 +1496635744753245842 +3653991404577840295 +1662949132533642082 +6156456003434055463 +17664296457162347222 +3812049122037280769 +7799373095277321627 +8858552325786961082 +549245944729907137 +8203814426626368141 +5743312147593515161 +12060386507164245180 +814730579734641079 +14262516099855751200 +3205194901446987457 +6208295882974168451 +11883058350126156972 +15190571396680914466 +15292499504268273511 +11301006809186647569 +23125688953956871 +9870724666388285 +15942320976585953275 +9870886988315045197 +4397798312209957574 +14916423074419061715 +15290243390242757107 +1615518660029532277 +2992491432143698351 +7511405001902413164 +3604608 +1873618360063257999 +2952294587670490414 +16950240237842483783 +6043037560904756193 +15287141175419346723 +15289961343747040184 +1251604704732006885 +3669291476777311698 +11202456151687629452 +5058464982337473443 +13193184014422973169 +1491796976 +16934144982730548784 +18349504802666319185 +9870724577127970 +6375653898722412075 +1873618304175520370 +3599049400496049326 +5459976661309982295 +8328637003859953646 +5897692581111211356 +15471768358264639585 +18017020934617568132 +16760371235082413997 +19177532403624426 +2831113265379545349 +1467988644601210659 +5766981569280228694 +15235300779755847660 +14085001079417612674 +5898538660411695711 +16095855390987865600 +497025749 +21954873 +16757552583869931710 +5543996233044617657 +12545157295895897191 +4342724821818092901 +10038815564930571848 +1839892025332549166 +2730758514787295153 +237175467 +1838764028507347972 +5724391431735030983 +14594451561142501216 +1413046550237692399 +819856323 +16778219695595128445 +15798241638577276499 +4381281319413241154 +15289679370334588425 +1783539943535825899 +9870726755610913 +3584013211340662379 +1873618441749072804 +15278816674640187626 +2653165889135197004 +5879864397206930804 +5835757879433182694 +6674126204084183091 +14418491266486916429 +1518418407734195197 +11024829549809199566 +12500216000076058486 +5252669682549416798 +16885380435055946472 +1796543018767761380 +25099911252827429 +6153917830015027393 +10194769038585973900 +7598046566434952384 +10184983795144472778 +5248951136269502637 +21715680027029471 +4119084579038312999 +9870725133529160 +12638147294677255216 +4393850125563348528 +326736550144 +31586254122465191 +924633388858939860 +13162103350425901916 +13819027288966086 +6155327963617696564 +5153885686375652918 +3652299301863365651 +4129856586586923574 +1894834081003889923 +17689932837550381138 +9886639221811532570 +997112076528393024 +5967789484706511158 +103285302 +15212634620630620100 +2210675717504504039 +23689867931891041 +30176064632081077 +14101043691348168 +4383565972027617367 +5140326912399194693 +8766105625110517221 +3068775768859484204 +5458848651586965330 +10469697154609596959 +5154449693386026212 +10887935285729694695 +9870724569198071 +944005402247045938 +18331539082995373 +11168985090525901164 +9858545762873852548 +16365117057346853164 +13787094227570270224 +1466296524688275623 +10095775271159012662 +8097715919321983894 +4127600442468080574 +275095169904891006 +14024943 +6588965755190787987 +1198918801777911894 +11901314277710773719 +15289961373839158376 +4461611072968282289 +9870725107249183 +5199085367249095324 +9870724632178397 +3217536001876239863 +14428481166735651872 +13872231352396231745 +21715714421038259 +1732546121802459810 +4767727591019973374 +7978850616169094648 +15293909612075313778 +15290807418749339899 +17484688386307268877 +1730290007776963418 +164927951008051021 +15287141196915551890 +987047132949596965 +7517620373281659981 +9870724587548256 +1839045976124182808 +4243260221087309489 +7621113193634160630 +4133240804914914925 +8321459293652653175 +15288551330518206781 +1093546987271315565 +8483487990281098742 +3599324741218669154 +11863494709144938274 +3413320919524533927 +2625039581594590117 +12142525752872799042 +1197790774859345061 +5249797194076265633 +617000503212456682 +7569568047215545466 +9984259169219981050 +10531773896647594848 +2625321572202582702 +5900805793554762144 +15289115337528584013 +11573430836645541172 +13117263636444153530 +28766090095429261 +14054073294632400977 +6280436236184721577 +3188321344846772235 +6014764314626047763 +17413758803381673969 +5567604607036384057 +16321438037586961453 +4769931038492344838 +451412296787 +1735084269425868561 +14662361168613887556 +13515333949333511626 +5041159669577570802 +10277194893975961024 +210659181949 +13065352669248444899 +7861026204079755582 +9477584246401745452 +5889729417296949431 +8897066223968332049 +5205796391235297457 +9870724821118899 +1223976962194278208 +1707901783400932037 +6136932998238969008 +15238422321780434024 +10154483230895248009 +1873618368661641891 +10908286541515597306 +825323228050382087 +7883991333603006456 +18411699893871247383 +2509281739668857174 +12734096628671909131 +9870724668878675 +5839236516000050625 +3143159678306028631 +8233961467785404344 +17423767204508020709 +13041267227335341263 +8477811091809067164 +15288269301218027146 +11251542888998530181 +6095014 +8540443249939254971 +15290525909639650844 +9388513497063498721 +10250425978780804663 +9870724624248492 +2218876231420095397 +1873618506235188778 +3544953441323212899 +1873618265482090360 +17900666026387521269 +1734238258909694036 +15291371438656278743 +2625039568696779760 +69075405 +18360454966651996333 +14599501639973609104 +9870724579618354 +9870725054689225 +2978141770135784473 +3009785933191986257 +16794806302830176234 +23125779238169232 +1709507593 +14665072197921223 +15292781572258937508 +18240825841224262496 +5697191359858611316 +24445261 +16484582996328786369 +1371414905848475235 +5774040768897567912 +615140332166385464 +11950664064058468759 +1256116984371289534 +12103109825679658143 +14947088600295060 +16655461202858024455 +5779476207079137378 +622266742082323066 +935489347195783927 +22279798815330137 +6205475701751155414 +4289606393865518597 +6698767362340230744 +1842828987068139648 +6815044500557665047 +1998795749008742452 +17998422724495763399 +85348920764666700 +4891578948659337543 +11287969533778812504 +785983290289907100 +1873618355763814479 +15273884660262766886 +9586825400524627117 +6177363174264606048 +2719347734316853164 +12284124808561117836 +6440896699033017819 +5741055973380860042 +16859441599982168328 +2153908494234559865 +15291089456647919841 +2786543318764361127 +13362760202069292898 +13819035887357537 +27920040887059601 +953645941584702297 +15468982935876624911 +12718336251609299902 +5766062314529559691 +17525496580213454093 +15293345523381594068 +681145240220010584 +16640937553264010796 +3130237620955780531 +9870725136019535 +14101052289735980 +1136619602727217639 +9870724660948772 +3999491526047896750 +11654153592182693776 +5235456286719437758 +525267382264080216 +9949477605624325598 +2508986617110553159 +7612361991563067690 +105775699 +11846305913529243775 +7270782170595086112 +880547343113986545 +12982671511023610556 +783806437914461735 +6101796011455220816 +2372558494126919076 +11115547993979558486 +16306038188589780820 +17299513086503364457 +3456680308846054777 +2531021389865944442 +16778219691295711396 +15287423252009657858 +7801663844435519008 +506087810653106898 +15530835708041503336 +3955495966009932665 +5881302580998508145 +5140326865109857930 +536216330 +4397798342304535536 +3441885666829743168 +643826540 +4715605729470273246 +13295987987165679220 +1910933862240560813 +1873618390157836734 +7439351969672860685 +10396407563347499026 +3971798925024367676 +7454507813786626063 +11468824568195073312 +491586249 +307745876124391481 +15691697526685702585 +6261263780835252861 +14637903957824965363 +15292781503473401270 +16515346 +15754944874062424813 +6632334123533034110 +20587485441115230 +16572875051796793000 +9870724634668792 +3080975454213247051 +16273447528372714265 +12633194195696241051 +16085287212446407118 +1627738426084184925 +19741625396299098 +5726226297114658480 +13819022989540282 +814416800 +15289961326549808862 +3419276518732406776 +5972855211812726011 +1093546995869688587 +12306639309850173077 +12301990937716008418 +1873618527731399195 +7001542349734489150 +2096376045599405148 +2052045667571624673 +11498027848715870603 +17014826162511497635 +9803885194457261829 +2430620139577296182 +313841222762 +2625321580800970418 +7650508660710387403 +4548309582615693057 +5722409850644291912 +2789363573071890362 +10161648502327149991 +15291935467162841072 +8277082401726422982 +11701191021079496730 +10411421359283725840 +8926052536804313893 +2575314868699489484 +9527547870932260145 +219257572663 +5578757003660254963 +15292499521465033183 +9195158069578183210 +4617210159110034583 +7397691527496478941 +7330746538183242628 +12611249863611593482 +4514808807919854833 +8616063509109155543 +2428928058356550243 +12602214289513130156 +21807430810743755 +16135497067825287818 +1873618377260027974 +97845788 +15291089486740021283 +572413802331838143 +5461909885649685955 +7811296705109577760 +12973149357321491569 +30740239306861545 +13518219751023648655 +13513390315283555393 +3812049083346336558 +1570629903415986398 +15292781537867406235 +4660099761368020187 +22561595960810811 +2416614035654907187 +3865299070694735407 +8526790380748034864 +9870725881360588 +32150372909516328 +15287423183224131688 +23407640871003364 +4505144228638631150 +160825986 +145004264338907087 +13341986048965749767 +18314527054315529462 +1873618321372294823 +3599049417692813984 +2624757560892802562 +309539325835 +7254602687522812174 +14194830971440801950 +15288833316826783928 +15625593152263958458 +16688455542662111884 +1873618514833582936 +6064503826171693679 +122385036241081296 +1945545826146474106 +2092381607087192684 +5833854255738855947 +2625039577295167858 +5352348805862394041 +11408069428259075767 +9870725101809685 +5831598141713372489 +17537656322860519169 +9870724626738890 +4502324004423211752 +1626046306171251886 +8057241118381445488 +12169253260185966886 +8681629277261088149 +2606961460764692199 +16294470476860886626 +4836670023851988071 +12219117535699152903 +23407778444550604 +71565807 +15288833260939068642 +546636604 +1873618458945853705 +447112892780 +15029514774896597691 +206359759935 +4445946672738929841 +4127600472562670827 +4910402882675693167 +16436648502583690678 +15273604164533440182 +18411417873169448972 +16117885710556992015 +12448397914595339148 +2671857266250377929 +18895576187945328 +700755884838 +12426035771138981976 +1873618364362210553 +14203572002560231309 +9870725380010147 +5517738936896065153 +832091638910708713 +13603584720092934606 +15292781524969603654 +12655253118821349389 +16904367046536612570 +15289397293743812891 +4641275353467400596 +4442788352416573853 +6206321707967910032 +5041592804875985144 +1522920416074337965 +13407762898221475227 +13089504285436106335 +15291089417954482930 +2624757547994998442 +23407821434470867 +16950883004540669541 +1873618308474483760 +13580718560192184441 +1894834050908825465 +14101060888126588 +13834461643483256239 +2723374776553770162 +7880607042190053661 +18141248253500668054 +6835889291304124905 +18297946943827555402 +13436093398659054798 +2602082919079963206 +4272690327276570408 +3164601805265244593 +45285754 +10876791274088632209 +1197790757662114612 +5513226652957347114 +17949152557550757513 +2908228791078294286 +16432982289349543214 +13541939535779468701 +15302298090060782219 +17365692549803942091 +17989427870652511870 +4046395373324489362 +14665067898489050 +7751724916214471445 +7731877912852836678 +27356085465001395 +11287271091089523344 +9249568750854360796 +18331556279771006 +7155231185920414121 +10855928786112765120 +17575525466142094855 +5059875064351383315 +583336804 +11406774769981530502 +9721963210361553871 +12350730930533634550 +7938745925635891261 +16842861853167067880 +9870724726419350 +5890488405527508593 +17922810271644068481 +2935217514147245117 +8978712540793235501 +12766279949545137301 +15462458055234171731 +538706709 +10127586034317532199 +9513659444026759722 +1735930322933204229 +145335340848058070 +15290807435946119932 +378327355714 +1266116503923925921 +4396106243887811675 +2698841799571958951 +9870724574178821 +412782768687498751 +11372167720875204418 +12221091663414373627 +7095406249883405771 +12782837558680106929 +14312864968818037973 +23971751059677535 +278216257523107355 +3418202265618160838 +15291089452348495076 +13819031587931461 +17318159192042712858 +11298560501224321278 +15954115490261066068 +848960295933207318 +9103100569952650951 +1734238289004278621 +1415866765854260454 +5833854277235061239 +15166008169874210971 +18002935038529062766 +17626356125150233100 +6829167367526826233 +17817323649556633121 +15288269228133068905 +2635993716051094285 +6365225483234117329 +4886440193217073266 +6032008797801695630 +3918266985751787184 +4057714548219658443 +6155327912028945325 +15294191589786727542 +27638110467002689 +3174142940176667916 +7701451417341023614 +12449072701226772758 +6847978093790575429 +27920126869375123 +2785415287546405042 +8298936022927352734 +13544669976267729159 +11858665818790716971 +5511666307614640107 +2712368608621182402 +22279588156824906 +9324833269344777902 +10003986808099850290 +9493321181781304813 +1873618385858414242 +13464164554474081719 +11294291098333287470 +12155898262057594369 +4727296740454327808 +4659274830459049775 +31022238513249162 +10666446631412567902 +15288269318414818415 +5993604063017448668 +18063913043561551141 +7617310844917733841 +6154199812024192415 +9870726036091108 +2411322925857712896 +3836386649570419829 +7140469779640626558 +15291089439450673530 +13668621706187002971 +13116493919087907365 +6432028346900355270 +1873618523431968502 +3586101984724008839 +1372824966366170355 +6658576559706821414 +17245656359461668952 +9870725883850959 +8526711239344595008 +1490657475637832863 +8695136395555507435 +2703776880048674990 +2625039585893554821 +163316374 +9870724566222277 +5831598150311751915 +2625321576501546622 +4396106175102260616 +15503713255025230661 +309541806678 +4021100626839361803 +8965990732324548314 +8562440839454140972 +15292217500763231081 +1201739017394478812 +11075790 +15293063580063704547 +8856014234050823647 +18238591368177870185 +17636248728882468642 +16833640656039597433 +214958147231 +1628020382299401244 +9308938138266842946 +9870725104300061 +12266818901382941962 +8135278117562163571 +5438273239143485232 +5783988525410169637 +9299384225162016674 +2785415274648570354 +7398759407563780212 +825887295247438747 +10527528266242942341 +15290243403140117392 +11598479787825963391 +10676423379454811038 +14071535647197436643 +3918266916966247661 +17414886868993188323 +14720813411196300689 +3361602162814558779 +14666204015189106460 +1732546113203612294 +11757180014591350364 +2624475540191011260 +11692616510796552178 +5714281067255570685 +7453876520354586064 +11272180868443106596 +8471628142875709956 +64646317005161886 +9265158806365353152 +16885380404963396802 +7423562264694050080 +9319686106503382840 +15291089426552856258 +15292217543753165017 +2224527578591736030 +3757107130852839550 +16956206852993013996 +12210878457127398596 +15290525363654774934 +3623382592954913876 +92406286 +1688658290302784414 +6061683644948701633 +11098235563196752655 +15291935497257438915 +9752004188112957698 +828707506565047407 +10744889200825601240 +6438099326814272787 +14108981608068231748 +17740106858442535871 +14911447610171655366 +3313969587429462395 +1873618454646431193 +5170355050641378044 +8416935758545571684 +6783352854599392330 +2576363817137867614 +848678344016929843 +1519546417456765773 +2209547716381137899 +12607854617567183376 +189614828176542708 +13678484518713821516 +2581237213155896166 +9870724665929528 +5836266020495174817 +12532441830052093451 +200191596416994196 +8502756838485015881 +14690304989675343996 +16370016079129891675 +2006440602870310322 +4278781002 +3145849 +17508019195330236795 +9087257516001803208 +9140909945301521182 +1414738713140082969 +4643200963322668084 +7003516464554388091 +15287423213318715922 +5566476545724581156 +10783079664800389390 +5021379672069857134 +8882845388820581451 +4247483315909648373 +8854886168440079511 +4501477963813232330 +15687084388461979043 +6952307645080342589 +15955879720468630621 +1626892316688661521 +13819040186321942 +15289961343746576476 +9317057686487575532 +15288833346921378413 +5515200746281050576 +14767261450680552217 +8083932495104316217 +15287705229721092142 +12779163922391107832 +9870724576669214 +11914096043364063421 +1873618304175069345 +1770541520928328687 +1873618497636337289 +32996400622481654 +4762215441362400526 +12539126979889802751 +14101056588704320 +853643387796785445 +15289115363323757475 +9518171697871663839 +16860280519949442916 +331038012190 +19177532403180882 +5157562944522574199 +21496117 +5885976155981547843 +2691780374684918478 +2803649555476916916 +6916677212255568689 +21715589744837612 +29048106498595135 +5357989052234341266 +2360543918673038210 +15997569528275285959 +27356081165576543 +13317993416463955159 +15292217474967618343 +1201738991598835482 +819397570 +1413046550237226306 +14883032342212992101 +8332963721155328603 +1873618441748613384 +29330122900969459 +3757107062067321825 +6515222433118181230 +24535904241984379 +12713221567559514745 +15292499491369977714 +2544580112253650683 +1873618394456804296 +21433663624207737 +10260419056709935430 +2904780083328338280 +5510573007748478058 +14717113633060559746 +9277666686438550002 +3832076477923610421 +6155045947214860152 +7695726709112195456 +10604601913840054263 +4074350532504404349 +16760795667143281135 +17089062600489905771 +4585257123188181630 +5672976434440327085 +10064861692788750514 +13616281520887371873 +7523981759097880308 +12315980817073592144 +1339613938630351168 +15291089448049072638 +8794768896894264377 +18301217045165716995 +9870726298431751 +2880374771936356636 +4289606329378947694 +102826544 +304119526640536805 +3221177427173133929 +15749833693486727261 +6013924586872915059 +10944945415837068192 +17345010045701022944 +1730854053479079850 +100077118846931945 +9870724613369494 +2625039594491942261 +17501480265540790433 +878291147406381157 +2625321585099935141 +15461484579900234917 +8512937865527517282 +4502324021619998176 +2527671765987701417 +881957369240177298 +1514961573407562029 +3396481857434901046 +12750379368847132650 +9870724568714358 +7429300798120285210 +5957124687644996560 +464309674746 +2903369984119681337 +2538375794386019488 +15288833278135836042 +13642648098285960938 +5406444734942689553 +15289397366828307468 +2464318382471333535 +9673409225509720607 +13720029010641436293 +223556538265 +15291371408563717194 +7536133461597360149 +3329897576220475836 +15289115294538213572 +6347957905116375794 +8547670484909761867 +21433698018224501 +9255035261615217833 +1630414608044797701 +1449461877142343305 +15622930530089374817 +1787770232567914967 +2305640534728057095 +1893988070487236579 +11908378959853527083 +11134642932340832159 +11723954785607116725 +2574671731618947220 +15663892257852040910 +16804082559294716209 +7934302157077298144 +5790266945327688551 +12046060055529213999 +12454038173863865766 +12729598624516282306 +7719447182991703368 +12538144815240128515 +17621770955940125010 +14490988229158572638 +2624757565191773208 +23407838631259460 +14584748514447288984 +10143775216852163938 +14151987057237756511 +8331624998514807881 +1873618519132556912 +6157301992454840039 +12202104656845225799 +1873618450354957555 +9808204526857373842 +2629692900161966215 +5139480820200467556 +2625039581594130543 +17089062531704376972 +9870724650069767 +13015501012126020372 +4879690363929176858 +9463922055482521590 +2629410827871860013 +10161648493728303880 +483565283408880556 +9870726290501889 +24253862043987280 +3576060792758939507 +10396271720017711578 +15494005608834598990 +2390470743334730568 +6787407156208947948 +2903799416575834335 +9870725080510449 +4794173760728861833 +12665415608367389244 +15266924618528024046 +2900172726120289167 +16358593412853162244 +224659024407040783 +627510695322864201 +14280399715629482958 +525337347 +9870724668419921 +6680725003041777338 +15289397298042791960 +2857143631208072974 +9181531069949872018 +2296491989677839461 +6647209537894242852 +5991347931794705843 +8512638418800224027 +6248129653559728672 +12320028931543952744 +5636255 +12484965687538560504 +15290243342952963484 +995750785910268298 +17419818910383692351 +17217874704800820765 +9870724623789736 +2414921967332769269 +3098295109108505790 +7656625311349815030 +17238671514823110484 +936899437808084544 +1873618506234732232 +5511645657542824630 +14525678288269292146 +14101065187089787 +14482780820807687940 +15290525359355331959 +1787770163782373519 +20305658201837598 +68616647 +1785514049756875288 +9870724579159600 +7953290430801985671 +3541851273791169724 +14383081589462342 +9870725054230470 +12545157304493826678 +5248157445900799208 +20869665212206112 +18331560578729701 +9851590860238640829 +14541454813399489752 +2791055602702618861 +10178192978388138847 +9870725377061009 +6847978110987353448 +1783539952133759347 +15293345626560669805 +159421316186136114 +8258031983280609460 +5464488915154445463 +937694971682037886 +9870725959741655 +1466296546184030390 +8528202978511959336 +5151911554360564463 +296253846918014248 +381285815416474735 +15639645420123019191 +15099134226986375515 +12606726616442537392 +12591757708863407913 +7036226056541179881 +5782830536849756820 +14646417544996071161 +16321720006700788747 +7409299993467513107 +2108679834555796428 +8876962128767837224 +17951898403046310875 +33560386137886999 +8344402900088476127 +984791040419827935 +1665063776377524938 +335334494967 +13819035886897883 +422663350165587855 +15287705225421656281 +15061665846919768131 +8154081321495509185 +12264136744856872904 +9433463473978104787 +9870724660490013 +1870891575748074096 +6448736582553582066 +365578901674805560 +1194007415201076785 +326738585965 +7042731044489660311 +8714910536611810309 +4609105956830208542 +9512531395612785314 +9870726300922121 +11069796553860646809 +279446762204 +937181441312642152 +3650607203446180114 +16434110397951008545 +16170997943994440216 +14663972436286591032 +105316943 +15783516540796024068 +1518136313948695321 +5565348514506609363 +9870725090930692 +12748387008397126216 +2543805385922512178 +232154928699 +12293559540496672042 +5194291058310388344 +70272372060534169 +16778219691295267442 +14442969419414136635 +4181978409445241072 +6814012809990194765 +14066883983546537650 +16393994740892918019 +4127600451066014731 +8393534168238138423 +15846834169944946079 +3675920403274357349 +10595209668077494545 +12848973762671483800 +3866991143315396507 +1192315333980326167 +9870724571229692 +2930117073648442756 +1873618390157386962 +13128164418673579550 +12500215995776191022 +6821858610298642053 +18060450173622363021 +17917394492996072134 +1693052306968941224 +15293063541372757132 +2910516191757154144 +450980818488544658 +9870725369131119 +16056587 +8981039660885228184 +17105159500594825588 +17311943833560820709 +5996988251250366125 +12024068771569089686 +5991347953290919091 +9870724634210034 +3949119167355772894 +4879930944347001254 +9870725109280816 +15293345557775129877 +2624757573790152513 +5353476789790574588 +934393163381164534 +813958043 +12248842216202067986 +13089589890164796154 +11678577273375754735 +1873618527730926929 +15287705212523859775 +8851777746511158367 +11848991023465326665 +15635925519041823968 +7463385627820903227 +14782591063706192039 +4908788612025362585 +2625039590192519418 +13671275438566877297 +7410775182996363215 +3649479120639898268 +11405928725072133381 +6319246717100372034 +2625321580800511892 +6877319166685482198 +15291935514454202458 +12979230768086855104 +13351948495571782591 +7320877660423406779 +1410790466306337483 +5413709695227478408 +12802363114501781432 +4502606033722960852 +33560463521815385 +219257112483 +9870724760170408 +8499936687354096725 +17698591367326090460 +8946694531520678763 +1893706049785447446 +8683329701605887717 +5871164884426441922 +15289115290238806338 +1996539656478996012 +1873618377259565613 +11313200934161749028 +831245572507573218 +12806893037197865472 +5907010098526634820 +5356297001108190455 +10165889801878453136 +5022854245794340573 +10111527222079858830 +15288269309815963882 +9887461037680036022 +527827717 +826733370250972571 +1880166538706292058 +1041707150723145627 +32150372909079458 +160367231 +8001430470098104947 +13050400918396095607 +7874246159031687184 +2624757560892353367 +3226817755227183030 +6524975260417661540 +1873618321371839705 +9596942190412504159 +10194769012792377526 +1873618514833117749 +3240294201273225823 +8126661 +19177549599942098 +24817774473208100 +3635885264951140587 +8321191778847890589 +1353895175690404210 +14954941094161561059 +933681580796758848 +18073080406420174840 +9870724626280133 +12193666400801723176 +8752494394018110556 +16084518517580635581 +13521540362471223543 +806028152 +5412085062996727964 +1087419898823591417 +15292217492164402276 +14153225681568016789 +7645126008776697058 +8500063484584807575 +17083693200934636558 +1873618458945389823 +12929409143044389651 +546177847 +9242938543921774916 +71107048 +14720147863527505550 +3754850965238597802 +8629931994826352606 +1735366328820186131 +15160426825286370798 +7572128174361809021 +205480860818169205 +23689794846480732 +15745933174792336282 +9293793211547589165 +3457651687946723948 +9870725379551391 +15291935445668686003 +11994917969995701310 +1732546151896591582 +1546741894110011869 +17105159522091028740 +8868431006280793145 +7299691690862329611 +932669178870126558 +18322386922903528703 +15290525410943644277 +7561389495626837513 +17824892227666068646 +6340598804230260151 +4282228004784848100 +3865299057796454233 +2388225606909243623 +10333327937035855506 +8577531529049754414 +2361671975684947930 +17422586631643288589 +12887895045170751493 +13819044485283639 +5354604928487070338 +4309804531418150779 +13011541759071237220 +15291935544546316653 +1893705980999913400 +1361488794578021438 +1873618308474038859 +1752265183322590323 +7238223779612223090 +197067432 +6048234162139500274 +1873618501935313943 +1840738130428957643 +14101060887655872 +335336990474 +12593167795176751387 +13690032841766807529 +2848264778619239184 +15288269241030425258 +13143886670509793300 +288045159223 +6817582656779011999 +1094393088070005160 +3652559214678449870 +21997584651803266 +481506450489 +15450587005391541702 +4319853510795794585 +1317798870 +2829425352602170162 +1730290080861021926 +16395380765236336415 +16467764576550480383 +11057771235142493680 +828425425676097970 +2524805992693115831 +15289115311734998089 +1839046049208209258 +14034799134864058642 +1566393917707937516 +18371639724269573125 +11035551007660203402 +7935271783416151245 +17360925867609166911 +11007456264328846003 +9697782034300613999 +11038303070468848623 +1413892625240775952 +11633356565151157114 +14743864357849343836 +15290807435945653459 +12685698498208869838 +13658843412666393060 +63177141 +538247952 +802207752254918433 +8517423211383823083 +2012080857840628247 +5671848321538989125 +4783114155788935585 +5972865477549438979 +18412263930975748140 +16075145612973339 +14931660597672490205 +10782370605598395199 +15291089452348037894 +9391897711091583990 +331035072443 +10757572347028000395 +18394514571174963054 +11277056612875788662 +18546980 +11912481615777832768 +3628529266974615362 +14388795679132699572 +528050642354852826 +829835503391039930 +2134746484421585098 +3491139421170847409 +8509536234071405975 +3711115253286066900 +2574671692928013569 +9720724525646813721 +857552177603884826 +15131405685764156644 +1840738117531164240 +7405633711446564136 +17482021811958071805 +10591889189072737470 +12440766715654454563 +2625321589398899121 +3628204411664146345 +3546638778076973076 +816448424 +10594427319500605883 +12715826553344904918 +796400260757547113 +13906216870607917129 +3383183387167702034 +15294191589786281688 +15206419530470084417 +1789180280187803489 +9870725067141076 +9336545312501158904 +6733158961487954254 +468608617008 +15291935475760762248 +11268266772578524690 +4076606693818764590 +1680441898321853105 +227855503599 +27920126868930216 +8421741000621118146 +180404055358395536 +6250589788160088714 +17132313306116999951 +6047549741664254315 +9078366157069959381 +1873618385857961570 +3880305999894815829 +9615412020284565404 +11977104894337369168 +9870724655050513 +16014863264194837971 +2136949463181650284 +6073354836911402599 +4151361015346562251 +1571489717050227960 +14835085571082555134 +7221686512422237651 +1218373267405481285 +6134861704878052757 +2865782792753927941 +927164962728314711 +12427099071115699540 +8682578020374893228 +17976881536618275204 +11314988902935510399 +8874660318094776723 +2150364438542752581 +1059784666551833749 +745740842898098858 +2185568528717143219 +16919234205864440225 +15290243360149735302 +9199495963936435297 +13666047648112730808 +8920924900716602018 +18001524892028123323 +2624757569490733462 +7553735952381142914 +1873618329970229959 +15291089439450211128 +9870724718030707 +1247398663569494517 +4180850378227263456 +11185827869741501538 +11466923009239095163 +15287987271918624956 +12921020041459033052 +15290525376552119038 +10695941049625230007 +29612195191871193 +9870724565790183 +637928298 +11630837546755507951 +733011524556440791 +2063139881 +12962168919905475175 +13944990570025457568 +1873618321374341981 +1039884988972941439 +4568110996075861100 +11427331956784106382 +21433745307079052 +15054026795560476165 +1733111134147781794 +4920623494848604072 +7409502855497715015 +9141462481572415155 +2420359387557947082 +9811526511004170405 +787559629852785430 +1837917927709744202 +19741565208706749 +10617033 +4355957336639560336 +16872385650894636566 +12140808895952342571 +5913331872810341658 +2007568586798480018 +4795998728011212891 +9870726529052950 +18413673995792875610 +8520914754064026558 +12849690445662018325 +4003053205776444801 +3808100840810296131 +6156738032733324876 +6151097734773868363 +1626046258881445137 +10856473307675892410 +2129219401877047069 +8786674798224098998 +6436459668631936671 +6262673798362565305 +6364097417622914469 +1732546113203158009 +3678042723065741435 +18214913141203941468 +13649555498758460125 +5898256583822942964 +4076606625033226775 +434695937666203697 +3809228902122868939 +13671243353575287841 +5083563915342273063 +2786543335960677953 +11508784618006011604 +171951370383019376 +805679524421051440 +11296478669291474957 +13672737712787961194 +12972952285742288 +4662355815205911460 +15291371490246602488 +128622230726993116 +7047658367535355081 +11917647837929034140 +5461104791407183416 +16618104504962847381 +7750863475817075612 +5103722365903784148 +5994450047737544470 +14365376677553264747 +567018319 +1283514803232970890 +8314921679875880795 +9870724602490487 +4347925833116091776 +5992475997406256039 +705036524747179571 +10084765861906499764 +1518982410445936282 +2134311698688718192 +2917365815493282525 +3971798864828834373 +3684117662718241788 +30176189304423332 +2061938983703028951 +11050085896688979868 +1201739004496201739 +1043117224138659414 +4221282890237357465 +1873618454645987634 +16085772215206423095 +14243906649715583101 +1197790710372320755 +15292499504267340217 +4452458334282455578 +3542979339402689211 +15290243390241836808 +7603297089728964959 +14952345875861152038 +388639069126930956 +12245726436292512493 +15291935441369243081 +3758799199175318062 +2687090 +8545007112842924423 +21997730823760128 +15293909637870008284 +5246976952665638015 +3581923999678612951 +145215777168242576 +15287423213318257501 +8595189161746506386 +9534594302153664874 +17557492393527287772 +1572319661390716216 +5780604272690223145 +13560019150194546340 +1841584106552387812 +4750939979607122781 +23125633065300513 +4870397595786241980 +13819040185854549 +3331190244687229229 +2843337396197217177 +7623863292059736868 +2676589560128737507 +13619526460821621700 +560100214914824025 +2755493796602522429 +8016103765568991690 +9513659396736967033 +12339564610979564477 +9894523072925814580 +2625321597997287853 +4842228467119955056 +11688760044611711452 +7731877955844795577 +21037361 +9870725374111870 +283745740836 +1839892025331629967 +24253887839147601 +965088651291944498 +18002638457266187139 +477207014905 +15288833291033192453 +11331649863678691999 +818938814 +15676270606850007993 +5409828931774000295 +1893142012680032772 +16268501681003177672 +2840320970871171696 +236453893581 +13894753574868239522 +1873618441748162143 +3196729899697918313 +3589943541717748366 +4899394998853592489 +10453048286686961735 +12356568393605060870 +108700472859777738 +1891179231970278260 +559088458 +10231989982691353502 +13626565541770378491 +1775922815606869885 +9870725069631449 +4504298175130387800 +16078161326675350523 +15292781555063735098 +1144540856295560020 +18411981910273949729 +4022228662355842987 +7645826184296944959 +2206716481646041900 +8097312532666069593 +9832674736745755030 +8699084625194063443 +39387493 +15647835571008715937 +16191113565432457837 +16995972004055823659 +415696627612083670 +451451877878359034 +15915303534351631720 +14483068275494710706 +2784572500549244102 +1873618338568607858 +31586254121546361 +2624757578089118003 +15779657929565890728 +5153885686374731086 +249849513631102549 +4449920160863441032 +1401559470217772959 +18336475955112718142 +4996566240508340209 +3544953467117898450 +2625039594491483905 +2902805977108867734 +8309831114279763248 +318139755773 +9870724720521082 +1043399317924954039 +9198943117821938833 +2625321585099476526 +2479344733239790073 +3685720981037342929 +2020204409927703346 +1575898520749238598 +6297948185907635091 +23407795640870522 +2803776039116021482 +7747954311877837546 +9870724568257296 +18206277895527097171 +1574770523924022162 +12597918904852377006 +1573642406723742791 +15288833278135378591 +9870726101102830 +6760308635310647130 +17706466419108551806 +3754850982435363537 +1753707611600982092 +15229105002997520 +2704904949959166469 +2107269726748303096 +7350766340265224397 +13107433 +18160023005173605150 +5831598103021951178 +9870725948862677 +3861350836757093627 +1873618381558524508 +1996539660777974823 +3495413321014206956 +10908286554412510205 +9870724631260880 +501000180566535327 +5992475915722887781 +869984510486186619 +17437524563557031032 +12260141588695427297 +8856014186761037557 +1712989076272400332 +9722583101500507722 +15223822230290106035 +6215388521261066860 +3031109689491349806 +1732546121801544814 +811008904 +14107087915136329971 +3068049059797011246 +9714916620294625706 +4084666023472215623 +16881421130411949513 +16260410427443711846 +2172405717041572486 +1411918557712229745 +5783988478120368904 +9870724586630746 +10907429529076434052 +1254142856655155196 +16835723503013160774 +4588984415399318550 +3183268292350588750 +11969641950059584378 +11231170322809037290 +1873618519132083133 +2703776923040616820 +1144540787510042051 +8456214898278288101 +4679896819707491068 +4079990808969681175 +12825132176710714026 +18170158018019601908 +12490303189019683642 +5457397679095681305 +1197790774858432736 +9305725264287507171 +17117716579000278257 +6769611582547697430 +4186724964210720669 +4904404316019511987 +32150321320310288 +537223951118262085 +5151347560247547033 +6337342946992345879 +4664047948014950755 +16557244502443902909 +2578417100717964980 +11254960631523333664 +6331026148282999286 +2625188329986536578 +3545799524924658876 +12496230539818707878 +5299098887299864244 +9407311746209573540 +7147475108051631779 +6524934309752826119 +9870724604980863 +1467988610208782390 +9870726137802997 +2681814761713717230 +1998795761905653499 +566394206825900979 +1900503837079185406 +8512074411789399854 +3174142914383068254 +14294005446368054947 +14011056227768488974 +6583596463113580718 +494159375523777824 +825323228049450439 +12262933835895690135 +9870724667961165 +5993604045819749575 +7718319100184967238 +15291089469544805223 +13819048784254229 +17723661893545519514 +5177496 +15290243342952511410 +10576074684958974027 +1873618312772988736 +16958320889095785904 +10766900926552622263 +9870724623330978 +20305464740101022 +1659282927896967425 +15287141175420927812 +11425304713130351843 +1873618506234269763 +1630794378229977523 +12745284836564406753 +4600081247081014991 +339635938214 +68157888 +5782296431293636228 +17617602631942286830 +3220760793224924953 +9870724578700844 +11257008512376921726 +234558121275974406 +15595862136028538455 +1410790492101499876 +11943657631361677388 +1579222659327672440 +1905391107871286302 +13548902087297221864 +6589396841525218018 +5132701493398689871 +6097847730228240237 +9870725376602252 +18275875469837485771 +16261820492260847690 +4011069717272668463 +1873618450346547673 +16080161965322420727 +6835382734606174906 +11548429690491131613 +5780604324278520045 +12786169222001352903 +1996539682274166672 +17152685971422981240 +9253588097292974562 +13281827118164692297 +13966948635389088463 +785983290288972648 +15287141218410830872 +1730290029272250719 +16881421151908160978 +16846695548644692789 +2201358182892984239 +5299098818514338695 +17205553334892517094 +23971755358170238 +32432389312220424 +3441412409950292648 +5511666268923254538 +300171297002295337 +6152225778889199261 +6092080099993196919 +335334041522 +8481290603310483360 +6653676380367567044 +13159245476491963607 +13732264254399588366 +16711006881204343619 +16135696211206541582 +2015476116781150091 +7933778613454127145 +15046845124926786172 +10161084508213695294 +266955204923563588 +481503497909 +6462167827986926409 +5903061929075565909 +9870725135102028 +257098416 +22561759329073706 +17971473236626727094 +13944990587222231178 +11279918573498348125 +2625321593697864817 +7563081637033018620 +15056180748627358802 +14220611143314723014 +1007581998907147213 +16839565900633887819 +18388359984746212949 +7550321004573966054 +1730571989786909236 +279446297018 +4075478628209279401 +18171122603320286936 +11171834454139940172 +5533048425601441552 +17193907404979777051 +232154469329 +17232007031295450523 +4201418146224692428 +2392267112159645548 +14086695982290721994 +10504814416598927327 +15292499534361931478 +4864887511235381834 +18895601982637667 +4644563108626631009 +4397798342303616759 +60227983 +5303047026657137833 +6313103561496791450 +177903190204312934 +253550495519036547 +9870724570745030 +7935808760372342670 +10247753748507466622 +9192337905551500763 +5356297014005556999 +9293468489290628036 +4355675234254400152 +640476701001665290 +6471725260172231870 +417019855960 +15289397319538521193 +15293063541372304679 +2063913154410653305 +8313711534999675247 +9117773152619284794 +7408330038555005254 +11331286578391820076 +15597828 +15287141205513022947 +1721078891680505320 +9786693399294578831 +6584302816815089825 +4074350528204517519 +5577817044133294648 +14646826529026751791 +6304798526084244715 +1825711576300657317 +9870726058963177 +9870724633740304 +7719325777356068270 +16292456432774225517 +15293345557774677681 +9870725108822060 +11863483720121005269 +3599049430589717196 +2624757573789697611 +10163069590560394282 +14418825966126506780 +1873618527730471470 +16744553067770298734 +6896074995795504076 +1043117297223167166 +5459976691403654584 +11527038999612888206 +14124807558179723831 +7574666347780388861 +1782984231895050969 +9870724589121126 +3794911047491870352 +6883252547457534640 +4184798620762392599 +1252168767630431056 +18008952305986046279 +17571669445032358778 +4955573327226348772 +94292484802623625 +11198685041863907989 +5744056820131125378 +1873618471842759711 +1410790466305853323 +2032087474397394931 +15402324893572674534 +15128388696816371354 +10960483463753895477 +30458222903562421 +12327358852314116091 +10908004533710701115 +16867553903807830051 +1988144590291738381 +9805745288996462654 +12063217690309170904 +571999061 +5373664842195804966 +1996539656478534414 +1413892651035943170 +15291935458566031478 +17762501981187434139 +15292781537866500948 +16640091504054722680 +20869630820226453 +31868356506237619 +13772155712447139648 +15287141239907037684 +17172592526733359760 +8731438678757953940 +1128779746327682657 +16741664166221601608 +14042296469551081354 +10993937256849610444 +13944144538013875335 +6766227450202055116 +8347710256694710934 +4128728546772151254 +3615988824375956272 +356830232817 +2392267043374111041 +21151647222606369 +8100978763097004229 +3096164546429085306 +10389628081779906970 +12220809616918988373 +1945545873437377692 +1873618321371380039 +1735648302232202210 +1733392188206698770 +2509417099812673493 +6828603339019334705 +1873618514832657292 +5490717353904190019 +10157982289092097300 +1416148782256960664 +6020446389059071094 +7667902 +9780473073946027790 +5566476507033200929 +933515215180229002 +316178999321715998 +14515217839608783789 +7972269686945947248 +571813020932193151 +9870724625821375 +18045759913419748971 +300942519297 +2422447545124013953 +10645348200073156252 +9870725100892169 +14986955239351847842 +11294267013763902334 +10583135657171819167 +882239415736688914 +7002831808824103439 +5152193635248580091 +18331569176658428 +9299531631079926376 +9386257335747744774 +1873618458944931675 +1691470668188044801 +545719090 +15291371438657853104 +70648289 +15591448436321301797 +1495860210 +6143319069583152655 +4445946672738010859 +1382240736443900810 +11527038930827352151 +4127600472561764386 +6378131479490479885 +10874253126464311775 +15292499508566297469 +4504298192327174990 +10913926882466537151 +13174660965460689731 +16294361197781732701 +17635684657385069453 +3702447048594302989 +1730170804028259337 +18289406795518000238 +12341216666987344692 +7883829554400082951 +10144621227369130421 +6875872028473770920 +3967850721173394520 +18163483151937517626 +17901643502824008861 +10798321639179162230 +14431204815269022723 +2157417529367881646 +11404118041703748582 +825887278052229649 +14282027259104473148 +15804890104624863833 +15291089465245376776 +5277452079515843532 +5415128062743030330 +453534040887277814 +772613581792634008 +10668984860718406775 +11846258720012570356 +17177069327929397282 +9398797425561721056 +16578628686914277401 +1573834047912424887 +13580718560191260720 +15287141171121499051 +2147544240122500939 +15471008585987935286 +4502324038816328682 +2625321602296252770 +7731877960143737338 +1574206486818609618 +149234553370527646 +16885944403374463456 +288044699528 +16960155082629864028 +9932185568725978156 +832091729191527598 +5567604637130042666 +2548891158697422945 +1686164359680898385 +12221937665333737926 +240752857851 +13222096480399396057 +17093856879335131394 +17321554377899061794 +6783922830284051068 +2074482050684705704 +11958569832164051495 +7397691548991756890 +6130817471599045739 +279448782049 +15289115311734536421 +2930525528428063155 +1873618398755316326 +16666967011313717809 +6406389097441592980 +4173517822785052745 +5195701200510977145 +9335705058280675605 +9870724725501840 +5162541778422549199 +1436146480184964153 +17256155750176869674 +5202734322665524897 +15290525445337202572 +8942722822241325749 +6154199872212897041 +17666866394782260558 +9206049446989405900 +62718382 +10443830452258760209 +5887800003173225451 +4447100044126546120 +13087443521783421475 +4967913279473273193 +1937047112788294442 +3418202265617249533 +8092838336437358919 +15291089452347575169 +4736619782198878626 +13217980679450926115 +6978558332220750418 +17428161912920479383 +493159123 +1873618536328868373 +336246261880722047 +8643498379519212710 +3711115253285600578 +1624918257758061946 +1550910461 +15946746021208083597 +9373330690077689939 +5512098570150168393 +14478830953307512534 +815989668 +933797253078782725 +4393850073973663795 +13355408513042684749 +2880129344002473074 +15139848467400582669 +5885825849662401600 +16507208394761387762 +13727478616135047015 +8788183327370983594 +935489377289458780 +16112245313717741763 +16857050461455995520 +4661227814082512385 +5609355253454759159 +361388169815662535 +1508117033992663938 +1461650414 +1178564838795132844 +1996539665076928074 +1873618385857487815 +15292781546464890182 +4131033753093681348 +101487200860401081 +1735930357326309219 +9870724654591759 +4449356119459844595 +3205275677406342089 +12018998408246798357 +1597022946175430077 +14141539218070584835 +17172018977567749505 +13041267244531200477 +9358603280051814483 +19459604693586959 +15288269318413890101 +8810313685543760319 +365428606574 +6378421771660766360 +11862930706432604862 +5462796864027835295 +13563403359923689299 +9940375093616053431 +5249797099496672683 +4074350523905098322 +15294191680067550132 +15290243360149277503 +19741427634686016 +7595953279436985539 +10142647151242209270 +1873618329969775177 +17630879359421331935 +18367691563416888024 +11214563466575480865 +6157380795525850878 +9870724717571952 +6380959902088643082 +5890488336741058027 +11687699887225180298 +11182322173924235475 +3480578188828568397 +9870724565331424 +162398863 +9581494030986392293 +14506997104484028992 +17396614503441971032 +11312848915089147108 +5993604007128811436 +18413109988782047308 +4448228092541292520 +9821827609675588288 +8718869729480232740 +4354547203036431570 +2329434378204692004 +4149345847361675449 +17620986833073014515 +27356106960289709 +11841014716146346304 +4466761596446327671 +6747869491765125417 +1637210151409708079 +18272015762899229145 +1873618467543321286 +10440328872292254866 +6460543990695867812 +13043000530075211652 +1519546477645485057 +14997188238208021557 +4127600481160149768 +1628020382298482886 +6013889958159215548 +18103555412365952874 +3387142657418800750 +16579096809208684533 +1005889947780978292 +14383042898062351 +16880857114802740909 +880547317319952599 +6619090118045295188 +1266112799701417626 +894336773592335453 +2159391588297561108 +15289397349633102663 +8610102806501535820 +2200794145787551650 +8037879886770421242 +15292781533567070578 +3478604035317702391 +18377832136810441477 +3363347686781762332 +15287141235607615604 +9870724583681606 +8326286517935867839 +4024766818578870108 +2419714185645139436 +15971920874548505738 +13134019694214276423 +13572989546394492988 +6152225796085981133 +2082619570092846862 +935489308503913935 +9870725381583025 +18613465203500751 +5944302301006475366 +6151097678885690070 +17516169188842410495 +2771306499198555792 +8328513465440681080 +9229891721004010667 +96809633337582175 +13574101629264671554 +10927490846285834193 +2219137196199645997 +1873618317071953024 +1464040419261488173 +2879244178074778343 +17665625649697809433 +2572415600398253229 +1705645617785756088 +126630728574118985 +15290525363653854129 +339083058007923650 +11176546812336164785 +11508394745026463819 +2625321610894640833 +830117541289146261 +91488775 +9870726869774627 +17626345367404296006 +9870724602031732 +9870725077102562 +11053788222162476616 +15291089417956048253 +1518136331144996448 +2652485274356286816 +2076635108564098599 +15291935497256513523 +2643887743696909688 +13898977762541585580 +1416430794359916009 +13951205954302051853 +16888775577921933775 +970508996187864060 +9130770121003904402 +154468975 +6215641145024593938 +366142951675875075 +3186488476490139978 +15218444600033946602 +1133620930477295468 +14108828808151326922 +17463285352893915695 +17325502624733602437 +14290466123268188537 +13314312620076373376 +15292781567961080570 +311384720475557311 +15291935441368781219 +2228331 +398329050703599473 +11631533298290659029 +9030446003504892542 +1895398083715156150 +1893141969689659961 +11517440269816977650 +9057910677280413604 +15287423213317793277 +2956040213288277716 +16409823259361307938 +17542466454213577962 +8275768855680281880 +11965138075391503454 +22279747225658257 +6151097665987881059 +15289961343745662615 +1873618351465982237 +8523823799148433631 +1873618544927256865 +17092397984520874871 +5144036663261072615 +15288833346920455222 +3862478876572999081 +14821223763399481284 +8259442065294042343 +7862516837036478252 +12899995919504205433 +7386379944371966158 +5893683338815561993 +7027696421278657307 +15288269284022357372 +22561763628047158 +17955748244558593568 +2625321597996829544 +15880411694932303227 +4025888122525860351 +32432337723461001 +1731418120678170115 +18223744768924409206 +21997580351922343 +6153071806600916932 +19459475718427019 +11110494887593924409 +236453432350 +4770547828131824981 +818480058 +5458243702509229475 +1464040350475956476 +18411417903263121427 +11523184425139055119 +12238500373483824256 +13708672584660690994 +10881199454835454651 +18349862087501945885 +1873618394455891327 +3653991383082757263 +2031531694769923198 +3383183339877919607 +932669208964257635 +6474898267999972866 +12578234003375212152 +1795508866302889524 +6362646432234288323 +9622122612430028236 +6314795690006437398 +513999587 +7751747450592914661 +7532645307890426495 +4183106500850699908 +1844192903132376226 +11970874915199467159 +1873618338568160504 +17214208508761740798 +15291089448048139733 +23407851528130935 +2624757578088658336 +4451048278063258837 +6351857449238027310 +13244896955905366309 +10194769029988706612 +8484110763039333638 +14813034205606058676 +525102972357010627 +576979807 +4684749297968375338 +6699693882226582686 +10671334559102736086 +6231190056761507476 +1038887016790246789 +15290807375758039405 +3968978765288715088 +15872788267758849077 +14665097992167528 +252484511216003410 +17388608885738978115 +12477568711375610628 +8670233195164150278 +4075478619610443103 +8105625634488544330 +15288833278134926738 +464308734399 +9870724567798202 +1873618476141710425 +9463782654416267878 +6154763844830505872 +5886953962563249325 +1873618235388608510 +16892159783352098432 +7403331877045811855 +23689812042787917 +15291371408562802633 +13322381941750499717 +634374056970185287 +10266892278841105165 +9907225968885974343 +5335323699873802076 +880547325918339969 +12648675 +9808823553121141342 +3702447065791088477 +31022281504720056 +6151487779838124045 +10558807042125277175 +10885643415219871618 +2624193798933583345 +1898722222293588966 +17998986804592204732 +28752630854408699 +9731164704471977457 +13817957860077427089 +6208295848581274262 +7806840149456263505 +1531985421723920826 +2000487899013646903 +16629762695496164487 +13066480743457447775 +18318407404392095938 +9414753872044517546 +3241533047597327496 +9870724586171991 +15992827209953257500 +4199805580057526865 +2905062052441708673 +15234172731342219607 +18412827968080248897 +1823671323 +2676033356038473537 +16704189977091335369 +9870726809284898 +1868611368115198897 +15059564958356494677 +15498676197682722346 +16862372109329388273 +3354355623869884543 +2544766567488424310 +4094847807739873648 +5373100800792210488 +15287705195328656875 +16903329689834500099 +18613370622323044 +11748150913867605009 +12551718261818273758 +6672998155670528601 +18331573475621585 +11775490430039497520 +22561729236520616 +7053081520504378531 +5995296127040038262 +3205194910044024101 +2401985079329052885 +9870725079592940 +15287987211731016314 +2275024116832822806 +2903799416574917983 +16696307577298039628 +1997667691996733751 +4772239853463614201 +12665026980406502850 +6081426295899579181 +3602002394967518580 +1731418038994818906 +14280399715628565410 +11867724955186176508 +2940620807729340732 +6582516930419053955 +5462796894122411284 +6208295835683456476 +923505340445301771 +10585885967639453182 +9671153089989600379 +5048105193443247289 +16075162809292445 +2734792040810830493 +1174110314240829415 +471134570744057825 +5354604932785580229 +1172434974807693204 +5154543567838468618 +15293627574177841362 +7239633818635733091 +4718737 +10927271592001356595 +17639068837022089294 +17419818910382754661 +2322094241237638633 +10916990529318691594 +9870724622872220 +15087607024163431612 +14712930642215591505 +9004928434162394483 +23689889426704296 +6243932746435206797 +5825995788685746009 +11852192083586604015 +4287350262643114992 +2625321606595217579 +6762882767550046493 +10198717242429216702 +8693279061282727802 +9870724578216632 +15291089413656627642 +2130264285041075231 +7861398105913435208 +9515351529545545345 +1001275971615526650 +282919615 +2960542591583591623 +245051823413 +9569729513719163052 +5832739136815454699 +18014085520479956978 +17203579194279013187 +828143439366608464 +23068994 +5190967215736633822 +3808100870904434582 +3493395569588193821 +12541491074063219086 +15218444595734523235 +2807316373451052105 +17325759479524774124 +18266078030861646110 +5570988816767066183 +6829167328834955136 +1198918823272734932 +5111714948189539450 +1996539682273708500 +15118667592044648714 +13352809046639646120 +15292781563661659827 +9402235489654033185 +12164227728125071263 +11820958803366848740 +16857050431360935676 +4961410512965947838 +1623790200744460867 +7036226056540266870 +4950735675669758188 +1730290029271790421 +3760491246002841619 +16217390188924311974 +468613142834 +5847102830955857465 +6829731335845337105 +15290243377346072807 +8936416115184382219 +13327266346497565623 +1873618347166548169 +14202477166402821072 +17841250302039963441 +5826194972143215789 +8929602373766890768 +12427570770053775104 +23126363914654899 +32714405714148503 +15290525393748442146 +11942088260904315515 +9868375279139439747 +1440671446449589035 +103743349278201736 +6206321690772243584 +16881311723980129501 +2773898507855730822 +326737659857 +4558958128416561049 +2691363941378637794 +18306023692144689391 +15291935527351097408 +5529421996771663328 +9953124464935190310 +8552319687958336795 +7933976799504643326 +104399431 +5354604864000047226 +23407804238809316 +14540326730592311392 +14361324507276975407 +13465349807040902709 +9809105634009619256 +1873618484740100786 +215388418859683078 +8954142712877763722 +2529611247666011784 +962239532943806831 +4391823033678841592 +8818864656040146741 +11408348231855703653 +7659538298168023168 +32150286928321954 +5942097688818555270 +3861350845355020543 +9654948979479691123 +17763658812959973216 +9870724570285675 +15292217462071374877 +2493017496378677265 +17483560324995827347 +3490293389158786157 +417019398489 +10007142456191629377 +15293063541371840028 +2624475557386873931 +21997713626051377 +15139069 +5568633497721460669 +14594554080759137103 +119263690596507754 +9870724633292521 +9870725108342521 +14643390096582848902 +7410122287450832442 +16588826715129933237 +13559180624084811150 +16642718724439561201 +7867619042724821096 +6612442490840626009 +11780652330017963904 +5280494174116539795 +6794048421009960818 +1873618527730012239 +8075071868901140758 +2796071129848161847 +15325213428476306098 +17092164780919639693 +15838947786607322251 +14424533027378239913 +5458882159124169570 +5991347897402267328 +12333122794499096967 +3649479120638973428 +7572974167681557752 +16394840708417010554 +7757239427639878463 +1773865980548373742 +1873618471842301728 +14659363209701641626 +15289115337529712986 +17620704765081894825 +342168559047829815 +3122021052832888790 +7880488278793283250 +16429283220471814996 +13880529192106527090 +14383047197025175 +15291935458565559070 +3879724318637691744 +17753736439300385814 +1522648593588311249 +15248745854015655700 +9870725082083323 +7217242499843362455 +1104480633808826111 +15290807461740359643 +18613516794268696 +3431263071857826660 +8517540009498588831 +11527067173424818431 +12877339478002837304 +9870724822233014 +4128728546771681195 +6972429452752394274 +18412545947378450486 +12133908888583014197 +20023456935655869 +1041707150722208420 +4277713720516614984 +21997653436416323 +18115296894471114713 +3652299331956597297 +1144540830501986309 +1584661506 +5945831503885250918 +2239872160221719596 +3708087423938480643 +2676033351739049517 +7209143 +11640209691602217010 +4820977591266060718 +10454316937470029806 +17437776287605082122 +9870724625362617 +8211561438808266916 +5245848942943410700 +4527848932273827690 +494403323033 +15289397396921984168 +11092808190891527547 +2783943580416568415 +23407778443186268 +12610121755009558023 +15292217492163467490 +7065794724387509631 +1873618458944474091 +1944417820723983034 +545260331 +6368045630064243503 +5726358123273082473 +7979696626685142949 +5142583000630177646 +70189530 +5831598133116083447 +2413245893290046977 +9870724580732472 +306888584587319070 +1172865198132708385 +11124082762859154482 +14107087945230466957 +15289397341034268815 +17063697102470777209 +7429633607275996625 +3220426571717094979 +8842231090744474992 +2428936992199564070 +2893509029140760671 +17939922298746855655 +15497637354033539201 +8930986418384079868 +17348946155678423522 +17922294894359505936 +343931953504 +1873618355764941468 +11490081257974859839 +17762008144299308722 +11150907283340792756 +14240188304476356444 +13074753287084195534 +17204477474387535108 +4400618428947500690 +15290807392954816465 +13614115066376564150 +5199085482290645376 +1840738130428059684 +5302201011842337729 +15288269288321344602 +10547506079276551060 +4837716455033683873 +14347147217487160452 +518980348 +15293345523382702563 +23125822229189908 +18001510391656240899 +5924864230789162430 +232710822722868578 +7871853531784418930 +3451407152297750707 +5247593352907982888 +9870724662062898 +1410790487801603792 +259130038 +6700459465054573507 +4227739705024253484 +18361311246747907256 +12957276696313949019 +1912255148622884749 +2625039555800085247 +18065758305837332945 +20305598013786425 +15290243428934369982 +279448324634 +18371639724268654827 +15325495410487153432 +10623016643070084307 +10883543756136932440 +4552701118200163362 +425617786716 +9254471215912985414 +17619012679562963251 +15082326268366820691 +1992024743372211803 +62259623 +4160546838840674266 +38835477929084702 +6098975787240933883 +28202074486106195 +17554608171616120161 +4292990564902784035 +6290220139589950089 +9046833027355709498 +11741389830393965990 +2325192589248586345 +1990332636357069057 +20305494834226582 +4090501476151797307 +3542979274915653821 +12734096602877420241 +17629469 +8447694357264609229 +14015691446702121750 +5893456428412250170 +16776825159716841899 +6595965208155015253 +1197790792054756993 +9870724635782915 +4184798629360316707 +4025894858394784742 +15257142807793778075 +7082788275412489364 +147027456461450640 +3648351132412173220 +15287705212525431217 +10889818644871524197 +1398211555 +3220231382606242600 +15288551291825904533 +7990307593692923587 +6156456029227867668 +11333596236464347974 +1916252573728330129 +1466296576277695124 +1873618239687581578 +1039733018707577286 +15287987228927813522 +9511403265516260968 +5249797155383941004 +5831974351218220436 +18156084122812833440 +7488276713951554741 +1813273559215199398 +14741878271948109298 +9592459637008585428 +16057173488429065442 +9870725971734748 +12385798487652111907 +16050758264005353582 +8629585131993779164 +9870724654133004 +17012439662870679363 +15292217457771965819 +145335375240697550 +5998595681496094434 +8286625167626751022 +1746055167172762876 +63936358548915883 +15287423239112958628 +5835546345556633341 +7501157356506460149 +9236270323893557029 +6044246427979694162 +8093823000016019548 +7073548376776659057 +98959914 +13491187753482786533 +7042167067572967586 +12593841123448547387 +9870724717113196 +1873618329969309105 +22561789423197328 +22843780031207391 +1494902005971823858 +6066195885896116289 +356832249381 +161940107 +17786419758769778326 +1873619017826712547 +339483261160201857 +4021100626837967788 +11837009089245419674 +6860750646797675979 +14824583848163281869 +2927048573586383629 +14101026495218622 +1873618467542864860 +8703243700482032264 +9566893560642217630 +4127600481159703948 +8021450341214588326 +3648384168589093837 +2730129611851716986 +14383042897579063 +5523113376228076999 +17377223503468574255 +9870726375895308 +8196828602144219359 +15290807457440933801 +27638041680086900 +12931665209779621685 +12302836948232066144 +9870726958575909 +4682429100741569717 +14402437763483114667 +6208295839982428848 +16392223356658343845 +4452740363581725070 +17810613830376494466 +17155432341771276888 +4085427941984069833 +15289115277342564144 +11244005124248660313 +5152757642260988901 +512618781286210245 +4317033299479760961 +3646692087368326639 +1631882651478526261 +11450314238301772866 +4660099748471332008 +15290525410945220435 +10616330897218299648 +5778348197355986328 +1413892590848335271 +6349026413187512806 +18216242462684558737 +1044809331152868990 +2625321610894182276 +5581577184882668594 +16897312575039365283 +5513358436124594182 +17639903874238453187 +17801085794638043484 +3599049404796119517 +2200429374859392629 +405128873075756207 +10300242491636987489 +2659583264973935236 +1399021262405059456 +18063174898316287938 +8335349732817190648 +1945545813249763732 +2785415309041207732 +9870725874544841 +6766783649575677905 +12121182403200370850 +288046714075 +9512531356920920709 +18434411593877903294 +5728050170101042618 +154010219 +14024884520280021174 +14882607364446578287 +12602214319606346836 +16252369836876653106 +7146883279137157974 +28484155374571000 +16484767916133650050 +12828601821883289614 +15483798300640760670 +17458259031540852597 +434216187612 +9407311729014360401 +9378351519231978409 +16490071150681739858 +17946137665827905393 +7837634943338155161 +1518418412034277294 +16727456288833023112 +24535861250699044 +1873618351465518650 +5405598724426371918 +9744694614536767628 +4636364816263092316 +3542979283514050639 +15665492572493588771 +1873618544926802788 +12524340376691679486 +10019409906898120092 +9870724575292944 +9511403330002369775 +15290807388655400269 +21433573341081159 +2218221785259525221 +13124892570595902488 +14227617593978547670 +17319569334242399888 +9870725373194359 +4080272851166783545 +9386257365841889591 +5243108696682924272 +17352565201769683592 +1413046597527668667 +5526448520225898906 +13488970912136115594 +7253474664903096368 +2015476065191935236 +18075715645798366196 +1873618489039064439 +703626369649895494 +14591994617252436863 +14424532988687311565 +703604360035717227 +8900822134279793199 +565460473840217983 +3679468563286987928 +9126257806971393589 +15288269228134178845 +8876352433707363365 +1438426486322380898 +16441129845655090874 +9870725068713942 +9870724593643117 +11700344903086704893 +15287141257103362810 +3705831262622401503 +6754579386133007625 +13167848120190773542 +15292781555062827323 +8755449666619317630 +12708454043691200942 +18613533991070472 +8728730813013699655 +6992497718636470395 +3865299087890134428 +4147422693257785871 +15344331928744697661 +9570637613959171018 +983011210292044363 +15638354358303543276 +17165280839278018349 +9254753202221559873 +4662073820298829407 +5353476841380457446 +11694815752093314007 +2200512120787569683 +11776935404486617658 +1873618338567701540 +6329175104747751869 +5411573444917201071 +24535801061066180 +12776890112178399758 +10420287313124934898 +101450287 +5516892784509281648 +10601803635978414555 +4610722469556850149 +6995388121444533262 +7731877990237883849 +6306366688314267081 +6362646376346100902 +8211561456005046891 +9198943117821037780 +174343700774853123 +7159004684314364225 +8506328490655759032 +285938472240948611 +4129856577989199605 +15280372691472244965 +12455166248072851358 +1575898520748315637 +15338888817350954534 +4927458967308285355 +11904574145983436550 +2253578163290650117 +14101035093614634 +1873618476141253359 +1784676360404213781 +164430493 +9870724567336570 +1873618235388145340 +309542937364 +5940757113192997826 +1998795822094368032 +15228101343791109634 +4557764151812827557 +1467988623105671983 +2537811731486553466 +5567604611336461552 +12189916 +17171464461123402236 +6011895748734497620 +21433698016847008 +1041143148010811268 +6218953989384976215 +214959282595 +2528053666091388583 +4982278684596395097 +14107087915135404740 +1578847559785729105 +17867767375493404844 +5509953546228607409 +6314795677108155420 +4518267903209657183 +9870724845563835 +1256819679640115513 +4127600433870351604 +9870726378385678 +8975785994331308954 +6495787104032732774 +13393719741987688400 +1585891583597430761 +1335101624596911650 +17376818440481365828 +4288478246571288424 +9870724585713236 +16389575380473229739 +16203072963701188732 +7536662675168837191 +1254142856654231286 +930746182877469691 +933515266770549948 +5436516692071890882 +10906513561824594910 +2676033356038014277 +9273104017923968861 +1943289763710390898 +7963688554976906917 +30540122 +987047124351871917 +4079990808968779559 +9870725383614654 +16800446660977438806 +5574057256786155597 +16936549352757611947 +7882691051429050251 +16780170146917326081 +15294191619879949715 +305241025045 +15287705195328183995 +8872404216967415322 +16916327697533962956 +20023598808174445 +12762680273203509709 +12555384483651591210 +1734238263209782530 +9637400212267013161 +14445435251243299723 +5525933548852234122 +7192110592924982455 +5995296127039577632 +15320431184458823934 +10405394452257190426 +16801826380784224952 +2195247887786984705 +10720663471050670538 +260967832919548332 +17104877509986708154 +18344667468539254929 +1526913204997016046 +15684162590040729498 +5835546375651221836 +1731418038994349405 +8512074411788496288 +12859808742850838999 +15293063567167016468 +17265262617058282975 +13655523387674615751 +5368306526245039708 +3595101218148265596 +1252732757445586037 +9671153089989138666 +9870724667043653 +3478886094712016427 +13221120945827219803 +3073618219575624233 +8597156797830206431 +2109187656261915541 +16380751080743002251 +1839046010516345710 +2334107608027506234 +4454707703841762779 +15290243390243411895 +1873618360063899888 +4279895118 +4927877544240421559 +15291089469543881347 +12611531837023481272 +4259978 +17998422728795834662 +4180850408320933544 +14598969639850811647 +10430737389551487761 +20023641798084435 +12758839919642894241 +8921240145136675724 +14012448395478241866 +205766573903845048 +5111126076477358238 +484094839936594480 +2151210492049176026 +3648351149608936426 +16204150621577038009 +16542141154387102177 +6409882689480632788 +10259028607374862719 +9870724577783334 +1325857314872577126 +3308118261904711369 +16749400052924827642 +17793886744813966275 +1734238250311952891 +4456039366425914789 +933515197985004862 +7954747830956413436 +18413674025886548065 +12253585582527235206 +30458248698274966 +12260276983464357314 +2625039560099049882 +17546994619366186283 +1943289694924860691 +4078298762142041766 +22610237 +5277943608069416597 +15218444595734069631 +4500631810714047950 +11707740264368708228 +4452458377273958160 +12618268146972584898 +6474545449992736919 +48603351437153297 +475082778886408323 +27356081166681957 +17940670128213666694 +14880882641964655328 +30740265100653477 +7242736020560881204 +10617176907735718446 +17194977454375581166 +11285990229533800052 +16737522532704265160 +7399947611428050718 +15289961386737620532 +2801821096146653267 +16355799337686734812 +5910191034109941419 +17053693683486778692 +6206603763061898149 +1414738700243383837 +17520489484745469182 +7048838616757248258 +1842148156554235585 +6925538300593190212 +15454994402857262998 +6813637092450786337 +12919717766737844892 +21715680027689498 +374029034049 +5340331841180623316 +7625812300225138510 +829835507689076180 +70488873850853183 +5860940436049782890 +386244926957119727 +3595101149362735047 +6993177427268158617 +887690377829105309 +21997623343864986 +7746405201715877389 +14191903130603295771 +103940672 +17299513133793348673 +12579117828039190562 +15050290997665076468 +10246365349637468823 +2224809543405224108 +1734238237414145883 +605557034314828631 +1873618243986541409 +16661323560998482506 +11422235346247430776 +10874535142867035898 +8486327009906801341 +9870724569826462 +13410742767630948500 +5822772555246494299 +6994602712723562534 +9199725758036927552 +5155859826989339171 +1201738978702151998 +2906754168054761605 +12749251397817411148 +7311508065872407975 +13212806412786358122 +15361476273384277003 +10280579090808378624 +14295407460658532732 +3277505925756569337 +4609105892345194600 +14680310 +9821971278804772127 +11740202408459643555 +617111751978134904 +6205475680255624049 +3652299344853944197 +9870725107904550 +1803322465943575988 +2316900357241909212 +12919891975848618680 +6441960298881699926 +812581780 +6122269957538386088 +4767727591020628301 +1572796379010657003 +2804495565992972727 +1043117297222239387 +12968618617149549956 +4520361233500622973 +617000559100830819 +15112016058677994418 +5924948211986867598 +5133829485924779401 +1710108824422457927 +14318009435748259119 +9870727071166766 +13819014391804792 +14561685619439463739 +3754574152170300721 +1881294612915292853 +17944445614701761122 +15288833321126873511 +18271599167641487963 +15287705203926579430 +1684594439441834323 +14500499194424731893 +6368045642961603814 +17426678074005920701 +14101030794187912 +1731982157782670984 +1848853752329029002 +5831598146013448631 +4435561781392909233 +1991460714865167155 +11966722661119888545 +12947857451207430246 +1803181542484679071 +13237708535585570818 +8194489483615364103 +1987512394946923234 +9226507597256279090 +4791893803070135695 +16476111498026888838 +6153071780807315530 +8645295954768247712 +15291935458565104685 +96010773 +6311975551772864688 +5677488692584514734 +1730290050767536287 +2860413479181295809 +15290807461739901243 +16572875086188983163 +12562453432512743836 +11444047968489458676 +9302231339463754425 +5851982650044147398 +2325946518107143545 +5195701170417970901 +1975195074046267935 +1873618368662284245 +2058903042498053975 +6670972835324713233 +12769623874203027091 +1735648302231283136 +14504740908775990760 +13345741009825313099 +18056021728406432936 +15288269301218674108 +15293909599178156550 +6649204666000757957 +11231612236763041706 +6060555579337822710 +6750384 +920884295852110637 +11242798885672086963 +10642732305868141471 +12972295823706898288 +10731794799235000586 +9870724624891081 +3284721633267421239 +1873618506235843469 +12949541077301350036 +15291370832251802209 +11667100445717181320 +5745004177223655325 +544801575 +69730775 +5875369269012203157 +13571672302948787565 +6043037466324245417 +9808823583215274609 +2781470259931789054 +3648351102319611482 +6655536885515705638 +1996539690871646570 +2686971790050919863 +2436814428303925946 +6817864677481911186 +10743598362790161569 +1870471690219824449 +6670467851840415144 +4585686704215319466 +16040186186740348829 +16644906232966621240 +9924458053698474604 +7572519555016311525 +1625764251077787204 +1731982088997133933 +3653145419856230046 +16482746120876607453 +10125537471628396456 +16100173195167028845 +5344573059048999857 +5885976061401515137 +20023444037392012 +17341038768065424969 +12650561781710083992 +1873618549225755831 +5792160745190271957 +563151692 +15292781516371875500 +88080898 +195691169 +13863504229899587634 +14411699863145620783 +12352423059044390951 +14947330030372720841 +17307494337504231841 +5724666033455972941 +14732267094484332995 +6155045908522539617 +3932922014897081298 +32150351413983700 +6963620007220495265 +8911802252948879361 +5581588221197031185 +464997356536862066 +7562135700557801390 +18413392005184749654 +9870725871595717 +15293345523382234335 +5357989103823766669 +17643101977299740765 +10316345577685270003 +288043780557 +9870724661604141 +3052704905275191478 +11235855143634158308 +104307364886491457 +14750116422475734161 +12999620585941961275 +18037828666854171697 +14186130719135647339 +2467175488938056051 +15291371425759126320 +17884482978810903866 +2625039555799627287 +3591160524196219107 +14358396005675373279 +3556224020418733984 +6992594368464827997 +13936242085962526305 +10265882208408841861 +10760853579219884509 +17399624699606491978 +17624265259507126596 +9737446239852302376 +714746536627147992 +425617348652 +15287423252010316213 +8419202900288164064 +11385558835572253205 +61800865 +4703260119378773647 +6021581796670194612 +13854560992155293178 +3491703531359374171 +2522267832170516984 +12413569004659163888 +28202074485640089 +17297538988880889355 +2825613095624582514 +11876748939325818797 +9567595420478687393 +4450202203061308786 +15058563649293004485 +9899545279169587790 +14953813045747920905 +17170714 +1873618536327941672 +492241614 +28203003463607512 +14210765276151239544 +987047141548647545 +15287987284815063914 +9182360343276773629 +3391090891356328494 +13729279869712879462 +2830553358025633763 +17375405732369230493 +5672853414445932598 +982204588270491090 +984791027523146562 +9273103987828944317 +15133670850095836471 +15893065016634258357 +2861086850443914742 +6428362129366674335 +15287705212524968440 +5329684834211679081 +17390969192349124208 +4128728465087881340 +4129856582288170486 +1518418347547714060 +5508539191585232631 +32714392818354350 +4682447060572728568 +18019610811645900900 +6409380678150996910 +12659104974384545474 +1873618480440216958 +8472841529099112280 +762473640682740653 +14101039392581369 +12932441537891487686 +13581745210808224156 +1873618239687109341 +2946293147537331531 +8193706259984947878 +9824887415922504325 +16112245313716820387 +5301072946231120920 +6815044530650421118 +12318365723907537896 +340211896049356165 +15291935467163501321 +12237654311378426216 +882239381344237869 +2573543666008068511 +5787209973583652291 +16254754399600779048 +6366353544544853524 +12213481117926952067 +10165325721782985743 +17085569100310257882 +12895071421292046876 +15372961722038822231 +5299098848607995194 +10107920089263327577 +1982150117251832172 +18063175032920946418 +8520615461737490331 +3381022415305786113 +17952508192438245495 +6805164948989162262 +7717191120555616274 +15292499474173878097 +7098579219576472465 +98501157 +793559802510139060 +30740239307511159 +14322142954856338182 +9870724609044112 +15290243360148359553 +17804304315225163008 +9870725084114943 +10374099081297541754 +7462267818243928756 +19459596096788877 +18438369764282078496 +17628048184875429756 +12696749360493645144 +3545799430345077384 +10128683564021584003 +434654902054573379 +9456758062656543301 +15453620929460446086 +13819010092377422 +4381348995500493205 +12751507524739009261 +2731821718866387603 +7042167011684797991 +309539988139 +10296839827164966833 +13578406362162095490 +4143455761659941197 +15846041951231815234 +503001277846 +15288833316827456478 +1116095545244340451 +17754015701784270961 +3708651465341158267 +1873618467542403595 +4275101731089304859 +17572423294310507014 +17712533555446623060 +807142269 +4929214082307145552 +11532187032294017594 +1603375975111744767 +15895039144349470066 +2103571860712263279 +1732546160493595960 +15289397349632182266 +72221177 +15287141235606688274 +2578417049128293766 +9147045547702443591 +12189320918056839731 +15289115277342088135 +18895576188593540 +12462069872057985028 +3706395295427933589 +13271165719268362246 +1873618364362861718 +4935175925304406214 +1414738717440168287 +15289397293744474011 +12428471601026183995 +17256118128899614772 +399783013382497286 +11065533344214958574 +4447100009734087345 +11491231604091664557 +5991347927496394467 +10353864665750909480 +6223407511156832462 +7446990745058568325 +15812380118380861003 +1958135294232442591 +7410122261657232814 +4666917825444408291 +16504856831747894138 +2462547416396744683 +15264495807068327317 +829764558740660629 +1518136331144090280 +3762709802127331579 +1894834050909493640 +1873618501936418049 +5837238474067478018 +10758700382543555484 +6155045861233205495 +14531699947885696784 +10400073729292963845 +15292499551557802906 +2625039564398013553 +14471968470100362089 +288046272426 +4094847790544664898 +6921374708600411425 +153551462 +12608147700378373379 +3970106805104174317 +309604624463522871 +6998642568070128664 +4449356140955121908 +5356297031201404345 +1735930378821581896 +8977434561970064355 +6361518302136509416 +21715740214389618 +12976673671053274445 +18613546888412023 +1895398083714238559 +2624475815336285114 +2786112608104048159 +108921430 +811970500387813499 +31304323701802109 +5083563949734909604 +24535861250237283 +9048342905894167373 +11613217769128398363 +4591871055511557038 +1787488186071603638 +5405598724425934817 +1873618351465063294 +16594291209557399168 +6407362343787717583 +4504298132139088093 +14149071737186821577 +539362075 +16500250690393679718 +10305085813919855918 +1873618544926346213 +12498251711624252784 +5586100444948619983 +12644547818986626538 +6364097396127827248 +9870724574834186 +17627766168471809303 +5267721725906267679 +16836714054522452475 +13126450621707347103 +2308422095814945177 +12283967081926059599 +7587760856636987080 +15287141166821165876 +9034197821469762923 +4792792596480412501 +5683457046435421923 +7905730025831342431 +2120987217453057458 +9870725372735603 +16343974785363302897 +1254142826561692686 +1837917949204584830 +1873618489038604579 +897921275792271551 +1892295933378185902 +17060688321802149185 +1873618248285512735 +1785514032560749618 +12177965626896891752 +15288269228133719638 +14767711340018159572 +1775076736305019577 +18066207382028748450 +6929596297403000752 +5991347858710880600 +18271108150569809943 +1667319903300235992 +1628866448703964742 +6366353553143235674 +2609257766775636628 +9386257309953701993 +6958720923769593772 +17675072908219992255 +12959839509293385854 +100 +101 +102 diff --git a/morpheus/data/bert-base-uncased-hash.txt b/morpheus/data/bert-base-uncased-hash.txt index 49f6399c6e..ab39452c1e 100644 --- a/morpheus/data/bert-base-uncased-hash.txt +++ b/morpheus/data/bert-base-uncased-hash.txt @@ -1,3 +1,38159 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:137870d94ea1cc8d35e4cd6c54e34a2291bf04fe8b35f237172d5b89865d5970 -size 796289 +26899 +27424 +7630 +6426333292330182147 0 +13252223380055024646 3 +5882704289435550212 9 +6321733446031528961 13 +16925858182943808517 14 +11669328216917812739 19 +5294247126811358721 22 +11791736821652368900 23 +12420164637450604549 27 +2555997454944503811 32 +5716902217424485894 35 +3184543689580575236 41 +5057972979985167363 45 +7621090240282984453 48 +10769488495697926662 53 +9891471851593553928 59 +7137545520968866306 67 +11133724959355647494 69 +14072771761498798083 75 +11229796758348255746 78 +10335113958832701958 80 +12015445961309659137 86 +5618747999027884546 87 +14804906647292574210 89 +4820165439889075714 91 +13688091397368544263 93 +16727691607537650179 100 +3488276741999727623 103 +6549592276830752260 110 +1920877547099994117 114 +16919219496588141575 119 +6305645107967263236 126 +10223610973459260418 130 +8913976733358517252 132 +15451600598594003974 136 +16252953075098561032 142 +6721179465637834757 150 +11221601620145900547 155 +13772009590059881478 158 +11952054166836464641 164 +5024105062523116039 165 +80305976747165699 172 +7258347321137746433 175 +5207745526605648903 176 +15764334474362460165 183 +7167659783529683972 188 +1781924856142903297 192 +6483003943497432579 193 +15843420529897954822 196 +10297086720389824513 202 +13131638480309452807 203 +14352357448556621316 210 +5878913600417054210 214 +15526784816636028419 216 +9091544399317599748 219 +10022285235145996291 223 +13995005730165201923 226 +14722943734524530180 229 +0 233 +5067616113376457731 233 +13951706541326466565 236 +16055548874133586438 241 +11312108457032076803 247 +18422676475813979138 250 +1900195772270680065 252 +6189523574508932610 253 +18097268793121208838 255 +9136510235514968070 261 +3104742850847008263 267 +4644272126595231237 274 +6724757887078610949 279 +12324532576228292098 284 +6523739721561729539 286 +13430833055642459654 289 +490372734232114177 295 +5384129877931583493 296 +3009088101503092225 301 +17587270521132563973 302 +2626347126168326662 307 +15657892849951852033 313 +13832155776986180100 314 +11508832331290833412 318 +0 322 +15033439199502132738 322 +7488928688653514243 324 +13289501989904265221 327 +1916212743608814595 332 +13572159745003877893 335 +15891150425892429313 340 +14702614816445038085 341 +14451868528530935812 346 +9158604817422694915 350 +12775481447328799747 353 +16765860888389768195 356 +14376615941214208003 359 +14407639808019372036 362 +17874739812136390658 366 +17301460032903022086 368 +9970593990692114950 374 +525231183980692995 380 +15059282111668474884 383 +12597221157531372034 387 +16646174973902388738 389 +9586434007749190150 391 +3598500487112312323 397 +8562759221323868675 400 +657014946814650882 403 +585072415157096962 405 +17149635587492691458 407 +4239501041255794691 409 +2294837614232733703 412 +13106328552418381314 419 +16729704481229316099 421 +17519686381941948417 424 +3191300701099235334 425 +12941508227617193478 431 +8924089997979029508 437 +2744664364572510211 441 +2934860503477699589 444 +15242371855309170693 449 +12861770492732004353 454 +1389014634696207362 455 +14599652080344680449 457 +13486132183224466949 458 +16299959455619133956 463 +1519069526753240580 467 +1139379885805544451 471 +10768203322260688386 474 +15723645256550985731 476 +15633761988199396354 479 +16190609843472863750 481 +6786231518997771785 487 +11722302046053575684 496 +9033511331096652806 500 +16250254645335457284 506 +10634726718646778374 510 +5042757800274513410 516 +8843131134449980934 518 +7966740208874774533 524 +4894881673640152069 529 +5194086939775699459 534 +9792202071600377862 537 +10260299246555381762 543 +3102685076977950725 545 +7000376853595878914 550 +15026617722066242567 552 +10737246396982961159 559 +1948082124284899845 566 +4296479271603189253 571 +7050246988387796995 576 +12722077185813590530 579 +16858426088115699206 581 +13558030456457072646 587 +8618053981767513601 593 +8215847780886550533 594 +2925642555282742276 599 +661974359082484228 603 +4241334741238706179 607 +10092915943655558659 610 +3501830659164661762 613 +17013073919837351941 615 +11804259742756750339 620 +4142743752223275524 623 +7978151955415163394 627 +12615565359506564101 629 +14876464454585095684 634 +1683529562352187393 638 +17854328842724121601 639 +2606090101283456518 640 +0 646 +3971805999688107524 646 +6990184044903104514 650 +7514097107706976260 652 +7819083612851799043 656 +0 659 +10681158656393593346 659 +2017163397138182662 661 +768423759854007810 667 +908898440134372355 669 +7657728066545506308 672 +15146652204208737796 676 +16868335992482494983 680 +16843978430984844294 687 +18224820953156894213 693 +15719079816546418182 698 +5182770065360449541 704 +10900133776105949701 709 +14489431106924190213 714 +12370659184540575234 719 +7855124676665453061 721 +13222429099415022084 726 +867175602403893768 730 +16273231913943438339 738 +15759862269188520967 741 +7316128005750152707 748 +3035714763895333893 751 +5857790669120156674 756 +14011774454504369669 758 +7150973472529000964 763 +4673859569883164680 767 +12540355432246249987 775 +9717897176823090180 778 +2802226780594827271 782 +10576358356085021187 789 +13767557471536629252 792 +16320412434965818883 796 +14762159427532951045 799 +16615354009400996358 804 +13970381756506479618 810 +16781073946586622979 812 +7486783686975095811 815 +6078509027189458438 818 +3995303291068676099 824 +5479341439007691265 827 +446712389216697350 828 +16790735987035044355 834 +8921995217103058947 837 +1481170722727642116 840 +14299676522694716930 844 +2659981631401145857 846 +13207282269231305733 847 +12784214327203599363 852 +14326295248763372034 855 +6339319578237866499 857 +0 860 +12608466626091520005 860 +14859295773684641797 865 +11898197604931535874 870 +2229480581224846341 872 +5846738288335559174 877 +9725370168135339013 883 +15822781396954880007 888 +16811330747884838914 895 +17716322139895515651 897 +16464837151699347971 900 +3786904978463195140 903 +6410868577687720962 907 +2778812527153592838 909 +14693577102320505861 915 +1350861333873981444 920 +2814380518294236165 924 +12829930200630042627 929 +16628991282708512775 932 +12947026021130878467 939 +16097076187590628356 942 +15148070465872583689 946 +11108167369127673859 955 +3206892489716334085 958 +4539052088705190402 963 +1426834792105161221 965 +13477573437192034817 970 +515343112894934022 971 +5527450208917667332 977 +3496168618997501445 981 +2587910293229783553 986 +11073941369356080131 987 +8923292641230539781 990 +15568167072161299972 995 +16069902683897020420 999 +5007337386159242756 1003 +567322683033477635 1007 +4620543624975929863 1010 +15593294563512581124 1017 +10575605843301480966 1021 +13218611825122892802 1027 +12248496335302962181 1029 +3127864814801170434 1034 +16555666137680971782 1036 +13548718596655177220 1042 +7241193476337120258 1046 +5110772946702749698 1048 +4244854883984040454 1050 +10674166251929068553 1056 +7335410226609437186 1065 +3593013801595140611 1067 +3818743414064890369 1070 +6620653714823195652 1071 +6442170192171499013 1075 +466109424591569921 1080 +10640132951210823171 1081 +16849933183647582210 1084 +1390321302705893892 1086 +10233112304825031684 1090 +15654649187699535876 1094 +4149883982434627074 1098 +1533240967468427272 1100 +3966583984096898052 1108 +17942961652983470085 1112 +1270386354528913414 1117 +17079196523309549571 1123 +9760225674290530819 1126 +14059923870329421318 1129 +9155784716932255750 1135 +8869311198037689346 1141 +1056488718559348227 1143 +1213655809798914049 1146 +7899482766013468674 1147 +12288330156834369027 1149 +17748915623984675334 1152 +4374709304243351044 1158 +2767416676479964678 1162 +2589438947070202886 1168 +15587532835225317891 1174 +16281377795876531208 1177 +10416705134548249604 1185 +12313420780782854148 1189 +17660949463316398595 1193 +10832246261242997762 1196 +12629844666459314181 1198 +12857120880602286601 1203 +3028018613016745991 1212 +9528731255267963397 1219 +1879818258756829699 1224 +0 1227 +5431566929998911490 1227 +159439414612021252 1229 +13751851540102480901 1233 +11944466234328987142 1238 +10214833293063919107 1244 +3887693229018076166 1247 +15693692989774743557 1253 +17014193421416272900 1258 +2699633620722988549 1262 +5464437081641040900 1267 +6858703281250086918 1271 +15036555272160027651 1277 +8088003436408750085 1280 +11442555094569039873 1285 +12083357448873049604 1286 +14976866298017031682 1290 +12269039782296515587 1292 +2508430774663352325 1295 +8686432348604624388 1300 +5864749039411210246 1304 +15976948363161951746 1310 +4320021043786085382 1312 +8284330964861030919 1318 +13259654221051933699 1325 +17875972966501618181 1328 +2152571483841142790 1333 +6451519314511286276 1339 +6636526145072509444 1343 +14224839268501422601 1347 +2282597859443765252 1356 +9897934235283808258 1360 +11582194532885413891 1362 +4651481000249861123 1365 +3047659846477762565 1368 +10028568668399206406 1373 +12182931768673030659 1379 +1272797966832687109 1382 +15089356557931155975 1387 +727550366928133639 1394 +2554565515632464389 1401 +6018569371908769799 1406 +17842510414265811971 1413 +16250926204388772866 1416 +14440589335679961091 1418 +6855191469470948354 1421 +11832172336751508484 1423 +8862885948920285700 1427 +15819509080143538693 1431 +8923041754180962308 1436 +17241341699581580292 1440 +5203495341390798346 1444 +12400271948800936451 1454 +11279630064092023303 1457 +13193209893360081923 1464 +11203636975167751169 1467 +8003285106610345478 1468 +17667331114443752450 1474 +11972552597492848129 1476 +3110471011889501701 1477 +8075002536871550983 1482 +10969144201515075593 1489 +6765947162456009730 1498 +101688012168008711 1500 +3201380800712878597 1507 +18399050926384111113 1512 +16114864375189894147 1521 +9109310046762871811 1524 +3051915264036293123 1527 +11682241693401750022 1530 +2005348892863232514 1536 +18327273322054661 1538 +13751358064078701571 1543 +7815526944222482945 1546 +13039441235033142276 1547 +5067771148519478788 1551 +749260804632562693 1555 +9237737302805535236 1560 +9083203852933248514 1564 +8812721389971588101 1566 +8195949045747636742 1571 +9392435333497381380 1577 +17398353046914968580 1581 +15036378874633344514 1585 +8746181497070320131 1587 +4459539803873305096 1590 +12577494977199187461 1598 +4382666372083072520 1603 +3280719655021828101 1611 +4919275069972367366 1616 +11821310318612980232 1622 +8005555409001143813 1630 +12774245900612643332 1635 +7047859414521072644 1639 +16668202696522705411 1643 +8175997675260104196 1646 +15942058204444742661 1650 +14143271563385835522 1655 +7239104608150400002 1657 +4560489085061611526 1659 +6280536257690364419 1665 +16709623649144075269 1668 +6427332975643309570 1673 +11044101972524148741 1675 +12088102694654329857 1680 +4646951769725483525 1681 +7410759969433814021 1686 +17276822231988747778 1691 +2492484270882126856 1693 +3801823939177880068 1701 +221632636473062402 1705 +18053964916833802245 1707 +4056945733879777284 1712 +4421227014276165124 1716 +9867348206812785666 1720 +4807713101607659521 1722 +14699140115844216836 1723 +8078559737715617286 1727 +15735963478506342402 1733 +11756773399572305411 1735 +17110141827238231045 1738 +12953650364988399622 1743 +4491924571036606467 1749 +5396770535170365955 1752 +11193801764277815298 1755 +2589981738189681666 1757 +18431505823793643527 1759 +17743110746999235589 1766 +8677259333219075589 1771 +16340463414729404419 1776 +7257136655931194885 1779 +4472652040470576135 1784 +9363434809536914948 1791 +4332117071421900289 1795 +3143661989830900738 1796 +6708422027633293829 1798 +10565283271475392002 1803 +129394441281844739 1805 +2483490487411335169 1808 +12489677496978255878 1809 +5876131255345591300 1815 +18297641325726654978 1819 +4531243625021207046 1821 +1635260936383946756 1827 +11158325349069639687 1831 +4681402755756305923 1838 +12988344078407895556 1841 +7297462097538480131 1845 +684220432921229831 1848 +4142421143323227138 1855 +3272541225877128707 1857 +6528287690517290499 1860 +14534922689356315139 1863 +13954229503288240129 1866 +594389941800882690 1867 +240608957487626759 1869 +4670172616454630916 1876 +673923161847241218 1880 +10812535589892757507 1882 +12305183442511034372 1885 +16570523454599393284 1889 +14779987674320399876 1893 +14733330936736168452 1897 +15701301882780828164 1901 +13387698460960232969 1905 +16549827179501895684 1914 +16567284047029524997 1918 +6706936000812835847 1923 +10080883488432287234 1930 +12757036929000257028 1932 +1963962998123956742 1936 +2884572637564067334 1942 +15154987921734125059 1948 +16679408950232128004 1951 +1631757205957266945 1955 +14048121108876636675 1956 +4179539938369312259 1959 +4062549966120024071 1962 +4416860969221262338 1969 +12676363119812776963 1971 +15955662244151492611 1974 +4293953195579395587 1977 +2674001442605617674 1980 +8714878569108409349 1990 +15688651380501473794 1995 +4651195213970127362 1997 +15687195046097879045 1999 +10571267148295818755 2004 +18303570670697134594 2007 +5400532523045021189 2009 +5292135109118648325 2014 +1182887885429832705 2019 +2816716235090490371 2020 +9667066222839993859 2023 +8133340692439111685 2026 +5556894116812473858 2031 +10185084917225741315 2033 +1394825332357395459 2036 +1501604756314255365 2039 +1822866575613727750 2044 +13129179454169246215 2050 +4777123420496750594 2057 +13541010411943408643 2059 +2536575277995444229 2062 +15209073480087155719 2067 +6297655052913674245 2074 +10838741769150910978 2079 +13128743511326829066 2081 +16270488170221972999 2091 +6103317769293671939 2098 +14724451152311626756 2101 +7588213090223201794 2105 +18260746792928738306 2107 +14870829166659442182 2109 +6191818920231044098 2115 +14302022909615755270 2117 +6389252376897630728 2123 +14108480610565901827 2131 +17406712424018496001 2134 +3516583785684381698 2135 +3958106226617587715 2137 +3131584494079410693 2140 +4545044857015051268 2145 +770751167187638278 2149 +3023883610335126535 2155 +14885300700287925764 2162 +2132364466252832259 2166 +13222839489696433159 2169 +13208087868677074947 2176 +7338224996863848456 2179 +4468617446590723585 2187 +997164968732877314 2188 +7061146599067994626 2190 +14262443374421270018 2192 +9798893984939276295 2194 +9974572998445361153 2201 +4938098233158201860 2202 +16137774098575803396 2206 +8195768834704349698 2210 +771771027633210375 2212 +12365697972121405446 2219 +14282909170851132932 2225 +5326055097454662148 2229 +7381708680070147590 2233 +8937079261918675974 2239 +9420515725593300995 2245 +2641708104930865154 2248 +6420503186041208324 2250 +15769870327827568643 2254 +2782702211549438981 2257 +3393483206417815041 2262 +11610508459402009604 2263 +5800886563505937412 2267 +13596084878130674690 2271 +5260436378280988675 2273 +12705431953132085251 2276 +0 2279 +13705354589131200514 2279 +12778157200571917318 2281 +1914054198314532873 2287 +7264484455943856644 2296 +7164320967138175494 2300 +9074432163785500673 2306 +4496077812229171714 2307 +2921568697558924802 2309 +996506176798027781 2311 +9906247659718389762 2316 +18169855044293443075 2318 +12345390066536357893 2321 +17407381569639854599 2326 +318172619929459717 2333 +1421914787884342789 2338 +5669642289975079942 2343 +11453317155401127425 2349 +2223846582166448131 2350 +4746375431328524806 2353 +5073554277806979587 2359 +13425372529937893379 2362 +9583781359185620488 2365 +10957843772458450436 2373 +8650840443260095491 2377 +13124893756819419141 2380 +13021478960627926018 2385 +3147967660765405185 2387 +15485525601980818435 2388 +44617068728058883 2391 +9710250365947829254 2394 +5807682346348688900 2400 +6097839351096822789 2404 +4606003429894801413 2409 +13660466851733510659 2414 +11593659950924606980 2417 +4002154502295369731 2421 +1483934997030608899 2424 +1859582975833406979 2427 +10408179330505932293 2430 +10669827413055292417 2435 +18319140996776879619 2436 +4248800956988530178 2439 +13034710302652515330 2441 +17567170204152826882 2443 +6808321686469623299 2445 +0 2448 +5278230511099922948 2448 +0 2452 +3677386695877724163 2452 +15549552635287260163 2455 +3469683568807416837 2458 +2111641668923883522 2463 +11597509174240182790 2465 +17643417438962207748 2471 +1577800293959222275 2475 +3162480519718763013 2478 +13294740916254901250 2483 +1144270971717391363 2485 +18430194644964964354 2488 +2668093099027896321 2490 +9046491373366563334 2491 +9262170908936343555 2497 +14032729045064903683 2500 +4328258586841039362 2503 +9899817333988754434 2505 +11737440461396683271 2507 +310843349481358852 2514 +11436606379057555970 2518 +6475585618246676483 2520 +14211971945354923526 2523 +4800640263811384324 2529 +9208829891802484738 2533 +4749131371354527237 2535 +3878074741560406530 2540 +12320937426892220418 2542 +2403196546377150978 2544 +9612557625555031556 2546 +18375163939875341830 2550 +16728404996714006020 2556 +5595286118468500997 2560 +18310405305170792965 2565 +629720284662393859 2570 +7503195655604273158 2573 +5417432473131819523 2579 +6022351632963833353 2582 +10916777256257149447 2591 +16188254296793619976 2598 +12093473217692668935 2606 +47317406728581635 2613 +9246347702533580805 2616 +8481399952943458307 2621 +7662114992065801219 2624 +7916220850056535556 2627 +415760815290034178 2631 +10489087158983186945 2633 +6667599939280436227 2634 +13903585792683480069 2637 +3622528046861575172 2642 +1779761605919459841 2646 +5239265943237394434 2647 +7303184090149576194 2649 +5674897490957434882 2651 +18142505388502786563 2653 +1785520512066530820 2656 +17163573402472637447 2660 +8577953251087588357 2667 +2627199488914604039 2672 +9667659542900979204 2679 +1832544118120496643 2683 +11968223897681778697 2686 +6988139244023185926 2695 +10651557630955715587 2701 +627887148235765250 2704 +8294632043675624965 2706 +11323385820045546498 2711 +10837924186251084809 2713 +4375877852682798086 2722 +2222260781610711045 2728 +3653460420585890305 2733 +1052808742534564355 2734 +18107901428420213252 2737 +17761634308715357700 2741 +7005371189337602562 2745 +1494197173987885060 2747 +12149989573599746567 2751 +2046851030016993286 2758 +7314186342491059716 2764 +4090920723329870341 2768 +8824342285732235267 2773 +18446628766570103810 2776 +12991720394130304515 2778 +14826244211091149322 2781 +11169916046146884100 2791 +14638360680200871941 2795 +3319502201252583428 2800 +11847779787912283137 2804 +5834933662075077636 2805 +15424377650738226178 2809 +154049585915194371 2811 +7770978261391877121 2814 +6508287593618445316 2815 +2600306311043968516 2819 +14779543465517041671 2823 +3553262932008185860 2830 +1852774153035668996 2834 +11483905303460638724 2838 +13032812395431478277 2842 +11867551461205322243 2847 +15115461448934821380 2850 +8719349022002446339 2854 +13078729396456143879 2857 +16568711797883062281 2864 +4656892212568932870 2873 +3925069196148849155 2879 +0 2882 +11680500104321768451 2882 +17761361328849491459 2885 +15233921209171901441 2888 +16069382143996981252 2889 +12050468555568716805 2893 +6024355602014591494 2898 +15491466897308690438 2904 +3730176295718835205 2910 +12376687257944105474 2915 +9199118225089480199 2917 +1764631027158157826 2924 +13992599390357687299 2926 +16939056635673017867 2929 +11688170558552786434 2940 +8821664725810768900 2942 +17833012978199031810 2946 +6260783109092551172 2948 +1935755268811563011 2952 +6487241970571092996 2955 +283570535225211397 2959 +13648562854737182210 2964 +4664117887276527107 2966 +763688552293346306 2969 +6529688254448506372 2971 +15260351245921271300 2975 +1916136007698191875 2979 +1834539794913890823 2982 +2775787526037635587 2989 +11763156005768688642 2992 +1092594911140729858 2994 +0 2996 +4419531433215944707 2996 +6999999411324338180 2999 +11785242270931846661 3003 +10591978301636015624 3008 +11497987661675870725 3016 +9182554279521832454 3021 +15406715476570607617 3027 +13160929778437461506 3028 +9754980285916780037 3030 +10200263878180932102 3035 +322630679578759171 3041 +15576094613065650692 3044 +10766888572163741187 3048 +6047917970983132674 3051 +1894686728382424581 3053 +14598421592591588359 3058 +1723859045088450562 3065 +12612041931850626052 3067 +6135872693603599875 3071 +4292180497288309257 3074 +16734665470813511172 3083 +7350343365128422915 3087 +1912069528403782665 3090 +14382599270810462724 3099 +3316943244493763588 3103 +9879725097601193474 3107 +16995234703431184388 3109 +10533418679905509893 3113 +15083437418034798595 3118 +13908773068790545409 3121 +3714724982487627267 3122 +17400398487743184395 3125 +15012573759800968707 3136 +18302577637635149314 3139 +4329155602927417859 3141 +4955580105976204802 3144 +1961555922128841732 3146 +10128733761518848520 3150 +2640272647949941770 3158 +7754490195698865159 3168 +12142796706451631113 3175 +17365815208319973895 3184 +16557627206115633153 3191 +15078370093569871875 3192 +10349687794154673158 3195 +3473694961957886465 3201 +8710893672956366854 3202 +14068106218459046401 3208 +15092816646992609283 3209 +7317603117343176708 3212 +9653231067328341509 3216 +11053152134343642627 3221 +16249256179505227777 3224 +15180991765724747780 3225 +9340196072791032325 3229 +15943985937385251331 3234 +18049281030150509573 3237 +5389007214454359555 3242 +10879349353452615169 3245 +1505686887629765123 3246 +10340600516380348420 3249 +10073894039732477444 3253 +5442371936614095364 3257 +18341777471877901827 3261 +3646376112127875588 3264 +9475935681098023939 3268 +16403851393883869698 3271 +16369925399260153861 3273 +14673087273347416580 3278 +3062172708593815557 3282 +389919502164015617 3287 +15592707824227780612 3288 +10923576449159220225 3292 +16070256542987941893 3293 +10780641687743110151 3298 +14938258687229143555 3305 +9228629380951022597 3308 +3849544379965376004 3313 +5133414704145266177 3317 +7759615546425464836 3318 +4940041363170901505 3322 +9746677496288287239 3323 +14912819796131354625 3330 +13906931667087923716 3331 +1635028704095392258 3335 +4469285243829704706 3337 +16891540149900304386 3339 +12024584009331378693 3341 +18033958275920774147 3346 +14704552965566002181 3349 +9556244076012807172 3354 +13849836578991994371 3358 +5004058306996156931 3361 +9104317561427680772 3364 +5186152924099834370 3368 +11675086100193149444 3370 +8358271005386669057 3374 +8180494178676660739 3375 +5763987501538169349 3378 +14487340952012793860 3383 +0 3387 +7864696194149062658 3387 +12054240220681461763 3389 +0 3392 +283190023925736451 3392 +3509006534716876803 3395 +14668534603743471107 3398 +13990589627805763591 3401 +15848617010751021060 3408 +9826309121836393481 3412 +740685001787511812 3421 +9020119639965696002 3425 +14559936198493758469 3427 +12085834785965779458 3432 +16223004963757116422 3434 +2896514598307802117 3440 +17485471932545959428 3445 +15554868036584886276 3449 +4577536831892964359 3453 +1996600253900945921 3460 +7340514101386013700 3461 +10947483546159474690 3465 +6388534167866258435 3467 +10487540096866119686 3470 +15906422802762378753 3476 +13312166502282736644 3477 +9934255612740007430 3481 +16483913253293223945 3487 +5018822790659920898 3496 +13500972563624937476 3498 +12254103507180446726 3502 +337741848304440326 3508 +6758048624305141254 3514 +9927511494523491331 3520 +15040540160901096451 3523 +1021276059161230852 3526 +11597724480431874563 3530 +12004663100591411207 3533 +13902508431327814660 3540 +14497969858828110341 3544 +11493838376263182340 3549 +360244801365123589 3553 +9638713627733150721 3558 +711367871437108227 3559 +4386934598798141955 3562 +17140314548338275334 3565 +1365620891741941250 3571 +1488555826583759364 3573 +2912707432155244545 3577 +7832891877743352835 3578 +1897549891850825222 3581 +15749212009931314179 3587 +13421432881930445316 3590 +6479924671423850501 3594 +10703787529672778753 3599 +8755134092082433542 3600 +12275839735171805699 3606 +6339245450180982788 3609 +7912328405461966341 3613 +7240106046638025731 3618 +1756445717121376773 3621 +14382066537379517955 3626 +5866756650218347011 3629 +16272974087764784130 3632 +15761227767769414658 3634 +18416191208487439875 3636 +6907951459458727428 3639 +9809719231558661124 3643 +4507781411365709320 3647 +5884824860548742149 3655 +5437654195267052547 3660 +11222029271970864132 3663 +2994118918064883204 3667 +7969121812144744451 3671 +3138483343029123079 3674 +11692225531691234308 3681 +7005452876943918596 3685 +16540574446475148804 3689 +3142162595591230469 3693 +1562164105758214661 3698 +3289141220579056646 3703 +7235116973696399877 3709 +3290493685631181313 3714 +12052305452970666500 3715 +3659238132420018693 3719 +15413495749815386630 3724 +1349095549098498052 3730 +8600548848988295174 3734 +15278270405312088582 3740 +1677400654815390213 3746 +6944335799113370630 3751 +0 3757 +15054286073958269445 3757 +11524636819290913285 3762 +15672162207595698690 3767 +8738610060644560902 3769 +7413040162646408193 3775 +18169133436962543108 3776 +7221095417669340676 3780 +17150964708707287047 3784 +2614675755652403715 3791 +9768698864568413701 3794 +14233993616792698892 3799 +6872602506735524865 3811 +6837388664089203716 3812 +3698581321878713346 3816 +4659349311818858497 3818 +17337682331567989762 3819 +16786057931923565061 3821 +15744010785347485188 3826 +17295878380493810694 3830 +17845268661399945219 3836 +5827961355851241476 3839 +286776277701673478 3843 +4548722048270233606 3849 +14099405731913605125 3855 +4486295400879519751 3860 +12125867873199726595 3867 +18368077667072941574 3870 +5404293715565427715 3876 +12712115191201926150 3879 +6370598154474989571 3885 +4454743306504356867 3888 +13377479517289350149 3891 +15569481732652311555 3896 +14914575288330051075 3899 +12403912194723859462 3902 +11054836060260009986 3908 +8604233756927308292 3910 +17242531502026106375 3914 +1149772682929973251 3921 +1217846090326586885 3924 +4546442457392422913 3929 +17334766631755119618 3930 +292723405812293636 3932 +17627346709014329860 3936 +6078798662781175811 3940 +1900486643026391556 3943 +17474410257010896899 3947 +4978279717022715907 3950 +2778804921868839946 3953 +12000523230353385475 3963 +8890314515408882692 3966 +0 3970 +9676104834068817410 3970 +4098531628311187971 3972 +6989464886060309507 3975 +5049881779852020742 3978 +102597086695403011 3984 +9823964299513355780 3987 +14121828454496397829 3991 +17190852492614386179 3996 +4972710749072260612 3999 +4001749314797208579 4003 +13952444231209003010 4006 +16744358854815422466 4008 +8127795608347987972 4010 +114465556713981957 4014 +173339742608088577 4019 +6895862388187978244 4020 +603085984539084292 4024 +120107848305920002 4028 +10203785738636978183 4030 +12859608392929218051 4037 +4007942168105979395 4040 +2080492427033352196 4043 +7487698026088968198 4047 +14189794947817753090 4053 +2463630231055130117 4055 +11299510633267305985 4060 +14498728498471478276 4061 +9644588103370248708 4065 +11383355991577462786 4069 +4955493569336260614 4071 +0 4077 +1386234221983514628 4077 +1313369149250561541 4081 +903417014033398275 4086 +18189294875174938630 4089 +14469081760594239489 4095 +14159721903847057924 4096 +8017668332460509700 4100 +9241091263019633157 4104 +14601417607438779401 4109 +4584753168917870083 4118 +13978513523888848901 4121 +6344964491667831810 4126 +4588589911319176707 4128 +5860716946637224964 4131 +12059110109759764485 4135 +12813440898584409609 4140 +18247199889102181382 4149 +8906041867110866951 4155 +7391199117316453382 4162 +5819695506119986179 4168 +11242430695704829955 4171 +5649991510954437634 4174 +3398000528478559748 4176 +6367076320882708483 4180 +9328033184155698180 4183 +11271628511372963843 4187 +3704184971276909058 4190 +0 4192 +4153125824480143364 4192 +6502891621489681411 4196 +18414583200230078978 4199 +15881153597748490247 4201 +2036463440719857671 4208 +7208139455456300037 4215 +2867506792755729922 4220 +18392421146886582275 4222 +8221592382213352963 4225 +12018189404696638981 4228 +7605691703196937733 4233 +15156478285531593225 4238 +11983919901023261191 4247 +10980613162705801729 4254 +2793490740434315779 4255 +10258211111447649796 4258 +14244682075808242695 4262 +13278441471654787073 4269 +9073603025245464579 4270 +9138893508497365505 4273 +6486985510963558404 4274 +12815880629689744900 4278 +5840323547707326980 4282 +17992795154578300420 4286 +7188473488524673032 4290 +9650968119635816451 4298 +4862271432814542343 4301 +5126107698902858243 4308 +7753783516621211649 4311 +12251600056609917956 4312 +17892135216945785858 4316 +6310762958294091782 4318 +13863474843302129155 4324 +18135142749797092353 4327 +12380267938094728197 4328 +11467224734294974979 4333 +8724492701163999241 4336 +11581645889938107907 4345 +11788236419570379268 4348 +3995949497611986946 4352 +8344647901675014662 4354 +3617654648872888839 4360 +9087024072302936066 4367 +1800378642650781190 4369 +9079738279259191813 4375 +13904115371457856513 4380 +261024299316808201 4381 +6807698220004493828 4390 +16814045920408801285 4394 +7157102378104297479 4399 +18104850462136691714 4406 +768849636123705348 4408 +9530547917449168899 4412 +8006031543689535491 4415 +15030390865382250499 4418 +12373636984579679749 4421 +1893622243060931073 4426 +4091226656007699461 4427 +14231006341134665221 4432 +13125723803503531011 4437 +5966445804241068549 4440 +5041665953313495555 4445 +17789230849104615427 4448 +13718242196369421316 4451 +16239009855252881923 4455 +16927630575072344578 4458 +12730681039021790212 4460 +1694086382663150087 4464 +8718947912264086022 4471 +15238765179459311106 4477 +13978635316283488771 4479 +9856725068038263810 4482 +525841275698420740 4484 +16842982667216409601 4488 +4122500787496121857 4489 +13968246106678019592 4490 +13204564752268439556 4498 +1419479380120821252 4502 +2397465678843210244 4506 +16715502490113064964 4510 +14499648931261173252 4514 +6341573778923413509 4518 +16841392495652978689 4523 +12514195279220885507 4524 +9666258766835377668 4527 +2778875136515090948 4531 +0 4535 +18426782210587359237 4535 +12865361501428254213 4540 +10787394843155564549 4545 +2776295318639177219 4550 +8046973542669627906 4553 +18148260717468975620 4555 +1613488781452134918 4559 +8172336265264118279 4565 +17081693052561732612 4572 +16237950501236291073 4576 +8392391541408918533 4577 +8931251968786072069 4582 +8542921764885180418 4587 +9470472619498433538 4589 +901981222024827907 4591 +13131735431846831618 4594 +3882698256558264323 4596 +16404857401699193349 4599 +12380711598182476803 4604 +16186094456309680133 4607 +16432157998205992456 4612 +9920279823765799942 4620 +12616339481945114628 4626 +16822073161273746952 4630 +8594628600633212934 4638 +10817981044110655493 4644 +9844067372586569730 4649 +5128619234025570819 4651 +15167263260635504134 4654 +17952770567353131010 4660 +5118658223100390919 4662 +6228982503626095618 4669 +5642645332788020738 4671 +16107075109405794822 4673 +12284278769481421832 4679 +10377642547921984007 4687 +16601205450508455428 4694 +11666559143093560836 4698 +6407720774733313541 4702 +963774440512014339 4707 +4809475079850445826 4710 +9278447537509804548 4712 +17185862654551844360 4716 +9695553342098799112 4724 +8558692834989271045 4732 +962614543754489857 4737 +1553547621533507587 4738 +15153434212400534020 4741 +5116223975712918529 4745 +5111998655194025987 4746 +313103636819528194 4749 +5438592096772435459 4751 +10365510470175536137 4754 +6855715012782022150 4763 +3024538069580642817 4769 +16742472429918296068 4770 +12924517346973836294 4774 +3790806697175738884 4780 +18190189947825416712 4784 +8360884705460588554 4792 +11909780455200489989 4802 +11810343054191529987 4807 +15647869496036295169 4810 +412513398407304706 4811 +14686898002615878149 4813 +8598809720465421831 4818 +5189486371465472516 4825 +110260787871520771 4829 +13841516343411743749 4832 +10724255663284537857 4837 +5565631291506091523 4838 +18353555657030256132 4841 +15875447860016275458 4845 +8112003905901105155 4847 +8602718403900114946 4850 +117938027648666626 4852 +2893031913239209478 4854 +5019069760620149251 4860 +97583475437288966 4863 +5873749336924261379 4869 +12504998215144778241 4872 +1353827736622123011 4873 +1898410496741122563 4876 +13693373082111156226 4879 +18082132870069740547 4881 +1292057951019413000 4884 +6258876973340135428 4892 +16489169363829590019 4896 +15701633618762358787 4899 +13914488111521333761 4902 +12254871447098775558 4903 +14248690267109428228 4909 +12860529305362561541 4913 +14194242342154704385 4918 +16977163971733436929 4919 +3228522401353127939 4920 +2295154976383171590 4923 +16547003079054213634 4929 +4417789032435081223 4931 +4422876523688351747 4938 +0 4941 +3659489065466387457 4941 +1619784172289923079 4942 +8600895513152529924 4949 +1050842731609221123 4953 +11757008717921296899 4956 +14329248075633414146 4959 +14232133858655999490 4961 +8704709083004931592 4963 +18207045956333526019 4971 +5185988650714720259 4974 +13529628275274809858 4977 +10804496958327835141 4979 +7689973652510374916 4984 +11396101863003103234 4988 +17212217018245174275 4990 +6070381292664791045 4993 +15533634368139501570 4998 +17048527158831456771 5000 +1203920733977408516 5003 +695676800520161281 5007 +1406754003237844481 5008 +15691984313433400836 5009 +14531064384758914564 5013 +10837711611202277894 5017 +2926318809112930308 5023 +10159648870316367875 5027 +11566858212599568897 5030 +7059031027951755778 5031 +2984813724380697603 5033 +12009720736085212676 5036 +18211055476826914307 5040 +13061251952142904837 5043 +10757239089315382277 5048 +1462228017357395972 5053 +15640187074420677637 5057 +17088040301524619269 5062 +18114271904559916039 5067 +13823859947033415171 5074 +581999688325783046 5077 +15683367384740512769 5083 +208600152442375 5084 +1201580173890709000 5091 +12606361960832576517 5099 +0 5104 +8931089376684759558 5104 +3271554781083604995 5110 +7460494964945523205 5113 +2722625589600949766 5118 +1616995124194589189 5124 +11902711955062972422 5129 +1274063952699499010 5135 +16068633877522474499 5137 +15848929144037489674 5140 +7831541368361469956 5150 +658033048571530760 5154 +13929320007107549190 5162 +3115679009332886532 5168 +9736649464720172549 5172 +5267106433225081858 5177 +10111685724913617923 5179 +15622744730783467009 5182 +7254573118100577799 5183 +10850366468018628099 5190 +14193639490077596162 5193 +10501888748841043979 5195 +9464245848449792517 5206 +6272015894781725190 5211 +11516991521632351236 5217 +2352503424039588353 5221 +1535688922562094086 5222 +15705088852360739845 5228 +0 5233 +0 5233 +12195783308574042121 5233 +14597108197861441539 5242 +404717223097170434 5245 +9692591235625892356 5247 +11510479571637602821 5251 +4296993212271759365 5256 +14899258104987170310 5261 +4219665005023814661 5267 +17973894738755630086 5272 +5044183081588426243 5278 +5783508372603312135 5281 +15045380620683811841 5288 +0 5289 +15695460375845349891 5289 +10539286585069022724 5292 +16452718323718307330 5296 +1942973717378892803 5298 +3754588608122333699 5301 +9875838348526828038 5304 +2857419695636180485 5310 +10341338127425019393 5315 +13794742222441277955 5316 +11481845902083343364 5319 +14406267866268187654 5323 +8504914184482990086 5329 +15696399069296852998 5335 +7228768234308289540 5341 +17193980643638495746 5345 +18081325126638023684 5347 +0 5351 +13242402023742373381 5351 +15444771226459674629 5356 +10134126005071706115 5361 +1748990318787936257 5364 +5113080910719372805 5365 +4740943574073903622 5370 +6157660124169726978 5376 +2025011312955855874 5378 +553669187682665990 5380 +8084980747942317060 5386 +15008869680035365894 5390 +11054642401147826182 5396 +11851843011455558658 5402 +5049575986295398406 5404 +632151361685154307 5410 +10505264060559523335 5413 +12203685200692785669 5420 +9008107105681251333 5425 +9776735518460342274 5430 +6535838863651520514 5432 +9576661017186082821 5434 +9893784827470222339 5439 +4857181768617536005 5442 +12822028549600263686 5447 +12173840663449246209 5453 +8493988363445838855 5454 +12471223318525150723 5461 +13978362971313364483 5464 +1104232390588024323 5467 +1100802304281005062 5470 +12024887841397697539 5476 +3112215802325257732 5479 +6207703215900065798 5483 +10107845338520962561 5489 +4948379519093757442 5490 +9040023578523767298 5492 +12460867427268007427 5494 +17640575321947182081 5497 +14924017377560164868 5498 +13037662692055299079 5502 +17574020021597698051 5509 +2372904617320605187 5512 +3536299651807321604 5515 +17491514705714699777 5519 +1503367428551203333 5520 +11663038372561771528 5525 +11356551836020425733 5533 +14927003250941647877 5538 +11686166360497265671 5543 +3751812866770461698 5550 +9235429159371094533 5552 +10925066066795389445 5557 +13848442946975464962 5562 +15127509745617130499 5564 +12814854901058743300 5567 +11798071986715611653 5571 +9003722218263351299 5576 +16991506189565667331 5579 +981278872611282433 5582 +10035036946077778435 5583 +7029445286012767749 5586 +14504769452400850950 5591 +17475474682515088899 5597 +67574918893732867 5600 +8838928040323481604 5603 +8681421403122425863 5607 +7992933341854691334 5614 +6560668097211870211 5620 +782591258325690884 5623 +8459715981795762693 5627 +4580377521775126533 5632 +530574303038066691 5637 +17334925489416748035 5640 +10917945826566401031 5643 +11425792728280789508 5650 +11880471673070615043 5654 +11631630236968277507 5657 +13432232158299137029 5660 +10476683503031344138 5665 +6005753640415255045 5675 +4494528211652260354 5680 +5088699063729523205 5682 +16605408072272507396 5687 +5965728564066983431 5691 +12045126901259601922 5698 +13407389751313554951 5700 +10265378039037804036 5707 +17128306037403366403 5711 +6930510487252484102 5714 +4683881276581771782 5720 +8773712597668112386 5726 +7718603456686202883 5728 +816893400114994692 5731 +12215564487282997764 5735 +13309584590655820293 5739 +17802213776802985989 5744 +18262436632290822657 5749 +1166288764831559172 5750 +13852067026635056644 5754 +14826571289824620035 5758 +4783906813271651845 5761 +16110743783092945929 5766 +3392445819987063810 5775 +759677515271549442 5777 +4954134767103967235 5779 +7199695795476264968 5782 +13425017433253156357 5790 +4598183349583802373 5795 +13368149528004463109 5800 +7353867998927470594 5805 +14027611490475757572 5807 +15263300491627962372 5811 +3261710534261977605 5815 +16372386599130303492 5820 +17447749519143236102 5824 +8820939560759511556 5830 +14168934767906123266 5834 +1272094227362214403 5836 +16884210783475644934 5839 +6489513794935318530 5845 +720893495779325446 5847 +8004663725400207876 5853 +7925944396283898885 5857 +16471847542878583812 5862 +6051400597942863874 5866 +10447089147275700741 5868 +12420007994079107078 5873 +2743808713933127682 5879 +3922281465068971521 5881 +9641401502742986761 5882 +7025197893433436681 5891 +8464537216665311745 5900 +5229975051983696902 5901 +13219483540352648710 5907 +6891970947383493637 5913 +15509803201271371267 5918 +15800746157798133762 5921 +7494844196229054468 5923 +2478755409956858376 5927 +776981985281303557 5935 +11740421185520662020 5940 +8557461902491580934 5944 +6615098483818553858 5950 +4619069333445224449 5952 +11582842649688561154 5953 +13113788936574663684 5955 +4492831876575923713 5959 +3749003631842744836 5960 +18217039131397133318 5964 +15935794757369731074 5970 +18178081874058316293 5972 +5698328755092800515 5977 +924345980000004099 5980 +15391279659382430725 5983 +2629878169764907012 5988 +4980088919461560837 5992 +2390559727735566340 5997 +18190655124317003782 6001 +16690777444619791873 6007 +5111514005222631427 6008 +5463222638937838601 6011 +15935286318740422665 6020 +4601720812009204226 6029 +4573416748891166722 6031 +11625706448292708867 6033 +306546757229797379 6036 +5928989440750977029 6039 +10860678781281246723 6044 +17363380333704943108 6047 +12626658549687686146 6051 +8508105012190377988 6053 +13397258843768268289 6057 +2329867729858872838 6058 +6319578584393519619 6064 +648714822056359939 6067 +9778814147907384837 6070 +4782194177622378502 6075 +5940845406586789893 6081 +10944055863898710532 6086 +9804555614801620995 6090 +3243921131443177480 6093 +3363729399721306626 6101 +2694824434710392322 6103 +10930158767133753860 6105 +3086947634316383749 6109 +14689680169795335684 6114 +14169645236166264325 6118 +5766307716524312072 6123 +15588338815484165635 6131 +1879909569814783489 6134 +7648000293313816073 6135 +9707181328610653700 6144 +2550886158896312836 6148 +12264015729671425541 6152 +12250840876809084931 6157 +2325163999546039811 6160 +8090712276727686662 6163 +3561622135751247368 6169 +12428098442981778434 6177 +5317074378092887557 6179 +3293128764834931203 6184 +6501539462102225925 6187 +8841444808704975873 6192 +14795478358927854600 6193 +11543118218929331715 6201 +17590593535945238019 6204 +17201280632479248899 6207 +1869094785143730182 6210 +12095342838504642051 6216 +14332192655141400068 6219 +16006857683617781762 6223 +13800397681604810244 6225 +9335536499310733828 6229 +6519249660804306433 6233 +15000310314582189060 6234 +2775443890301194244 6238 +6999351997519495684 6242 +2193062667869819911 6246 +9580477704244001283 6253 +2049131530735872518 6256 +1901162351041197059 6262 +2875261889782423044 6265 +744785531861186566 6269 +740331390282101250 6275 +2834213319463573505 6277 +13092787216891636230 6278 +17187171220952344072 6284 +3822684967466794501 6292 +1702231969495806982 6297 +889324199902394372 6303 +5588191033639956997 6307 +3744301050105801730 6312 +5948176534768694787 6314 +17549670793917020164 6317 +1539504214284669445 6321 +1961430315639129606 6326 +865138743269174277 6332 +13779872344001562119 6337 +749841490366281735 6344 +370366796276637186 6351 +6563504091576679428 6353 +4380014957543785476 6357 +10351204487081468936 6361 +14023876399415748613 6369 +4887296606049584133 6374 +10236007245057672194 6379 +1963957521204852227 6381 +3544381531835458051 6384 +4467316503871596546 6387 +7586267349699624966 6389 +3431004678615592450 6395 +10570013355553256966 6397 +7244195578605442563 6403 +6701816902201590279 6406 +4940881348273062404 6413 +16104514017865230850 6417 +9415936248796381188 6419 +3230108127326351876 6423 +13932818959429724166 6427 +8712348641097257477 6433 +18103630802950382083 6438 +12398973386989278726 6441 +3219533089649746437 6447 +6290102361443240964 6452 +10332879499337892873 6456 +2005846858137644033 6465 +17321629815133772292 6466 +12526741080849233923 6470 +7932828292743261700 6473 +3418771465306118150 6477 +6688894864231285251 6483 +13744437326327367685 6486 +4639841471612583429 6491 +15561698488434945025 6496 +14842394190751288321 6497 +2133051154224139269 6498 +16839096353782439939 6503 +3290706488454416899 6506 +7886369044150052869 6509 +13220777477059960324 6514 +8952228474184094724 6518 +1556074372706545666 6522 +12244020250318504451 6524 +8716248224613385730 6527 +8093345746615195650 6529 +13780092881500069380 6531 +4530692743391660039 6535 +12734146969745873922 6542 +11289214500525457927 6544 +9575487044215824897 6551 +2144698396513178625 6552 +14284428882875800581 6553 +5709589754608808451 6558 +0 6561 +9917948887644861445 6561 +14431208557535975427 6566 +9567809156604564996 6569 +8710430089813247493 6573 +3828335333182556161 6578 +2216131334191299588 6579 +1276616304051198982 6583 +18328943126583720452 6589 +17263736866258471938 6593 +1146391532348252677 6595 +11024404375468255746 6600 +17228334519141824006 6602 +13561301863975277570 6608 +3751109463627572745 6610 +12977367319368771077 6619 +11017590245904668677 6624 +6429003927082400769 6629 +15980526593137821700 6630 +10534103997333509635 6634 +4514332674264269825 6637 +1528094942432261 6638 +12173909081816589826 6643 +183517580463285763 6645 +8517032698989345286 6648 +7115066882665331718 6654 +2566818993251168775 6660 +9368992790350793731 6667 +9166789638774720516 6670 +15079358786545446918 6674 +2185557574252684294 6680 +18056985379025629701 6686 +12535961682376707587 6691 +11851945142712594434 6694 +7627172168424760324 6696 +17944585482911861250 6700 +15849614722920903687 6702 +2668461721297078275 6709 +16023087332423670787 6712 +16247801720769274884 6715 +9142715171981265927 6719 +4313627074153320964 6726 +1574784871857860099 6730 +10438141099357345282 6733 +4117642850043155457 6735 +7416594995698837510 6736 +7491335401177827847 6742 +999772280226214404 6749 +14300137132498749956 6753 +11917616424429924869 6757 +10375470899065353223 6762 +10169138785478750211 6769 +14204988181069352961 6772 +14721733831675986946 6773 +4210584362875015686 6775 +7317455187149169158 6781 +6256325207519993355 6787 +17307466709656047107 6798 +12449910579172817925 6801 +17117327289179107846 6806 +12204503725864039425 6812 +8587479573876999173 6813 +13357534600380797444 6818 +16924498399316170243 6822 +10385795421598850051 6825 +15693231046972250116 6828 +7734836985073539079 6832 +5475345640306229762 6839 +8682265953165714950 6841 +15495325273691446280 6847 +3420038705144251395 6855 +7251140871800046081 6858 +981699756862875652 6859 +16048654718395234311 6863 +8079678211237274626 6870 +17330964965463092229 6872 +204998850760340482 6877 +18341495060807385089 6879 +0 6880 +10330614754041761797 6880 +6569474263331988995 6885 +10151163022537904132 6888 +6973077903683613700 6892 +14823983621891646468 6896 +4588791582583577091 6900 +7738659980315072514 6903 +17781357705759544325 6905 +16052303612535971329 6910 +15667766045744763395 6911 +6980389294886772227 6914 +14613524072384819719 6917 +8059455877733662209 6924 +10539657214160512007 6925 +11616619521633214977 6932 +14224732868845830148 6933 +1599514425208358916 6937 +14897125022827391489 6941 +17618243532524716547 6942 +12937125504387172865 6945 +8071819989785685507 6946 +13114810333443126785 6949 +11089061982263568387 6950 +7512050791922835458 6953 +8222146541757369347 6955 +9515352071601081347 6958 +17127940202801999362 6961 +17358081333094451204 6963 +12815500919803761668 6967 +5161865702872029702 6971 +5085872907714726404 6977 +12867302697661638661 6981 +738635139511943685 6986 +7502486089554604548 6991 +4424538564647398918 6995 +13033530442197720066 7001 +6601067310912141828 7003 +1366953120023462405 7007 +0 7012 +373035175951056903 7012 +10367937030873553922 7019 +7387148186552064514 7021 +4451982393641993219 7023 +1579274675138636802 7026 +2005972906238723082 7028 +8365560780332633605 7038 +18252698082741376517 7043 +10687245525977179652 7048 +4847932655264917512 7052 +1908452749238848516 7060 +6974472620105490949 7064 +4229863270655526913 7069 +10085099300306882057 7070 +17958427850227237893 7079 +11171712079059576835 7084 +15887785057120482307 7087 +13778764465009986563 7090 +2024558227009405443 7093 +2645457411458513412 7096 +9511844619849197061 7100 +17006463209877258757 7105 +10936200410456409095 7110 +3336397438630617091 7117 +6926069371323713540 7120 +8379889490656065540 7124 +3625594756061307394 7128 +5913498723740950018 7130 +12484239622695376900 7132 +10051602445201488389 7136 +18057842454501173761 7141 +10321164942757956098 7142 +2085863817939845636 7144 +637792840422552070 7148 +5775914883929950210 7154 +4294440544947172871 7156 +1470884227132728324 7163 +16547746967068243460 7167 +2181778157642243587 7171 +14805614303640410630 7174 +10407211148095012357 7180 +7300854148390629377 7185 +10669095767865426949 7186 +15733785095671659523 7191 +11806922681806601737 7194 +25481766866507271 7203 +12569152301666821634 7210 +13887779286276890116 7212 +7527919625682468355 7216 +17922524530616125955 7219 +0 7222 +11443084099398646276 7222 +12286354644189494278 7226 +17630285722782908417 7232 +18436478724478563329 7233 +18200429394767296004 7234 +16672878022210267141 7238 +4512918066122139140 7243 +12031526121929858052 7247 +14212642254166041603 7251 +8575300375201110535 7254 +16514096733739064836 7261 +1372144160287681027 7265 +15124745564957097988 7268 +10223452831275718661 7272 +10095462828218450948 7277 +10267568820449235459 7281 +8469965405176075784 7284 +9411785803579933193 7292 +13375379691633666053 7301 +5561046853266212356 7306 +5600517863682136579 7310 +4206747353107879938 7313 +6909661555018396678 7315 +4417053658040592898 7321 +9011207054761699331 7323 +15847766482649990661 7326 +18310070108073323522 7331 +2313624043931823623 7333 +10185320666992114180 7340 +11916926699710288898 7344 +3545425776481026568 7346 +4911891633544977922 7354 +6138519775096177157 7356 +13049919356836375556 7361 +15829456196869805060 7365 +11413888162709001731 7369 +3300615883971422727 7372 +4415199397635384323 7379 +4078185095297996292 7382 +5050132448655584777 7386 +6103646993143324675 7395 +3793253264149160449 7398 +16347356082607946243 7399 +3857792844626733059 7402 +13036132457540813314 7405 +3317522113538233860 7407 +6305735953325256196 7411 +6860732809698012168 7415 +6541633460102011907 7423 +3961099792723844610 7426 +7089802930014850051 7428 +13336068690935240707 7431 +10056644085184719362 7434 +11207965588169773573 7436 +2355374993394737153 7441 +17990578805700388865 7442 +5383591927836860933 7443 +13480144226871606785 7448 +4996232125830537221 7449 +11235167738243785734 7454 +143923373352141317 7460 +8974578467632463364 7465 +17864556342494699522 7469 +11663093833306126343 7471 +15103674999204478981 7478 +14009898996985431557 7483 +3460032664591823370 7488 +8367107077597996035 7498 +10237320221820149762 7501 +1230491654079345668 7503 +5914481805353637890 7507 +1999423877124190726 7509 +4194589414523475459 7515 +6778899120031142917 7518 +6259706092385260035 7523 +12578917588074039300 7526 +842849858858196483 7530 +521961307927385604 7533 +17870457945874248706 7537 +11610460273728938500 7539 +13002243795339621894 7543 +12765037571141596167 7549 +14619375725711845380 7556 +9898817210922070535 7560 +7087049801313293826 7567 +10788149532662318086 7569 +11883745714487623174 7575 +9160587494551387144 7581 +12948796790808401415 7589 +15459692796244702212 7596 +13669023181354473475 7600 +8297900856639261187 7603 +8973562188479754242 7606 +1741536580090567683 7608 +9618746069312002053 7611 +14055601259453352453 7616 +7235233866577679879 7621 +11392475556674295813 7628 +2155357865374380549 7633 +12303341912019606531 7638 +5824983256326052360 7641 +14021022753924725763 7649 +7529297856837936645 7652 +7626036300525324802 7657 +13470102056185236484 7659 +14040234972562250248 7663 +3092555032572210694 7671 +351921127336245764 7677 +18352729336655478276 7681 +4115012278704262148 7685 +15607965751654339588 7689 +17876209822256179201 7693 +16572837449335793665 7694 +8663418737724652548 7695 +13305660029461998085 7699 +11958592580840442371 7704 +12164924667918544388 7707 +14419240429041575941 7711 +10751379426943696897 7716 +13859991162413006342 7717 +6196669303248639490 7723 +17621166842638855686 7725 +6938529564969770501 7731 +199770165813218817 7736 +9794627124586530817 7737 +10042945289721419780 7738 +15124336629718367234 7742 +17239762101737752070 7744 +5066859136028226563 7750 +18342141343814928386 7753 +14297580412569375748 7755 +5716198931408879112 7759 +17629167193054472197 7767 +3840533914406490629 7772 +2628101470761528321 7777 +14197211868061374980 7778 +5035129043470395400 7782 +11015175427449999873 7790 +12059984061354081796 7791 +7621245355524176387 7795 +7205828901486151173 7798 +16192222390146865670 7803 +1543156989008861701 7809 +11571041007873040389 7814 +16667674860570698246 7819 +2792459496922037256 7825 +1716286101354276872 7833 +6892728786412752387 7841 +5493465003035191811 7844 +12724100965955726852 7847 +485317178080522244 7851 +7255092882374689283 7855 +3746112348748737537 7858 +11741059179006117890 7859 +13078798732771974662 7861 +1952753305616740355 7867 +2942432464334385155 7870 +14721738681901483012 7873 +1053013354524276739 7877 +12349895812339935238 7880 +3439161449500354054 7886 +3350328017673840644 7892 +8037543239976981511 7896 +16626903114423534083 7903 +13087643897752933381 7906 +349987452515442689 7911 +0 7912 +17467123943804556801 7912 +1793445310925094917 7913 +14598490873474125825 7918 +8308390887087095303 7919 +16158446523729277959 7926 +15491096967236155908 7933 +4171042813813231107 7937 +10827160934573197316 7940 +9642746569099865093 7944 +13785771297862324740 7949 +5796988451593437188 7953 +14917478676441368579 7957 +17874504114098815493 7960 +2708122882887417858 7965 +14322132912803469828 7967 +12065320292649433090 7971 +888797480150426630 7973 +395125046520925188 7979 +10520966495478106633 7983 +5169469121626948612 7992 +17273179268589918723 7996 +12795372769539323910 7999 +5117803836781655555 8005 +16925611096069050882 8008 +6625234763569347586 8010 +16844853869670692865 8012 +3977649770909947906 8013 +2972380523819649539 8015 +497528659151817732 8018 +11996931110119688197 8022 +0 8027 +14527800815015947267 8027 +3757656985461510148 8030 +8694322819116526081 8034 +16851431703897661957 8035 +11515257381226467842 8040 +11010085586057559554 8042 +2524954812337072132 8044 +4743866005270246403 8048 +11384873943835032581 8051 +8310637828688691202 8056 +11153487272179623428 8058 +769967953800523266 8062 +0 8064 +13516893598449246724 8064 +5038699793501378050 8068 +13144799219856116742 8070 +9934330204728416258 8076 +3655612517878734340 8078 +0 8082 +4274546662615174148 8082 +3113547990374367235 8086 +1576464090986868226 8089 +8052690679559396871 8091 +16416348569849000962 8098 +14682578073687918596 8100 +711235932113246724 8104 +3783957728341021187 8108 +0 8111 +17755290321535534597 8111 +11385183453115744258 8116 +0 8118 +11885260682020238850 8118 +17496487395212878339 8120 +15768054834411851269 8123 +5785876924651997190 8128 +2331319797157481479 8134 +16355461816620235783 8141 +11273864082744795651 8148 +14252708860312410113 8151 +15785104706342830083 8152 +9352816332652705797 8155 +4011977900758547971 8160 +10848660497686359555 8163 +4000151043530209793 8166 +5396532088462366212 8167 +3927765723762991107 8171 +15422718828767431685 8174 +10941707572935631366 8179 +16489963595758841349 8185 +0 8190 +5395539323509102596 8190 +15342496063042500099 8194 +1219696481208442374 8197 +10023301202799369732 8203 +5312967539534244359 8207 +17935905043961708545 8214 +16047045121867958788 8215 +15310978688896158214 8219 +18440605187310284802 8225 +14197313297504534021 8227 +441709391396755460 8232 +17812190323632966658 8236 +10692610292065110532 8238 +11222688789988631554 8242 +17528224981026048004 8244 +2197829958742952967 8248 +10152296005704294921 8255 +12463528362670460936 8264 +7042533756535298563 8272 +17219593725854116870 8275 +8522306341936327683 8281 +10071831458541708292 8284 +2144479416307595267 8288 +2114838092627846151 8291 +2947170101467883017 8298 +12660876496669745666 8307 +3161090096955291652 8309 +16743957698571200006 8313 +16318831504113113606 8319 +14950646638769419270 8325 +7323550525578773507 8331 +4039272367179611651 8334 +12096483676093740550 8337 +7774586835810597382 8343 +5579761702661723140 8349 +14352876305744850436 8353 +13331184564384168449 8357 +2020987020421506055 8358 +16178480651732900868 8365 +888095906630827014 8369 +10220103374810053128 8375 +2224333830443706883 8383 +17040374268011207172 8386 +14291985828075567106 8390 +17057170452959945732 8392 +7748007785281693190 8396 +12618342462797443076 8402 +15883543518568136193 8406 +12947971518173832706 8407 +17352353358645068803 8409 +5586575291343352835 8412 +1348788004136388614 8415 +6343771886666161156 8421 +13970440152321427464 8425 +3549808212481676803 8433 +8028923969819949059 8436 +545246617473536517 8439 +12436947090048709123 8444 +5196276735774691331 8447 +2496478847492376577 8450 +2100590320998354436 8451 +334551546701514756 8455 +4092239999433684483 8459 +10922903245357598728 8462 +1441474937910484483 8470 +9598769507393141764 8473 +4955421446864471042 8477 +12956516021812246021 8479 +7321960696130126854 8484 +0 8490 +18278353711350716424 8490 +13121704842401540611 8498 +12274906193534691332 8501 +14289863988886367233 8505 +15283561085911819267 8506 +13782779156949868546 8509 +7704496490378685955 8511 +10618419155507525634 8514 +7397164667039553540 8516 +15567995868450804738 8520 +14712268087799854596 8522 +1548184323554305031 8526 +7192789592171826184 8533 +13316418493636904967 8541 +0 8548 +5215240697043492356 8548 +3890228446558651394 8552 +8328848986203978756 8554 +15126106953262311428 8558 +14270119592253784588 8562 +5191930340299165187 8574 +2126621387103302664 8577 +3103684332741850116 8585 +15369808234987082244 8589 +6315413252835482118 8593 +1291079580341170694 8599 +12936374217576603654 8605 +696049126311002626 8611 +11245314348802298375 8613 +10923016838676114439 8620 +17961727409553718276 8627 +7913484058346768386 8631 +8932462281898427907 8633 +11793450632268285444 8636 +2847912018193859074 8640 +6408896561158320130 8642 +3269546635160993283 8644 +8969510456018313221 8647 +7154237177747635205 8652 +5614099577563175428 8657 +2446135146048667649 8661 +5675878594090839045 8662 +14232065563122972675 8667 +15977337417200591874 8670 +15298421493379337220 8672 +16011625608507343365 8676 +7235898319927714306 8681 +5340005025668927491 8683 +1196415042327489539 8686 +4713963937981097473 8689 +4831542432579784708 8690 +1847083286583211521 8694 +13870454161125454341 8695 +5254837707471297539 8700 +6960499324838242820 8703 +13867598132468730374 8707 +10483141320109367810 8713 +0 8715 +10849640215667016705 8715 +2067558632737545733 8716 +1278806563774934020 8721 +1677415920095912450 8725 +6161844696962912773 8727 +10614563245411709443 8732 +4818150795281695235 8735 +1418841320896123404 8738 +2873896250393760772 8750 +854986818168986627 8754 +5931889515838613507 8757 +11535697573016238601 8760 +5551905940577201670 8769 +10103922566367941640 8775 +3040227970228190728 8783 +12793892732454622723 8791 +16982163311078284805 8794 +11375455878030986247 8799 +6015189453256624642 8806 +5496333461190257158 8808 +3821427284351406090 8814 +16764727135427828741 8824 +16949708079388834822 8829 +10960203165399542276 8835 +385239120426788357 8839 +12243765323363784708 8844 +16356514019222403591 8848 +11130177577913487874 8855 +15282019758294758916 8857 +9661305621850070536 8861 +10356647184169795078 8869 +17227299153289679878 8875 +4490960025430261762 8881 +11878251368526011910 8883 +11397425566461228035 8889 +14067170717070213124 8892 +10778649734802249730 8896 +15030612393350307842 8898 +2295530339316025858 8900 +2263427176813938691 8902 +9058775045731528710 8905 +208412517849074691 8911 +12359959118097485828 8914 +16564415980480990212 8918 +14366783621592409608 8922 +9117569470620385284 8930 +3036707162905534980 8934 +8966249406326003716 8938 +5509303575126272513 8942 +12628857669432723462 8943 +14819218502142411778 8949 +1288685136300724739 8951 +2947939296884118531 8954 +0 8957 +5386654655210478594 8957 +10343897038113848837 8959 +15426439324176745474 8964 +12266584411562299395 8966 +1907917230904316933 8969 +14910180967311559172 8974 +9720549500997887489 8978 +18370146625748830210 8979 +11119817864426150407 8981 +14990610531481895426 8988 +3685867788207774210 8990 +10130867645102091780 8992 +10456629716441776131 8996 +9457402246429983236 8999 +8661949077540290565 9003 +8088206585973517828 9008 +7282603695052663811 9012 +18091457294409608708 9015 +2985285307275903491 9019 +16054585448351838210 9022 +17120918527836336132 9024 +1424028159521805316 9028 +5977836517349378562 9032 +3519085253051177473 9034 +16345964184671145987 9035 +15372109848678138884 9038 +7222391422896086529 9042 +5353873636059288067 9043 +9029549836943091206 9046 +5134676748987627525 9052 +10714909537648327171 9057 +5736678012625697282 9060 +14294821700737828868 9062 +8586655751382317570 9066 +13351583672947871745 9068 +108508513632453635 9069 +5050371031675247617 9072 +6166616794045106181 9073 +2031104535485049352 9078 +14094848056438184451 9086 +3209250433486714881 9089 +9350627317630111750 9090 +18303214068116683779 9096 +18175279340463563780 9099 +12107924200154576905 9103 +10484467687779406852 9112 +14851409976558955011 9116 +15638596584230811141 9119 +3430619739972681729 9124 +4525405061745931266 9125 +649950973116531715 9127 +2155620279064068612 9130 +8815144701263809538 9134 +13559861173774352899 9136 +7281961761827198977 9139 +6479834777616534533 9140 +2122757370570593797 9145 +2089579746359666693 9150 +2118060026591884806 9155 +6610934769249412613 9161 +5764322807994532358 9166 +0 9172 +18292600605824816130 9172 +16027316353628307971 9174 +5873669518383733766 9177 +5359651264742656515 9183 +13772405542358896129 9186 +11232211142830638082 9187 +3925867700498507270 9189 +3622362421655861763 9195 +17971549328678167560 9198 +10178164675173581829 9206 +14868401087752220166 9211 +8638928217279014403 9217 +4076827647377092611 9220 +9216951363784411654 9223 +4860389695250074630 9229 +5141912337195232260 9235 +13638182739657232395 9239 +190458625753204228 9250 +10439263220459785731 9254 +15570203757103389700 9257 +10100861381374402050 9261 +13176659651482535429 9263 +9940836949388992515 9268 +1434753776722169859 9271 +15911832694772576777 9274 +16377649747153682435 9283 +3535436958394055171 9286 +11624713642892604931 9289 +11996281349520748040 9292 +10742686484067190786 9300 +17670565325207822338 9302 +13990304795724480520 9304 +14836152707472091659 9312 +16716579935008131588 9323 +17735689176581906437 9327 +4144007811993196035 9332 +2707859638354712067 9335 +14181020274724903943 9338 +13059081342152218115 9345 +684747240204638213 9348 +16965023416811773956 9353 +13274944270947176967 9357 +15155009380877432836 9364 +5753494907828415493 9368 +1998889434424413700 9373 +13921489190209585668 9377 +16405248362223825923 9381 +3798322026674209286 9384 +15568407548270878724 9390 +3135611625200060932 9394 +12296127287381132805 9398 +10483623682378989572 9403 +18422864558288511496 9407 +13257200523160059906 9415 +10889084434899085829 9417 +16235392322225996809 9422 +0 9431 +15880157821766867976 9431 +15769881988250557442 9439 +12288876986979557390 9441 +5871458479777715202 9455 +10230540431513771013 9457 +398388154193370114 9462 +16830851883321963523 9464 +7044965106822626309 9467 +12835028021967009282 9472 +17669753751310200324 9474 +17863085400947067908 9478 +2547448843186214403 9482 +1563360555826800645 9485 +10654255430471045636 9490 +8919766593242463749 9494 +9157516009426735617 9499 +1851229450956041222 9500 +18170290697945010178 9506 +9095614121151507464 9508 +13764886157577890307 9516 +3251289848300243458 9519 +5951886391180718083 9521 +9538359075664012292 9524 +16549340102925487109 9528 +7860504828355370498 9533 +18275958449742785029 9535 +6476221964757699592 9540 +16649298133457885189 9548 +1077384049635129857 9553 +5467499339984290820 9554 +5661058762060941829 9558 +15925191203640364548 9563 +5448679068663604228 9567 +15739647865842650113 9571 +13891937443582442500 9572 +14250729033592490501 9576 +14289449380340632067 9581 +1789638517701969411 9584 +13345010946699538946 9587 +11111710299888134146 9589 +1494709650535500805 9591 +2236847890842874884 9596 +9697689012423586824 9600 +3247495687941577731 9608 +0 9611 +15118874474456832514 9611 +14024878668621521411 9613 +3367336313963633667 9616 +13398818199176143876 9619 +18089789709456805382 9623 +4429217189812210692 9629 +6513417000870213124 9633 +13410811484403031047 9637 +9286599824407690757 9644 +924498765229231620 9649 +2155095227359495173 9653 +4200261631069198340 9658 +15143612470449772549 9662 +1320870432605139972 9667 +4148999114204317700 9671 +9196282390467354625 9675 +621977095233334788 9676 +16684252513012100610 9680 +7759579056583751685 9682 +10560224623837053446 9687 +2037646954057236995 9693 +12847463900905112577 9696 +6865131451138731012 9697 +6732352328150422019 9701 +15189956320437859842 9704 +1729177819745226755 9706 +9628816068749024769 9709 +4869564800189530115 9710 +6891966938220697603 9713 +3082347868569907719 9716 +848966209447799300 9723 +16707295358571493382 9727 +5345579762123232262 9733 +5562519901118562310 9739 +9363650360673411586 9745 +3365229826355504134 9747 +3376039655325580295 9753 +15864771015094443522 9760 +12471275120424825861 9762 +3962847617747436038 9767 +2039106870167488005 9773 +4261393043489374211 9778 +10745995285662536710 9781 +3002508545306168324 9787 +11151187127460575236 9791 +14495248572152597510 9795 +13158592688077951493 9801 +3080147397531626498 9806 +13716682452660411394 9808 +547361496254658055 9810 +12089489835480116738 9817 +10279670610828915203 9819 +12567955213310603269 9822 +11440632300282277895 9827 +15398288405038927362 9834 +5386885241872327684 9836 +3680027566923146754 9840 +2217665654577728517 9842 +15849069013047629317 9847 +4715091011827237893 9852 +8916467336026380804 9857 +2800988348492166148 9861 +17415235694289989127 9865 +13588949041668608009 9872 +1941386960406656514 9881 +11807870840926835201 9883 +13035746228625045508 9884 +1210098858763514882 9888 +10705915746174055431 9890 +8964636058102386693 9897 +8992122679190564358 9902 +18024526552500914179 9908 +3399282844180297221 9911 +14702625572881366018 9916 +12827262705039079939 9918 +1825561220317001731 9921 +12005663943797970947 9924 +11351146709946348035 9927 +1530160080767558661 9930 +17656275535026350084 9935 +54419944571406337 9939 +11687220766233479689 9940 +2537748891544432132 9949 +1759829480644668417 9953 +6123752096613890563 9954 +4909154128931475461 9957 +12539287524336258052 9962 +4195437311431932421 9966 +5389501331748174850 9971 +15010514056238470145 9973 +14480360256852796418 9974 +8771073382209191427 9976 +6615236487933136900 9979 +7232611440250014211 9983 +1337570304475312132 9986 +7461474373161875460 9990 +9259311618019461635 9994 +13773890732675240965 9997 +9841972479626840069 10002 +9115122948750180356 10007 +13242158510354541574 10011 +1565508652651280902 10017 +1695083625475833862 10023 +1938858750813926402 10029 +12328037641006886405 10031 +4412369078784258058 10036 +2502833431772606978 10046 +15729139845383543301 10048 +7694754616584338437 10053 +14980560552270241284 10058 +15869624118011064837 10062 +17352282363597287938 10067 +5127022181039230469 10069 +4685641210985893895 10074 +5327410601982863365 10081 +7171485101693264903 10086 +5617559065777960961 10093 +12137310037271097859 10094 +1870403729475799556 10097 +5417701589740024835 10101 +5845755091891419139 10104 +15909218086244315140 10107 +2376460671519239176 10111 +355083952633735684 10119 +9727552074367371266 10123 +6877971274400977927 10125 +5250183713973005827 10132 +11695225976970451970 10135 +2388464703487959554 10137 +5837022128941820933 10139 +4835036664659195395 10144 +6433731303273260035 10147 +10370155091177379332 10150 +8556435841084088835 10154 +10526677726640892421 10157 +8005365384959643650 10162 +8745563542011038215 10164 +15830611893547904006 10171 +7941198047831518212 10177 +0 10181 +4363051472645246469 10181 +14256589588317798404 10186 +0 10190 +585621577143649284 10190 +4473670969409771011 10194 +17244583975995485698 10197 +7345923771680808450 10199 +13098846063762132487 10201 +104030188429970435 10208 +3369079413750032388 10211 +17886670858634677764 10215 +10005036995483818498 10219 +2047099945767312898 10221 +5779793518677850114 10223 +16821250492911051777 10225 +13728417208867682306 10226 +15154637451198667780 10228 +10658122587771337729 10232 +12087790277831313922 10233 +4851681448771161605 10235 +18182822185771610116 10240 +9841080350566933507 10244 +4208888961669076997 10247 +5065354496346856450 10252 +901321068909002244 10254 +3977475229742514180 10258 +2162792206907370497 10262 +2419759369747772421 10263 +292082457413381123 10268 +8016343473484844549 10271 +12710983558670383107 10276 +6224044441859341827 10279 +14400503045000088067 10282 +7101335810500715013 10285 +3552176799976459270 10290 +8096058328942529032 10296 +4444255239465088514 10304 +13102766994129058308 10306 +13063506824774841345 10310 +15846940939915024899 10311 +17451146712696428037 10314 +10420342564025206788 10319 +431627005720136712 10323 +15935638845044184068 10331 +7776146088387542021 10335 +10760352279396009987 10340 +15607246954255778822 10343 +8490503076626329604 10349 +6460359914451116548 10353 +12514325483037393925 10357 +15593615878379819012 10362 +17105374525023126532 10366 +7641542608039226884 10370 +0 10374 +12666075723329010691 10374 +12978953453735151619 10377 +3319262623477806598 10380 +10185876183421468163 10386 +2472749333407035400 10389 +11708597378718588426 10397 +4523503097173771269 10407 +12263680035255020545 10412 +9534450517575392260 10413 +5412104690129483779 10417 +15865779465943168518 10420 +15015118375336815105 10426 +3790105865759649797 10427 +560485275138994184 10432 +3681356149744822788 10440 +12155786242533893637 10444 +17250959002613783556 10449 +8524480090180221443 10453 +11250485477574622214 10456 +1730200331668499462 10462 +6407434493813671427 10468 +4511302014009512966 10471 +12334342274025240581 10477 +11786370403170797060 10482 +265037261538338820 10486 +13617513028786338310 10490 +6795585427315791366 10496 +6150242078089192964 10502 +11395715580803430403 10506 +7139445471749301251 10509 +15331274599182718466 10512 +5306261271654919172 10514 +0 10518 +16507855956315577861 10518 +10663007347969419270 10523 +1783523404705221122 10529 +14198360264726365700 10531 +3693368405646757382 10535 +8911800581841975299 10541 +3819257728760240642 10544 +3163201634980207106 10546 +7661934549599697926 10548 +0 10554 +17995568121922558470 10554 +2294369798261799427 10560 +11644884713664812547 10563 +1172173951533743620 10566 +17872674553127599622 10570 +13360655695575348227 10576 +13866989480685586946 10579 +17285238465875786757 10581 +7701920500755718147 10586 +1353636452102535173 10589 +8154217655705754114 10594 +17847935368397801476 10596 +590406998347875844 10600 +15533834298131129348 10604 +13643961709233314819 10608 +15955848558376417798 10611 +18155425694297154565 10617 +18111462889317918212 10622 +1977198711606750726 10626 +14825567603807632389 10632 +3562619510069322245 10637 +2901675605696386052 10642 +6126396210964976646 10646 +11742022767916033538 10652 +15638956162424815111 10654 +4426725143978446341 10661 +8519316613878132227 10666 +9485074091820643331 10669 +1804540108316816386 10672 +10139940858077353476 10674 +14926544927423545858 10678 +12736090090623018499 10680 +12081994847264909315 10683 +11170850996165427716 10686 +4812964746990351366 10690 +10028097743613824005 10696 +15630006148098724868 10701 +14441495400199385604 10705 +16588159452272844804 10709 +11197569472752041478 10713 +12053515120430546435 10719 +6034610344627152390 10722 +11167067829364428806 10728 +8923286462103934469 10734 +15119370182060987396 10739 +8841027242594816005 10743 +5131869844580642307 10748 +11880971064282385409 10751 +8401429282816381447 10752 +4892124393437804036 10759 +17769572762247914502 10763 +0 10769 +563049022559673860 10769 +11603820886321095686 10773 +16240439602915361286 10779 +14598209528900158467 10785 +16437418909095422466 10788 +4106546017160587270 10790 +2239186784171070978 10796 +174683179129353220 10798 +15868302315609945605 10802 +7916815717385961988 10807 +3488271874700270596 10811 +18191632271244075524 10815 +2318948768203264003 10819 +1087651107002498052 10822 +11080501349680540675 10826 +11754434900607475716 10829 +14825703009205568518 10833 +0 10839 +16133819434804788228 10839 +134711274202539522 10843 +3445327967030124546 10845 +16275270481952548867 10847 +8427503968185489414 10850 +10179617847969974788 10856 +11912509912167804421 10860 +6148357665811757570 10865 +18007067457942900226 10867 +7395206001463647747 10869 +3135830862673249287 10872 +8224861241160786950 10879 +10313092947917676035 10885 +7640070775770024964 10888 +4582671494557737476 10892 +5759062855106934281 10896 +8572608370936922631 10905 +1333003675247604226 10912 +1745061459188283907 10914 +7608537496481428487 10917 +423656487004309510 10924 +13437930391559629830 10930 +1100823386520819204 10936 +14836185784208467463 10940 +4926845608539417090 10947 +13435453454165401604 10949 +12928331001269544452 10953 +5661098699949227012 10957 +6260890270494032899 10961 +8121071173151668230 10964 +10475967291173043206 10970 +12311998541467377670 10976 +16303529727266169861 10982 +4007798390682677253 10987 +3170553251110964231 10992 +1148621634814626309 10999 +1991917047628649985 11004 +15748719431352210949 11005 +11886640996383067139 11010 +14369690179590163460 11013 +15717367393337226754 11017 +0 11019 +12223145091017596420 11019 +15078116252842458628 11023 +18020754185570550274 11027 +14322712216596215810 11029 +18206827125808130050 11031 +9271938694599241219 11033 +16197401658452630533 11036 +0 11041 +991557016230923271 11041 +16552511667951715848 11048 +7673340722959538692 11056 +1402682590957356036 11060 +13603543146620175364 11064 +6369146597322734086 11068 +7359149615758340609 11074 +7586202186471973891 11075 +2707784461339465221 11078 +8955004649820990466 11083 +9722871965274609669 11085 +4540597859154651654 11090 +12425630770918099973 11096 +14502971859553077765 11101 +9076995784635047429 11106 +12461966875642819080 11111 +11577080687303614977 11119 +16184675009751053321 11120 +3629764153338277380 11129 +10857485192868986885 11133 +10798430435236510212 11138 +6819393961965331972 11142 +10932271451217784837 11146 +16889676170518360067 11151 +5388904727175099906 11154 +2633632211351808004 11156 +7064480332035548678 11160 +16154550344837843459 11166 +6444138466453249541 11169 +13223611486871051779 11174 +13178664577999652357 11177 +5643941166314950150 11182 +11899193161715314690 11188 +14588596966269452804 11190 +4213229976875559425 11194 +10205825920380210693 11195 +7216049243579964420 11200 +17578053802661252099 11204 +10514356363569884167 11207 +2556646560556987394 11214 +6879334496561489924 11216 +8146936484868087299 11220 +11026397679541020165 11223 +724511193781136387 11228 +1118869734600265218 11231 +6246060925330801672 11233 +12257895992918343171 11241 +17201080322637372419 11244 +7626471590372201986 11247 +11529599594718801413 11249 +2552545869179837442 11254 +2550046785936475140 11256 +1007516427946882569 11260 +4809129704666936323 11269 +14481315631460533253 11272 +484714727624545282 11277 +3251320932981051399 11279 +9224572798749334534 11286 +13960039649393095176 11292 +2527199495443013636 11300 +0 11304 +14251949224430335491 11304 +16443398795839950850 11307 +13675043717147498500 11309 +17674458959480348675 11313 +837664098620686337 11316 +11347803409205255171 11317 +10696956973550741508 11320 +1286058183080222726 11324 +11971438697837447682 11330 +11949895056904086532 11332 +16785308873418195972 11336 +11580394380017848322 11340 +752833740082058244 11342 +7300626039454341637 11346 +3464410858727497220 11351 +10214323367710306818 11355 +4226390438671988742 11357 +5192153527954599941 11363 +4208795513238938628 11368 +4074546634213097986 11372 +9328692032325888519 11374 +13879565382634964484 11381 +8523012120390553093 11385 +9781799678465541124 11390 +16999132684508087810 11394 +14965382244146599940 11396 +4039957194617238021 11400 +5641064546546222084 11405 +7773734381186246145 11409 +11700840157828629511 11410 +9988387808822646786 11417 +3101092822690895877 11419 +4925750442054927879 11424 +2806628975738385412 11431 +7337817910683785732 11435 +2430127008423566340 11439 +3110299353314168326 11443 +11168088829157185538 11449 +4937351052854612485 11451 +122789162757143555 11456 +5899440680552416770 11459 +196815030803744774 11461 +1102562108399689221 11467 +7615471246591894019 11472 +6320668514970862595 11475 +9729983625348401156 11478 +17439815051730790403 11482 +3732993151579905542 11485 +16933735290147658755 11491 +2527578414269006341 11494 +11475892927166490118 11499 +12363016859220715014 11505 +11784510983410048004 11511 +11216506769574831621 11515 +9883305125908721154 11520 +4543952436927558150 11522 +9375703328526581764 11528 +5022007896808286212 11532 +11528435358179693060 11536 +14369907718325447169 11540 +11624197752628697601 11541 +8289446848382385669 11542 +1134497595334496771 11547 +9524059651490541058 11550 +1805201049675016709 11552 +6087759071230801412 11557 +18073450824291842056 11561 +7440194958442858501 11569 +10956992957406439938 11574 +5813887236674435588 11576 +4196941427900612100 11580 +12853033890724614660 11584 +6321915283148543494 11588 +11121511380206152196 11594 +10744540697894481922 11598 +13475033041988394499 11600 +11338352116467866625 11603 +14483700335137404425 11604 +4220605630509392899 11613 +15408638056971565057 11616 +18411271730864539140 11617 +0 11621 +7908830646493152259 11621 +10960308154693927432 11624 +12890583694674219524 11632 +14126220955502452227 11636 +671881071508416519 11639 +14540686100550194180 11646 +8080426496093389316 11650 +793408666177019396 11654 +11041549464422131715 11658 +12444376377594886149 11661 +5269319378866068483 11666 +10764379397018063875 11669 +7715642089226824710 11672 +14499723644079371266 11678 +16872276318702753796 11680 +2417316901253786628 11684 +14829034836166967297 11688 +16119729411853297156 11689 +5586414521200662529 11693 +7662077668075879431 11694 +16815017570638535172 11701 +13396004237247963649 11705 +16152492051115616258 11706 +12323320132542714887 11708 +5417266946471406599 11715 +16803132181785974278 11722 +9101963319941619717 11728 +8035008619028585985 11733 +10764101307453480453 11734 +1800024375228168197 11739 +11458697004222661636 11744 +14727644881314815489 11748 +17551303869501533701 11749 +5959827558039317509 11754 +15202672336687799812 11759 +4283431635167923202 11763 +8734380373273686530 11765 +4262485275756405764 11767 +12594072462360838661 11771 +684683154496570882 11776 +4918427814352280577 11778 +5129847503357117958 11779 +10710994192738411010 11785 +2324547631037313540 11787 +10820942229815769604 11791 +9164840133370620930 11795 +15730161377415111686 11797 +135526486657414147 11803 +16335672019816221704 11806 +9184479001184012801 11814 +2467217941231852547 11815 +8449979239170505219 11818 +17759643417727121927 11821 +18421697790984787459 11828 +9148352704683275266 11831 +11960411373610092548 11833 +9267324891548643843 11837 +2104752967208612867 11840 +12837866349177021956 11843 +6978050858501219330 11847 +0 11849 +17197169921099728904 11849 +12449737246780182538 11857 +15934994634621095432 11867 +18121197743603551745 11875 +10356044376851739654 11876 +9110958103367124999 11882 +13384118276588382723 11889 +2691730305297498627 11892 +9720989779413832200 11895 +1672758169902001670 11903 +2689099471760307205 11909 +8261191872770018306 11914 +97936805815846917 11916 +3591558727743469063 11921 +17748250023077504518 11928 +9940787544853376002 11934 +10782343357978330118 11936 +16458406871667798019 11942 +1209015949473638917 11945 +16593649076891501061 11950 +7644314613266988033 11955 +6822631449025149442 11956 +6513333559029278212 11958 +2850725430935374853 11962 +5018741255211041283 11967 +5940383982491771396 11970 +10124086480788074503 11974 +3412441014927308291 11981 +9953597667540445703 11984 +4864100905589891076 11991 +8806126181668391429 11995 +15232517647171385858 12000 +4789070581446016006 12002 +9260925724752190979 12008 +12390847324955616772 12011 +8549690607855831553 12015 +9988051011008222723 12016 +7820881760976749062 12019 +10298103787562486277 12025 +8425766985990386183 12030 +5849329621323319297 12037 +17833504193896216069 12038 +15295246333134578180 12043 +12941734381959917059 12047 +16764318666789715460 12050 +734822185841417732 12054 +8244265491793251845 12058 +1566348886389779459 12063 +7653370848210455045 12066 +3251144711136833029 12071 +10842650051686245381 12076 +1026048992129572356 12081 +6088419056706993667 12085 +1281748476873197571 12088 +14952174006564163588 12091 +6883792908789536773 12095 +17839224634999510532 12100 +6189108567839499266 12104 +17343850161894566404 12106 +7113093543791171079 12110 +10114880328300157442 12117 +377347303028533249 12119 +6224603039766742530 12120 +12355103884216335366 12122 +16737091616332412934 12128 +2159866543327791622 12134 +12466116807289001989 12140 +8615070283159622148 12145 +12521005827075802118 12149 +17973176628501203972 12155 +16161303949157627398 12159 +10702132657690109955 12165 +13392556155568626692 12168 +7829123165688476163 12172 +3192915896887454214 12175 +2302836661745699846 12181 +13463945416543066117 12187 +9947646495024099843 12192 +5095185383511966212 12195 +15476028824659960835 12199 +919995268913232387 12202 +18411542948690075141 12205 +17228309860115289091 12210 +1330747735785677316 12213 +2272323294375504900 12217 +0 12221 +1409306687143272967 12221 +13558502245424646658 12228 +8101532820265541124 12230 +9551986035346209798 12234 +9597056011095607298 12240 +9072572891354417669 12242 +7343149358357483013 12247 +5396297979264095747 12252 +10693892919328200711 12255 +7275232692581195779 12262 +14283975878078971395 12265 +16800865241612676611 12268 +1771335962175753225 12271 +10634600611773986306 12280 +9536230143330255363 12282 +11216643478255276548 12285 +2086644294868092420 12289 +244235392278005762 12293 +17615395995850942981 12295 +1866835162205435906 12300 +8050817453145175557 12302 +5593733843084418053 12307 +8948368968362631683 12312 +9776332564144198659 12315 +11054728415635476482 12318 +12887360915500263428 12320 +8004258980589309443 12324 +5824957351403101699 12327 +1306575842956147210 12330 +6556904374360664066 12340 +15507887085999571976 12342 +12689940590681966081 12350 +15593841968333985796 12351 +10150998601987399684 12355 +10550861511248557064 12359 +1642411134178346503 12367 +15363639207087732230 12374 +16168932352190653955 12380 +14131474075039686148 12383 +9110005701515438596 12387 +10020841114808969732 12391 +5022983465028140550 12395 +17322106105271647747 12401 +507933302503968264 12404 +11710451876359813638 12412 +1719870486728486915 12418 +6708572995942089219 12421 +8679441226610591748 12424 +15635535359727009794 12428 +1402827359192259587 12430 +7091489807456508933 12433 +39782756735598598 12438 +5068685990468381702 12444 +15490933234591310850 12450 +15980404161292361220 12452 +13300914952633740805 12456 +7825193060172540931 12461 +8297243368534124549 12464 +2624674638526519817 12469 +17080103631078268421 12478 +15492906182771184645 12483 +16786885369325090308 12488 +12066744839995841544 12492 +6701405406611581442 12500 +11683067714495729155 12502 +8012763571635284482 12505 +5421305561709540869 12507 +13783722910531006977 12512 +1522094003661129219 12513 +12213059873199473156 12516 +12008775520750393348 12520 +3772316197859102212 12524 +8753786881142352385 12528 +17126637381426188290 12529 +14678035165464540164 12531 +4407476763453275652 12535 +1338387619197301253 12539 +1334779608632245252 12544 +1037505307683411459 12548 +738634573951907335 12551 +14606749679911958537 12558 +8451450186414949384 12567 +742620921119909381 12575 +3482234059356768258 12580 +1106044625641494023 12582 +2748930953493723657 12589 +16740671437274518019 12598 +12515362184666802692 12601 +15302309773198512133 12605 +12375159534900478980 12610 +4402808221230731779 12614 +6176554780121083909 12617 +111460641355636225 12622 +2461531627388547076 12623 +10396381530032465923 12627 +8830757121507886596 12630 +16445664343594344964 12634 +10540873349857360393 12638 +14351719411419074056 12647 +4202157326116199430 12655 +15157715528854569476 12661 +15494201155049012740 12665 +5980652110161722888 12669 +16776540997876853761 12677 +0 12678 +8085601381819078660 12678 +14820555613473665544 12682 +1551830839408625667 12690 +4410551168074844164 12693 +4303335092362053123 12697 +4584436899763529221 12700 +4151252594069894150 12705 +12028593533484335106 12711 +3664764605397847044 12713 +3735618945057156612 12717 +10686682756384731139 12721 +5713432592713264132 12724 +12184460424241961989 12728 +16115860231705972229 12733 +12640297722992302595 12738 +3207424397621216771 12741 +18365975150748949511 12744 +0 12751 +874128735375975429 12751 +17682504209552385540 12756 +395717387149914114 12760 +7496882967109493252 12762 +7406368392467737092 12766 +9467253292174837762 12770 +8813145586120196101 12772 +9176324315702061058 12777 +13083082389509254145 12779 +2664855398940126213 12780 +13911219121258892803 12785 +16168182651636749828 12788 +12762280619893154823 12792 +3605365661261316614 12799 +9983397168978420741 12805 +6091693410635192325 12810 +8990713287527744003 12815 +5810073777845858309 12818 +11602058060275494917 12823 +16466926480187503617 12828 +13558712582679734278 12829 +10681617610569909762 12835 +9449048813789703170 12837 +16795850147604766211 12839 +6469571288642259972 12842 +12878310461733147139 12846 +277712063626750467 12849 +4031722453645824001 12852 +1368967617269859843 12853 +9265904878882356739 12856 +6378080977954638342 12859 +15499196841035433987 12865 +6022303701005722627 12868 +4521428849047063046 12871 +7990499471384007171 12877 +14704434112887426565 12880 +0 12885 +14232118470942950402 12885 +16826651839575227394 12887 +3311617368368316421 12889 +6156006830844317701 12894 +3784783320149545985 12899 +8435059930785239043 12900 +16476927023013934087 12903 +17799976522850725377 12910 +8962990841790751240 12911 +4976243636126684162 12919 +18247083344213308420 12921 +10535088088651193861 12925 +8505692237593032196 12930 +2887248052728911365 12934 +8477568421101916165 12939 +7690967939773748228 12944 +11662969793419976707 12948 +14674500384262248450 12951 +3982607603648349699 12953 +3351326442993710596 12956 +9928278498671247362 12960 +10725830396458998276 12962 +16877285202060454405 12966 +5975974268385461255 12971 +6618433889847541763 12978 +5458995013779756040 12981 +2561438321282175494 12989 +526562628858116103 12995 +3154498664269529094 13002 +7326463366314692099 13008 +12683002459583515141 13011 +14969796529319686148 13016 +11310028685797464073 13020 +10374647824241151492 13029 +12457607131815914502 13033 +2629361385005003270 13039 +3934138696636643843 13045 +17592070179586611203 13048 +5787868090402548743 13051 +0 13058 +249101697541922818 13058 +9341105933843206657 13060 +15290650547107936259 13061 +5085416195828322309 13064 +17780083510131108355 13069 +6073582897354301954 13072 +1861758705998650377 13074 +1827464157367311362 13083 +14281240626218445829 13085 +230812851749767687 13090 +15336676406305707524 13097 +6504952992746931715 13101 +11641565561286904324 13104 +14397647611077603843 13108 +2981078365805867011 13111 +1343512092493653508 13114 +11087464019135501314 13118 +6389978330749003267 13120 +15792991995959968770 13123 +4929449882497278469 13125 +9896586316734121989 13130 +17035226453889263105 13135 +1361432712074935300 13136 +5936797172025595911 13140 +10727876211413576195 13147 +18090890061574378501 13150 +2367501597276007939 13155 +16389194399068901893 13158 +12233617723961963524 13163 +12782701118121478149 13167 +8332974749268352005 13172 +8664024917394291718 13177 +17409065743296257537 13183 +15544671678668894724 13184 +16444121636700375042 13188 +7998792555974696964 13190 +14254468822324040706 13194 +7191869983133067269 13196 +13221965157041079809 13201 +2812128100518319106 13202 +8737973866086119940 13204 +2472143319905285634 13208 +4015389560775212549 13210 +16405277759063541762 13215 +18373015480731668994 13217 +2222800951854735364 13219 +9076222882063055362 13223 +5463261565169016325 13225 +15028912708602416645 13230 +13327477513656130564 13235 +10609970447590550018 13239 +14883683222943512067 13241 +15915184934476600323 13244 +13234193589776887809 13247 +9306581257450415107 13248 +11737562110548500994 13251 +8987859934004121609 13253 +9052251540778657794 13262 +8654316200716056066 13264 +6667343090162345989 13266 +1379425201411386886 13271 +5012838612239312392 13277 +3271382726083460100 13285 +9518141596909139457 13289 +13298258045414991366 13290 +16550434707408421891 13296 +8260369642872951812 13299 +10316974938300122630 13303 +15895992116438206466 13309 +14253257549576810501 13311 +15905414113282233859 13316 +10450217779668455432 13319 +15745177255811068420 13327 +14738509606228518918 13331 +5101125473620697602 13337 +6690155177328710150 13339 +0 13345 +14424586673053215749 13345 +15029552587684882436 13350 +12550323859755323399 13354 +9293961748678471682 13361 +637431922303270916 13363 +16242038891494284807 13367 +18158610299059895811 13374 +10251252154038536194 13377 +13190824639439536132 13379 +17160625256504558593 13383 +13526570939763796486 13384 +15724797160603523075 13390 +16038204540993179140 13393 +3466976566687046148 13397 +4746827244448541188 13401 +2467599623356338691 13405 +6450358447913712644 13408 +16015439547371570178 13412 +16984268073598992387 13414 +14234905064360479241 13417 +413979451247037444 13426 +14011034604228384774 13430 +2702942300832205830 13436 +15705520753702884865 13442 +13990397065796725250 13443 +1700507247365810691 13445 +10233012312918380549 13448 +8853086510181360132 13453 +13203461381707802631 13457 +17212903010661554184 13464 +15172926267671686145 13472 +16113909410395563528 13473 +12379157908474554881 13481 +1245526834105052164 13482 +11058899814393380362 13486 +8681035516024660484 13496 +8766625987780981250 13500 +5472062122994503173 13502 +6007984470031090694 13507 +7287601931931166211 13513 +13183494183604624389 13516 +7905126925285846020 13521 +12586856455282386438 13525 +13634829401450904070 13531 +169398828418722308 13537 +11096850462726854146 13541 +2164371344392353282 13543 +6312641344718251521 13545 +15674437275514428933 13546 +3736152607802519042 13551 +5597556059136936452 13553 +8103905983112059909 13557 +11665877704992283142 13562 +6107730383487737858 13568 +9480185867277071874 13570 +7933805917534836228 13572 +5955519866919602695 13576 +13900430609802251268 13583 +12349122850452672005 13587 +14528719996910371336 13592 +12251338381283026948 13600 +2710795378109574147 13604 +11474241274732521476 13607 +13427658615735932421 13611 +8912266582484875778 13616 +3722801593636583942 13618 +16550391083892760066 13624 +13619354357858119173 13626 +8727836908946314759 13631 +10563781646847648262 13638 +3291740889350237188 13644 +18340625656411848708 13648 +7353833775340271622 13652 +6036515220748342787 13658 +2682934860218721288 13661 +0 13669 +10890969403669502472 13669 +1698818198644982789 13677 +8144618548815390724 13682 +8177124160264739334 13686 +9190729491733559816 13692 +13247191018055501826 13700 +8926812079026545670 13702 +11808868806009021959 13708 +10254160684107980802 13715 +9941943579579235333 13717 +15064437367324982276 13722 +18389204596430512135 13726 +3333761312886460418 13733 +16881966811642694660 13735 +15682769088423447043 13739 +12370022231708974083 13742 +3233049317900694020 13745 +10842408673598138885 13749 +13609778797650313222 13754 +15209499715364805637 13760 +9763002843937506822 13765 +16382902616425899013 13771 +8300850623972471811 13776 +11301215180861748227 13779 +11943663704734270472 13782 +1970177222978480643 13790 +2728257043619592709 13793 +4447462726414004225 13798 +15714645760815263237 13799 +12505399810250688513 13804 +9384932016292151299 13805 +16443297417377086469 13808 +7824591865108749316 13813 +16390957546589817351 13817 +16237140166470359043 13824 +6672447926510548482 13827 +14740775713137359365 13829 +8086104570442646020 13834 +16934459538060041735 13838 +344608878680645124 13845 +1612881165219974659 13849 +10893446418135496707 13852 +16261100821940120582 13855 +11292019982035407875 13861 +6889608317950726663 13864 +7762564524976370692 13871 +12464524485899140614 13875 +828527740310496265 13881 +1978049814964993539 13890 +6150693879050872323 13893 +7567970882354841089 13896 +8846788660638257668 13897 +9177091723105666563 13901 +4848822580892926470 13904 +11998110737987011074 13910 +8403025933710118913 13912 +1782044456537587713 13913 +6628374549372231174 13914 +3770776917186945027 13920 +15238137142781946370 13923 +3403477472363952647 13925 +14217636911428752388 13932 +7720504953769980931 13936 +10824675402192857605 13939 +11205476317417691140 13944 +530907111560936963 13948 +7267800635730292743 13951 +7979476521241451524 13958 +772950757191361026 13962 +7308382545129813511 13964 +5581653184418330625 13971 +1404016297970731011 13972 +5923900764325945863 13975 +12788777595197221383 13982 +13176683084257986054 13989 +17092599070045406213 13995 +12000054740192119809 14000 +5743268545850883076 14001 +15003777886770376705 14005 +11887510677488354819 14006 +10849049503752227331 14009 +0 14012 +18257514161084279810 14012 +5331233094892482051 14014 +8131338916424816132 14017 +4318587594053384194 14021 +17044919741453138436 14023 +6226443437510115333 14027 +7636034538211622916 14032 +7840025245928041476 14036 +8502177283466699781 14040 +7007375347545144321 14045 +2630988339218816004 14046 +6597455680256593416 14050 +13574507751253758470 14058 +14646087592261363717 14064 +8789088639606877698 14069 +16765227370905912834 14071 +10913076804610375684 14073 +13542085230779471367 14077 +1516263824172228102 14084 +4980660004781899779 14090 +17041034259515841027 14093 +15295713059175936003 14096 +1314856351920834566 14099 +6085373326494205956 14105 +3408355230273542148 14109 +3598868088051944451 14113 +6331232095249723907 14116 +8889296217906839554 14119 +14939916878160028165 14121 +1549820871959159810 14126 +2035377455936267785 14128 +13544041940535709702 14137 +6786320352325362181 14143 +3616012417850329093 14148 +0 14153 +9009975974837469189 14153 +17278449188133835266 14158 +13333796790334740487 14160 +4141365993250499588 14167 +13493776093427685378 14171 +15673105033383497220 14173 +13502354582584595970 14177 +783026207537476100 14179 +18312105660177731589 14183 +4759999908913998338 14188 +13797171204681282051 14190 +16147726355394311684 14193 +10664053175419882502 14197 +11498675070376913923 14203 +17418067484174057985 14206 +6052299949734239236 14207 +12133816823200052740 14211 +3872785641234978307 14215 +7869397762735653380 14218 +7760535495823383044 14222 +9780447862789132804 14226 +3082660101601285122 14230 +0 14232 +17038889871022831109 14232 +11440376238610710531 14237 +12777470487069713923 14240 +2816918459507549700 14243 +4910840330853004293 14247 +959690055199633413 14252 +4994912192868970497 14257 +7646413144552235522 14258 +4385495935413401602 14260 +1312851003845759491 14262 +13495920265503305222 14265 +7347347531544706564 14271 +7253265878071375876 14275 +10533626817864283653 14279 +14170852681931957763 14284 +5039297447980355076 14287 +6158726336145742342 14291 +10977479425404353540 14297 +17936869497345324552 14301 +11039045650689328646 14309 +13632071864698171402 14315 +8907674009331629059 14325 +3987825744088740359 14328 +10338687178644750849 14335 +7551809965276372999 14336 +13623165015234993666 14343 +13715748827540060675 14345 +12834555057410231300 14348 +3108161733832090120 14352 +10430435145635995653 14360 +2107558887925815810 14365 +16329224573067338754 14367 +11041121225175689732 14369 +14722305291351145477 14373 +14627758191016025091 14378 +16285346467687875077 14381 +8780091672975044098 14386 +13472631295160121347 14388 +14688798700506555913 14391 +6320745602974929926 14400 +14261962534315353091 14406 +11072928817707714050 14409 +15300245014524487172 14411 +9472629617981368324 14415 +3726306393712333318 14419 +18196225523998769157 14425 +10960387675061327362 14430 +5527203764909828099 14432 +808895199609813505 14435 +10847599184611396609 14436 +995587497922589698 14437 +1590538038418046979 14439 +13698374779530592262 14442 +3604960241183667204 14448 +7779757215009681922 14452 +4651628378172724739 14454 +3997471665096460290 14457 +7842624015990700037 14459 +10383605968108846086 14464 +1378286210010515458 14470 +14230439073943196673 14472 +8231064682278646785 14473 +4254911660142687748 14474 +2815669530176048135 14478 +18351388644009324036 14485 +4010598364334879237 14489 +13812154014309658118 14494 +18049405260160207875 14500 +17476874638703301123 14503 +11387403184802898951 14506 +3153553365208555522 14513 +3714166768980414980 14515 +3046827821235887106 14519 +12203036360005396481 14521 +2060300423105750530 14522 +5072803955481498627 14524 +8653510352353633284 14527 +16326306854398076934 14531 +14277263551013196804 14537 +17485054539146397698 14541 +10048462705876450817 14543 +1457401363940943366 14544 +2904806108682432517 14550 +8992431016145113096 14555 +3285637878506178049 14563 +3933280403607144454 14564 +8936444236783751682 14570 +14877827260744498692 14572 +7271084811294010369 14576 +15336704815572067843 14577 +17920314279788389891 14580 +9333136389766215682 14583 +7697736606942494726 14585 +18240141339548008964 14591 +5290780370698074627 14595 +5751882114671170562 14598 +13408143094652873220 14600 +2861090066567456770 14604 +8046326189812894209 14606 +3674796185120295942 14607 +14555010058367218184 14613 +1842362937766169604 14621 +17589542025538129414 14625 +4925548736351579141 14631 +16595449900940600834 14636 +5346595429221873154 14638 +15415850625781663237 14640 +10913037308095071749 14645 +17389698812367023626 14650 +9498470104164944390 14660 +7397278380249509382 14666 +15177961788576747012 14672 +15145696386535605254 14676 +17022387045549769730 14682 +2238803001465201667 14684 +6075209623694060549 14687 +12198282152044282372 14692 +0 14696 +5659268175422108163 14696 +4253120343819312135 14699 +15010725024791859716 14706 +10296194635016570371 14710 +5604970157839490562 14713 +17507103276998423559 14715 +14393900269366629890 14722 +17894881938514285573 14724 +0 14729 +0 14729 +1298660425000043529 14729 +7171678753326287876 14738 +6562754699876989957 14742 +1196730925699526658 14747 +11449002762213251074 14749 +15268563437451918342 14751 +9065264847984203269 14757 +10622993989326306819 14762 +924604109983810052 14765 +3453077896343089670 14769 +11731462205925408262 14775 +991269974490604547 14781 +8980384891536506372 14784 +5613065549489812995 14788 +6666524356174842888 14791 +14105327515074216456 14799 +13263744247688051715 14807 +16810876388642847747 14810 +12990671777312954371 14813 +8840598492381898755 14816 +767897363021437444 14819 +3314365532383032839 14823 +5161817739191354373 14830 +14298184800217493507 14835 +14141197185590285830 14838 +16520972368247089156 14844 +2377678234797769729 14848 +10399625816314890247 14849 +6941307036840197636 14856 +14756845413506277894 14860 +16899193381039454210 14866 +14319950943807595524 14868 +15520328798727682565 14872 +3263086050398303235 14877 +17866460781639129605 14880 +10470237091975768579 14885 +1652879471744849415 14888 +11255476856644426246 14895 +8902949825250266627 14901 +17238190743009251331 14904 +3307280448802360834 14907 +10058079898544953350 14909 +1419759444389052935 14915 +8390720631461911559 14922 +15743223111540787714 14929 +7133091938692165125 14931 +12708599562845006342 14936 +5867384900460402692 14942 +1444368202739845126 14946 +4586714095813959688 14952 +2798753527173000196 14960 +168473019937010184 14964 +3910489047229974020 14972 +12372891012742395395 14976 +15195386080855117829 14979 +18153725033610027011 14984 +7315039806348404230 14987 +16401136584870738946 14993 +6449596519611696646 14995 +1659262119740230150 15001 +17581047245710211587 15007 +16161380005657760262 15010 +10939006714167719430 15016 +15269492797971609093 15022 +6700147092166814723 15027 +7923098964720423429 15030 +689487607343764996 15035 +13779494186256003591 15039 +4789739600904136705 15046 +17635248409557391366 15047 +12142679551509594629 15053 +3096388490794904069 15058 +927409437949131269 15063 +12333631308183633412 15068 +7068502980000364036 15072 +13069341190937915393 15076 +17779074742089273348 15077 +16386664986328106499 15081 +10350575001669524999 15084 +6321774527599540226 15091 +16270029058184505863 15093 +1077766061298937861 15100 +13558224899982736900 15105 +11136051843626819591 15109 +11055752854096537092 15116 +9052776164010900486 15120 +7768862568680176643 15126 +16094168378216287745 15129 +13919099648905714691 15130 +6628498361307332098 15133 +14786896093420804615 15135 +2578878532993067523 15142 +2213442428083363330 15145 +7760678568086374401 15147 +2131548102570356743 15148 +5751548007406588933 15155 +8716796819508705283 15160 +5035383406551641092 15163 +12928125543870038019 15167 +13442419185582573570 15170 +5668561530842196484 15172 +8123952876358065157 15176 +2046683892052952069 15181 +2843100065289358337 15186 +7651738694326678022 15187 +9690639476570462724 15193 +2775773534373272071 15197 +14418400500098954241 15204 +17336224053286611458 15205 +2491990846729884676 15207 +11294055707834033154 15211 +3753562386954352132 15213 +2508766928500689412 15217 +0 15221 +8728521158654600706 15221 +2686410408744322564 15223 +14473248549494521859 15227 +8972049629866044424 15230 +11667900987411980802 15238 +8197642347684603396 15240 +9061639312202392066 15244 +6149429416248440324 15246 +7490444804365278726 15250 +17761700129458453505 15256 +8620095821511166982 15257 +926399190350812677 15263 +7407890588882912774 15268 +5356940668430455301 15274 +3349104872264632836 15279 +1652630511555077634 15283 +10951499359352679428 15285 +15938041053229094919 15289 +5199368564116424194 15296 +15486831040091271173 15298 +5078367452700587521 15303 +16700641648352967169 15304 +3865302633464716801 15305 +2353274821400005125 15306 +8643281180950917633 15311 +13574107705803871236 15312 +9457134699015983106 15316 +13385939340274043909 15318 +9752668258101721091 15323 +5719778531808112647 15326 +766611518863043075 15333 +13772547686466184706 15336 +3657266875648225282 15338 +11996819912632866819 15340 +687437273254486020 15343 +13255769753892854281 15347 +747577616738055685 15356 +7055940814831049222 15361 +6157949265182022146 15367 +5655918058823605764 15369 +5210176088204630020 15373 +13554151125448027651 15377 +4798083306110681095 15380 +12204750435978096646 15387 +8852151826510345217 15393 +12798827919122154501 15394 +14740838290773535746 15399 +4309323069315187201 15401 +5702799191447370245 15402 +683299608493353478 15407 +5051955787599012355 15413 +13398403930937562118 15416 +1531915343020655107 15422 +17188516428500960260 15425 +16124250279683355652 15429 +1764098375135595525 15433 +9097876736931319815 15438 +17869095292263499781 15445 +11649761591729391618 15450 +16561376165694188549 15452 +5201378040639933956 15457 +8758092541852463617 15461 +11976798349817503745 15462 +11266391559708652039 15463 +8484683831411981829 15470 +5221985805395733001 15475 +6936749646563686915 15484 +12244752263107646979 15487 +15891887731485541379 15490 +8392273606485181957 15493 +15133153510599311874 15498 +7836571529301832711 15500 +14080286549764188679 15507 +13068983096696674311 15514 +2006078626274936836 15521 +12202363173998758915 15525 +13104853774190801411 15528 +14863551843389420036 15531 +7539250977380289027 15535 +1552949661091337734 15538 +5573697616868311046 15544 +2944087935137007108 15550 +14484678358485036548 15554 +16130729329905474561 15558 +3092656536438436359 15559 +3611746164122124805 15566 +12586950003497402372 15571 +18065892141336194050 15575 +2496768376782397955 15577 +12062805661117606916 15580 +7824886124865325060 15584 +0 15588 +12760389217582571011 15588 +14121713469640325125 15591 +17999299023678124545 15596 +4754184563243073541 15597 +7483579988306499078 15602 +7956379304936072706 15608 +844694536158194180 15610 +13057764355138266113 15614 +10466772133932454919 15615 +9507030137558141445 15622 +4439560788326429700 15627 +5216532451466159620 15631 +9505366037295340546 15635 +11739318461063968773 15637 +7213285389865933828 15642 +12341323523164178949 15646 +9178782980503943173 15651 +7703462595048093186 15656 +5521594976002276356 15658 +3123603149719211523 15662 +12621182801627492358 15665 +8385293365191145990 15671 +8727159053844526083 15677 +8948544765707203074 15680 +17455475936845596164 15682 +5288417791676919813 15686 +190631987331009031 15691 +17087027999035004930 15698 +6609729664297506305 15700 +17711760889774320134 15701 +8374984389264745474 15707 +3112916689274964996 15709 +7331164788938994692 15713 +12196295269673696261 15717 +12927261340892633093 15722 +17978854320027649543 15727 +17461152836258146309 15734 +11865638569184484867 15739 +1199958996117990918 15742 +8678912280144543236 15748 +9766720881391520771 15752 +1428712719554810888 15755 +14971042759139292678 15763 +5560434780012563971 15769 +9767149813435731458 15772 +6989914397873855491 15774 +16927709224437883905 15777 +5782116024290385922 15778 +10333920830091902469 15780 +9056876495191724036 15785 +13054225123009053190 15789 +7984517122720985604 15795 +10631728965346826755 15799 +2258366780721174532 15802 +12054954574885901313 15806 +13335816484972704770 15807 +3783695405842912771 15809 +1033364660225402375 15812 +5684713302316976648 15819 +17548362261586895365 15827 +3342250254644404739 15832 +9812330173792421382 15835 +10874079939479873026 15841 +18099546285516091906 15843 +3282364113389692419 15845 +249095135310879237 15848 +14975524893918032902 15853 +3327418627228950532 15859 +2982886423678641668 15863 +15751874937635127813 15867 +10844265018789715459 15872 +12489338108337053190 15875 +755479110489958406 15881 +0 15887 +13708788513260689417 15887 +2749888616534478849 15896 +9636645851910313987 15897 +11869793344042069509 15900 +5320991923474129410 15905 +2619930589985167876 15907 +0 15911 +10792642013652267015 15911 +6585203347170257414 15918 +419359807915877381 15924 +7771920195516088323 15929 +9868097678590253569 15932 +15657160589599684609 15933 +13438099892401364483 15934 +10778873674151911941 15937 +2271910222897332226 15942 +1998108977744548870 15944 +14140450484536032771 15950 +3208998299026743297 15953 +3501502426430923267 15954 +11486198959334765063 15957 +2761255764450992132 15964 +2321570412977651205 15968 +8541808547406124036 15973 +10023401179390026245 15977 +4258888870272963078 15982 +14156734669007975427 15988 +5729830697068871684 15991 +11139135665159838722 15995 +12011408787839707141 15997 +6695880794815855110 16002 +5781495723767517699 16008 +8569845114130515969 16011 +9499355552678048263 16012 +2248440303564598274 16019 +11595402592607535106 16021 +2932725983249549826 16023 +3133211214208809991 16025 +1768113985732880388 16032 +4111692847180884485 16036 +12100749234268697603 16041 +7805481597971446278 16044 +4608047927390920198 16050 +10170754521675705863 16056 +17658000065149003270 16063 +10552454198262614018 16069 +13010382514576504327 16071 +14522135373803654661 16078 +2367947660135938562 16083 +14414261980876430850 16085 +17173815458026456582 16087 +15216939188287693830 16093 +13993190405979435011 16099 +8344983156804591618 16102 +10504066987000811010 16104 +1304321993809333255 16106 +11465644334175134216 16113 +14445940515832860676 16121 +789984667580952580 16125 +7248964449278203397 16129 +16369267969303261189 16134 +18193708705981115395 16139 +9309836431132274178 16142 +6920018385803424265 16144 +10923595787250462726 16153 +8257595281108038660 16159 +1864172796201735170 16163 +1914572024878798851 16165 +13076202776970055683 16168 +5024752612887831045 16171 +16991458392906301957 16176 +1675404290888124421 16181 +9262404939486988292 16186 +15843076684082547715 16190 +15634574000836647427 16193 +11384561229295347715 16196 +9186215307525330433 16199 +0 16200 +15926172719395225608 16200 +18178337220792329735 16208 +8681329367772078595 16215 +12132431800087195655 16218 +2350574933552497153 16225 +9336365037016981507 16226 +6621140273852296199 16229 +6510465217023921158 16236 +809213127820757508 16242 +3566956996893005826 16246 +442461800311191554 16248 +17602885264647227912 16250 +12499555744293475846 16258 +7472817672454638084 16264 +1241426168079179270 16268 +16264953584216460291 16274 +14497246645085584902 16277 +12567631886224771588 16283 +3873666318297940997 16287 +7909503270361565699 16292 +13861604735671500290 16295 +138469117356679171 16297 +7151469781238857732 16300 +12744836509061908994 16304 +14987387734545991683 16306 +12617694297473789953 16309 +11241966256719896067 16310 +3603342094109643268 16313 +16010603665201581063 16317 +14060031002472908805 16324 +17195861919385762819 16329 +4076353850100811266 16332 +9485282208659906562 16334 +175592869961205251 16336 +3141613811036190725 16339 +5422662250330551301 16344 +14009632151253523458 16349 +10112330939611039234 16351 +16557870780259964417 16353 +9836209563032038918 16354 +14241855743050633224 16360 +7631509127890675717 16368 +7226503217088593923 16373 +763122632749542406 16376 +6688242590025622027 16382 +3074156263523128840 16393 +9474847376272651777 16401 +5803987997174168582 16402 +11411937467782560260 16408 +15354185475493971974 16412 +13682122397230060038 16418 +14115734780573701124 16424 +3933314776264269316 16428 +92225890385477122 16432 +10831764426726875651 16434 +2218965560302346242 16437 +13561344058473694724 16439 +3073234565033522697 16443 +10820661560508100612 16452 +9269362997721353729 16456 +13745179360179365378 16457 +11445324282022925321 16459 +16310297929601254401 16468 +5173284435504957445 16469 +8818608462280786435 16474 +17457064862303630339 16477 +2463812236695630342 16480 +7145667179870722562 16486 +10725603603131387908 16488 +10158680435551595523 16492 +14412413416154549253 16495 +17428881339267963907 16500 +4106305643566539265 16503 +9676142751927004163 16504 +7453315425601537030 16507 +7598940329309103621 16513 +10526581927101472262 16518 +17935104779805958148 16524 +3758673756433922 16528 +9596639824281552391 16530 +14369992752154610183 16537 +7693215610240052228 16544 +17551403411195354117 16548 +13019630222256981508 16553 +4020156263742367235 16557 +14606649945293132803 16560 +8842084694740752391 16563 +2798600913872307207 16570 +3757592654277478919 16577 +15446249856433497090 16584 +17693153833701310471 16586 +9910925777138561547 16593 +13055510764856512515 16604 +10023874267673358341 16607 +957576927234570755 16612 +13917824508933583370 16615 +168178799679481862 16625 +15448684507434894854 16631 +6930214542015929347 16637 +8136286497233346051 16640 +6807992015092897285 16643 +8431678187179216901 16648 +9537496552673034755 16653 +10681001332392954884 16656 +5732754446687323653 16660 +7155447098470747138 16665 +11375780855155008003 16667 +12124239004019506182 16670 +16316620824538485251 16676 +4858575946309935108 16679 +9951912306033172484 16683 +3005088234370163201 16687 +15670874274809338377 16688 +728450118747107330 16697 +2270186523438867971 16699 +3943462237345344517 16702 +1336795406894488069 16707 +17575621548435392516 16712 +13967973409047532550 16716 +1568560125693831683 16722 +5481124126807464962 16725 +0 16727 +15595801296699539972 16727 +13785929539824755717 16731 +3366833987180409354 16736 +4000639589162706437 16746 +16717379859232507395 16751 +5362322304379685897 16754 +10782919554701121540 16763 +12948304792450021380 16767 +11436362476655370243 16771 +8749425767385849347 16774 +8387955775608250882 16777 +15174695807753513986 16779 +14369941715221958661 16781 +16291843778958930950 16786 +9692119420233703434 16792 +894358786648325123 16802 +9281978755542624263 16805 +10487630931319215108 16812 +17246313185588798471 16816 +13455791423679050245 16823 +10914862685017077768 16828 +1237309639144574983 16836 +13723811217686563330 16843 +12708780480597426693 16845 +13010194070358237185 16850 +4855412500480280581 16851 +9671431739048087045 16856 +11368682294860186629 16861 +2384776607274351108 16866 +17772805632238230019 16870 +17045277897922533889 16873 +7643559406824897028 16874 +2862657949273119748 16878 +7365591654048841220 16882 +13200274282081143299 16886 +5206989348923612678 16889 +13582831567466913283 16895 +5918607685514682886 16898 +7660329710197792263 16904 +17205627511838614021 16911 +11726191512490381314 16916 +651187604691278339 16918 +17308328751283978243 16921 +6520286040512743429 16924 +4039731127251003908 16929 +12176381596648684548 16933 +4021879114262861827 16937 +11136572910174422021 16940 +13948306154363081222 16945 +12080525035450133507 16951 +11350990226254795781 16954 +8801666769837051905 16959 +15463470987727951365 16960 +10454599059849073665 16965 +14763257105467839489 16966 +648108464367766532 16967 +15248825115691951108 16971 +12058553377371066374 16975 +15789848914979481095 16981 +1641701158094556164 16988 +10727532813164872709 16992 +17544433164488726019 16997 +1675889455378571783 17000 +12356410907025680897 17007 +13333741382346910724 17008 +17258174103076675074 17012 +10086036949652241414 17014 +3814100979877037061 17020 +16366981890481969155 17025 +10250151123007862275 17028 +4173585179778037765 17031 +13373539163194862088 17036 +2688840590792312330 17044 +18025322868874599941 17054 +10551563801354765316 17059 +13211097110030330378 17063 +3784939652408209925 17073 +8642366636316541444 17078 +1540285967082134529 17082 +2293295528221077510 17083 +1747955910061526534 17089 +10636434739450543624 17095 +13743880922049955843 17103 +8063688235303193604 17106 +818368515880918019 17110 +4112190471515738115 17113 +15658313765390427141 17116 +10434318824381541891 17121 +14064367708445734403 17124 +7203675908084158469 17127 +15994884299742145025 17132 +8521133521439942659 17133 +15588122992034079235 17136 +6002357929682310149 17139 +2004980834696690694 17144 +18177821874392132618 17150 +7709561913213189123 17160 +15358741614351922179 17163 +1672562625119075331 17166 +4107884749503929860 17169 +3612196352059864583 17173 +11507634571267751425 17180 +7674449961357663752 17181 +15621287024044979717 17189 +10919701856335109124 17194 +13190581112120989186 17198 +17589141157210182661 17200 +11519964524424169991 17205 +17667249222796163589 17212 +3587487192658486789 17217 +6441660942338496005 17222 +7713329909375029763 17227 +2288890454030197254 17230 +12977255455689313284 17236 +11129254490087007747 17240 +18063928688060691974 17243 +3306155717530120193 17249 +142664115798568453 17250 +11451741210815164929 17255 +5542654909755627012 17256 +12333475172171757060 17260 +4735847404800822273 17264 +18267960802055850506 17265 +3896362544743745538 17275 +16761856957558551556 17277 +11835597171943120899 17281 +4298164157955774981 17284 +4630398237377191938 17289 +3808737322223238148 17291 +9606712972077385220 17295 +10494317942236707329 17299 +2379468378458786308 17300 +10168220436197538820 17304 +9427662550240330754 17308 +1672406101776295941 17310 +6383403659755798019 17315 +11189963840898617345 17318 +7335407141519919112 17319 +747374084929528326 17327 +14538040086767506950 17333 +11196384959340548614 17339 +16356867345244325378 17345 +2271395522745112579 17347 +9876107209196200965 17350 +6921806653371556355 17355 +15181241556352368131 17358 +1174216518821339140 17361 +2012925303007303172 17365 +13931009377754995717 17369 +8047350728976489991 17374 +7438520702964098052 17381 +0 17385 +6684712733158829058 17385 +11332127091060461572 17387 +17002280506553907205 17391 +3514535947133170178 17396 +8526303812761246721 17398 +15870288332532318213 17399 +3881593241366358533 17404 +4222598939663902210 17409 +12565457205517440515 17411 +7918616815569995267 17414 +2875490170152657410 17417 +4298873671750743556 17419 +12444455757948017158 17423 +2366511008555884036 17429 +15883506557566549510 17433 +4577297409817313285 17439 +13778731385799360515 17444 +6782928772034828807 17447 +4994808521374817799 17454 +8407565615033383427 17461 +9692927894032378373 17464 +11724810269885645315 17469 +3659957223801713154 17472 +17870320697510681090 17474 +5175479627339026948 17476 +2258865228760948737 17480 +11117719263156934149 17481 +4988421411945945607 17486 +14163610922500581378 17493 +5954344827416169987 17495 +1347036819365834242 17498 +7198297781688756740 17500 +11239363011573762051 17504 +11622891401327430148 17507 +5597816610907971079 17511 +11573381548281124870 17518 +8492394176876951046 17524 +0 17530 +3193405464725286917 17530 +7738117676361888772 17535 +4685116640649133573 17539 +15794490929205153796 17544 +14063102514943976962 17548 +14529449973527450630 17550 +8522095092813377027 17556 +3182019852541112324 17559 +10321282630304421380 17563 +11768816400257157636 17567 +7352730878026856451 17571 +8455151885060162565 17574 +15655677905815262212 17579 +15623377319174839811 17583 +14352421196997957637 17586 +3453532771091131401 17591 +1401305515470494721 17600 +8332460253478134789 17601 +7694527351354019844 17606 +5479693311151585794 17610 +5836069301968733699 17612 +16094073362137641476 17615 +15462253594350105091 17619 +16772941707642549251 17622 +1782826113570473478 17625 +12819371169152317445 17631 +8686615255597899781 17636 +13222020745636422659 17641 +11082193441184998920 17644 +8179219702327108611 17652 +18423152973478520322 17655 +6282318964517185026 17657 +9871296212321764354 17659 +6041813164201593861 17661 +1749872039365641732 17666 +11666016608641740293 17670 +4721894849099663873 17675 +3489267686533125125 17676 +8592285880196345349 17681 +2043277127001270275 17686 +15188540626593854982 17689 +4557589976809583619 17695 +17922018342133836291 17698 +1297569018372401157 17701 +10482802493820874755 17706 +8102918929463282177 17709 +17541150295575631873 17710 +11566274259309295109 17711 +15930435172371108865 17716 +9822211045426998785 17717 +12295293682320574979 17718 +17102416844099696644 17721 +16781106596862938629 17725 +9091407543898291203 17730 +3519826661826094596 17733 +7833979206721106952 17737 +11435282939726255622 17745 +1114475543480179204 17751 +6371264576379653637 17755 +2310062212136228868 17760 +11963043156725259267 17764 +2860161379056126472 17767 +12821644714798300679 17775 +1012108339891226116 17782 +17436792553805650435 17786 +17818576576565913092 17789 +11076001776201529345 17793 +4534031977629217797 17794 +10189959341430652419 17799 +8990976456741980676 17802 +7713573043408130054 17806 +10222153754423605252 17812 +7423292757267235330 17816 +6961156588553027074 17818 +14269072112074601476 17820 +1980812433319349765 17824 +1785039647471414785 17829 +5676415986942417414 17830 +9745874257406359041 17836 +6959639540668195337 17837 +7525904531215383043 17846 +17380091214338275846 17849 +11329718190243951620 17855 +16209013722115659778 17859 +771952581622631937 17861 +11064948963225182213 17862 +12416577619912552452 17867 +6952828545731272201 17871 +10799577832180259845 17880 +17244026501544257029 17885 +1659713445362397190 17890 +6103827333448853507 17896 +3349098397925518851 17899 +8908983528737799171 17902 +16013925903376609795 17905 +3619342023203542533 17908 +2812027978748312578 17913 +0 17915 +18097738988389760518 17915 +5252931410969472518 17921 +10058934834223504389 17927 +5177593998637361667 17932 +16176382142906264072 17935 +630144026122122757 17943 +3228970261461480963 17948 +13761095648307554308 17951 +12786982902260986373 17955 +17548488329187731970 17960 +15314179616774040066 17962 +6945266860239606274 17964 +12858141179130790919 17966 +167300766313438724 17973 +3438328933435133953 17977 +14021575340728981509 17978 +9732304168962845699 17983 +13942104242824375300 17986 +9922258559797177858 17990 +1996129678700595717 17992 +175639815544318983 17997 +12560559347890081795 18004 +1723505452697790468 18007 +7561903528222214664 18011 +6042451753662604292 18019 +9451080257116878337 18023 +0 18024 +1398320397313090566 18024 +14262781021071523846 18030 +9329258833177151494 18036 +10627418590197970436 18042 +5333770063374466053 18046 +16950868471002420739 18051 +16817613425314441226 18054 +6954148744208940548 18064 +8565578662899232259 18068 +0 18071 +14495399206354589698 18071 +14233285611878121985 18073 +13931489794906666500 18074 +16178316711416903686 18078 +11278882755625983492 18084 +11318936997117392386 18088 +3614828526851149830 18090 +2335123958036325382 18096 +5230377898758228996 18102 +2294247001847661575 18106 +3761228197538459141 18113 +6874316636351255557 18118 +12864086709382769669 18123 +16738430204146800643 18128 +4900644730863367683 18131 +10512470447628861957 18134 +2927989961696999942 18139 +5001755922844922372 18145 +17590640775353021953 18149 +9215862377102267909 18150 +7840338708470339074 18155 +1993959218506116097 18157 +0 18158 +12590506651592326148 18158 +15422255391256097795 18162 +6906027658093860353 18165 +2751374604562740229 18166 +13230069799387228677 18171 +4304170726974286337 18176 +12740659976309807107 18177 +136778279469512706 18180 +6161593865547933188 18182 +11814101619238886916 18186 +8518444463920976391 18190 +3531454249170141700 18197 +7191227558546362884 18201 +12465225876838513158 18205 +1657220457602519555 18211 +6225752460860126722 18214 +5882375914743738881 18216 +17337005874402123780 18217 +389771746950551559 18221 +8922975969289334278 18228 +8534602908707787267 18234 +891311815525217795 18237 +6232996772412875269 18240 +4727973386148059652 18245 +506953033189091331 18249 +17420867719582788616 18252 +11270492574651299841 18260 +10356631394229293574 18261 +3746875371958077959 18267 +17705366731176088580 18274 +12998529367203957768 18278 +12314477084371021831 18286 +13005153686906072580 18293 +13115233650775483398 18297 +3562764795518459907 18303 +6620891837104202756 18306 +13802894530395574789 18310 +443591533364001797 18315 +11387738357873796612 18320 +16389703606019348481 18324 +14571192331160968707 18325 +9101764594929649669 18328 +14370315167266205190 18333 +933675538736912387 18339 +997527938686202374 18342 +3473983656621236229 18348 +15278223937961091587 18353 +15554218278435862021 18356 +12473418271170412035 18361 +14049620737886583814 18364 +16636638191424290820 18370 +2351280186259676676 18374 +8357338852231329797 18378 +1923688151521455108 18383 +3374419350130681859 18387 +8193969005388122628 18390 +12116666816273587715 18394 +9192331221678348291 18397 +13016787343022781956 18400 +8505006092072621060 18404 +4233515864375304195 18408 +17183526090038710792 18411 +7963404114523525633 18419 +6179303958304373251 18420 +14432319195548232708 18423 +6571455811888811013 18427 +2314070410384256513 18432 +5092197060829454338 18433 +8193719287171960836 18435 +1349556313451890183 18439 +14793177070155522050 18446 +16413624620539258370 18448 +3610061588148637703 18450 +13694443593011298819 18457 +10727858738142746117 18460 +9205641130992447491 18465 +11074797158559407107 18468 +2985930667951245831 18471 +7290209912838366212 18478 +5183757187021164039 18482 +7272313912069238788 18489 +16228643199154712581 18493 +4316209185683977733 18498 +1548315203793256966 18503 +9663226883979716613 18509 +15136794913047585285 18514 +17324366124438272515 18519 +10563246599149138433 18522 +17762788941056959495 18523 +14315951256589227527 18530 +4746125897230415873 18537 +13323035088113107458 18538 +16415162911478610950 18540 +346154771424253443 18546 +8536914996416779784 18549 +18060816646048530440 18557 +18316029442525288965 18565 +16584752379970261507 18570 +3305115129723970054 18573 +12754053406163236865 18579 +10288323042524973059 18580 +6948619076906352131 18583 +17006974985356154884 18586 +7571074356506145795 18590 +10962356503027771400 18593 +5371157097752181764 18601 +12479596814088679432 18605 +15618741970361624577 18613 +16935889973654728711 18614 +7456776946874727941 18621 +1805370695343914501 18626 +8383583155980072963 18631 +9242964421057617410 18634 +15310450269391178756 18636 +6725368505536562178 18640 +13304287345038720516 18642 +4095025754538486785 18646 +18277066396944775685 18647 +17798459331767486470 18652 +17199484422425610758 18658 +5937276190073097736 18664 +16803865155977357827 18672 +17733760864808044550 18675 +9207062636140064774 18681 +9752892627399826947 18687 +16226777471151469570 18690 +14930557332625612804 18692 +13110586753501332996 18696 +11776103145673695749 18700 +7701346060566435333 18705 +6630691907856609799 18710 +12868026350682106887 18717 +15868939197246231043 18724 +3458686518925345281 18727 +11019532163132556294 18728 +3262890713532353026 18734 +3567753734928947713 18736 +3545310047880918533 18737 +14019849778250068995 18742 +5595557989190705156 18745 +4322043591333593603 18749 +8726731153713018885 18752 +14649830907196674562 18757 +12713180608281680390 18759 +16966780575208706566 18765 +17402778647251467266 18771 +11792375273357793798 18773 +15351866995417503235 18779 +1732623537907828740 18782 +8894315461119331842 18786 +5083577153501535748 18788 +1827808552962233862 18792 +5839497936556878850 18798 +16097021501131670532 18800 +17383440052463800839 18804 +10191965886087797764 18811 +5683282805440343555 18815 +5099484006420559367 18818 +4249459754476228609 18825 +16730927066044698115 18826 +9621523182104444930 18829 +11774420406069686792 18831 +4754508944342125578 18839 +84686332627707396 18849 +3877405403840256005 18853 +16142927928184402950 18858 +9425647976350132745 18864 +12160622148884890117 18873 +6500695129855182851 18878 +3759666565187185157 18881 +2703588405822267396 18886 +14455160979032350722 18890 +8399049943270543879 18892 +12306846253509384195 18899 +7721379352549703683 18902 +17582222050163866628 18905 +13679189359363369986 18909 +13757608005102647300 18911 +17466115566637436421 18915 +7764630965339584002 18920 +13788753305043481604 18922 +5354000011371468293 18926 +9677681731305229316 18931 +3056370376366537731 18935 +3926396448691331076 18938 +11314891968543395850 18942 +16000315257581046275 18952 +12459612454168303107 18955 +8357930902864658437 18958 +3122762091384573962 18963 +7292798815391490051 18973 +8275763682046024201 18976 +14056107943965173766 18985 +2257249485283723778 18991 +2624279341733753860 18993 +2593927357175147523 18997 +2836018839347118084 19000 +7980649316413143047 19004 +3303597238078519301 19011 +17168692426443013636 19016 +6295120171636030465 19020 +4035694441047235591 19021 +3883946815850311689 19028 +13601551448164157445 19037 +14897170506930139143 19042 +12933167888551327754 19049 +11088201409471487491 19059 +17378826266790003203 19062 +0 19065 +9642764361391801345 19065 +10618829185687811590 19066 +17756956060031775235 19072 +11339381927275108356 19075 +13010071520012861443 19079 +16110531725609781253 19082 +1252138033121985541 19087 +3292484331224158210 19092 +0 19094 +10111243896514895880 19094 +6185431858922897415 19102 +14235478970168472065 19109 +18150352618875356166 19110 +2904128500753243653 19116 +13168263224162505218 19121 +10723529171520089605 19123 +14350183549177880579 19128 +5477886293808536580 19131 +13479349087758476291 19135 +354578905106388996 19138 +5766533561748939269 19142 +4064010264599505925 19147 +11913861997496439303 19152 +9603500216241878021 19159 +15315056444626224131 19164 +12638576772179330055 19167 +7305220189793086983 19174 +10209689620990388226 19181 +4730316500561891333 19183 +8113919577401997828 19188 +16135525709409079301 19192 +17112024344091213827 19197 +16769238385840744453 19200 +265341807652550149 19205 +4893976362049893382 19210 +16169579049858408967 19216 +17471573721549160963 19223 +18321475146690452998 19226 +5075992701864901125 19232 +14658940983939500038 19237 +99038037147799048 19243 +8409649337354817027 19251 +8094911960588729347 19254 +16565436962799085061 19257 +4290083792037516808 19262 +10958228161162651138 19270 +10036100253038521350 19272 +0 19278 +2447604444887419394 19278 +5338576177373486081 19280 +1483175900562118145 19281 +15033393416293187078 19282 +1177537434563517957 19288 +4761707657854260741 19293 +17387867694095891971 19298 +9408178422383333378 19301 +14921212875138386437 19303 +9121816636073034757 19308 +10422149396406636546 19313 +2344556100813395975 19315 +6084013397407112707 19322 +14455882564055580673 19325 +18088140477860589062 19326 +2154985544899405314 19332 +6994047123573728772 19334 +8533772537809634821 19338 +9558114670300630535 19343 +11099006975298553858 19350 +8430551999133583874 19352 +1883973348913275907 19354 +3919332597299219457 19357 +10002244271449405445 19358 +17179042452203924484 19363 +2165661492925773831 19367 +12044995397856290308 19374 +5158375712192706054 19378 +12040075132903673348 19384 +4065620866941212162 19388 +730726257623724036 19390 +6766475116692217861 19394 +3210804786419224068 19399 +1800800883246217220 19403 +10710609484718365698 19407 +0 19409 +10335417557383702535 19409 +5929302587312744455 19416 +13928311151635323394 19423 +10671647923923419652 19425 +15285149260905881604 19429 +5894578113436128770 19433 +7159148305822290435 19435 +8944048040268733447 19438 +14396619708809964551 19445 +5390813713626091011 19452 +5012704057791028738 19455 +11077780169996967425 19457 +4230160704089191942 19458 +7867675016225826820 19464 +1110510539053099011 19468 +13241028427640317956 19471 +1185820157525422597 19475 +13868231880570444801 19480 +12506417262286652933 19481 +6051883789692426756 19486 +16787138625057914883 19490 +5530008923045642755 19493 +2455935075185635845 19496 +15232289368404371458 19501 +5143438380883788293 19503 +3242737809851219461 19508 +7355240527498071556 19513 +1918251002045464577 19517 +986335393363645441 19518 +6807476220340314117 19519 +2743995531039137798 19524 +17843944134713908740 19530 +513455302552076290 19534 +3383168287645877762 19536 +7004081722532300804 19538 +13783134934630949892 19542 +16179282211670780934 19546 +13324867790981214213 19552 +15751039420679573506 19557 +12206898442535828995 19559 +8553914414794537989 19562 +7011013835811768840 19567 +1948045336905612291 19575 +1592954257137001991 19578 +2408810890578556934 19585 +0 19591 +454221263460520451 19591 +12751539236602917381 19594 +14037954417169667080 19599 +10314371605133193733 19607 +6650264825183306242 19612 +14447930862181581829 19614 +4189447098661364228 19619 +12150879333525637635 19623 +10468410376456651265 19626 +12494874874177117186 19627 +1363100849012329475 19629 +1369015196791818244 19632 +10309397189065632260 19636 +11798130216083116039 19640 +4191202132275250691 19647 +8000416846368154627 19650 +11524494736880258054 19653 +958945282481584133 19659 +8113194420426757634 19664 +9424707377547425797 19666 +6792064538666220546 19671 +60286517073761283 19673 +12260917249058231300 19676 +13511780417468601857 19680 +11591548998898363907 19681 +14285518736265894913 19684 +13125507226418924548 19685 +1721014166457689092 19689 +9034167911209881093 19693 +17440574082759086083 19698 +7778278555224700931 19701 +6035079823249647620 19704 +6143222623829398532 19708 +16224382011919009284 19712 +14433133069862422021 19716 +442020553986196483 19721 +12957035671027973123 19724 +10256328165923466757 19727 +16220911615664876550 19732 +137108914058702340 19738 +12692689169385475074 19742 +13122221994833972740 19744 +12373103984230324228 19748 +2050211894437882885 19752 +421401369404463620 19757 +3313688178663608834 19761 +14827886937226695171 19763 +7173643562932613637 19766 +4490863094662164993 19771 +10386292620342398980 19772 +16967878139204506628 19776 +16063116681550897670 19780 +12603544304924727809 19786 +7531716424807520260 19787 +1349023995817442819 19791 +2781696091843088900 19794 +7508757923234290690 19798 +11569684768566192132 19800 +4697846604690277382 19804 +17671062785330215431 19810 +14397810770772058627 19817 +0 19820 +11710190007548939779 19820 +17980764476880124421 19823 +11942278264936544260 19828 +534716461007658498 19832 +2734383320959689218 19834 +14871523165671698948 19836 +12598041965322373125 19840 +11547101347818424837 19845 +12171028887200797188 19850 +5608974160951783941 19854 +0 19859 +16974276511282483715 19859 +11791819499532296196 19862 +9010262453936953346 19866 +17684886808235364357 19868 +8010484149743309316 19873 +3289253777193005060 19877 +5415658442872745991 19881 +15239620444014605317 19888 +12675746352024387587 19893 +17711170489205815813 19896 +10865660267341007878 19901 +1817283956503937541 19907 +4502405467008627720 19912 +8921281739997942275 19920 +18280528379484323842 19923 +14538758381368922631 19925 +13138531342096255490 19932 +18111382082671997447 19934 +7167420339732596232 19941 +14846867413385610243 19949 +3200046094095929866 19952 +5907745776240817666 19962 +13060876492995168770 19964 +4008963317092329986 19966 +8231945462570782723 19968 +9862909460144022532 19971 +10336027951688763394 19975 +4217383229594882565 19977 +13172838124814555138 19982 +6764868450781472772 19984 +11712234982911471620 19988 +16438274425103277062 19992 +14123079475751593988 19998 +18133079815081333763 20002 +7574921869783390725 20005 +13560386340992012804 20010 +16718676856257670665 20014 +12561457117557018630 20023 +10375410841027996164 20029 +11478717181389521923 20033 +112250851735089157 20036 +4647428948427288068 20041 +14488168472914347014 20045 +9045833790566204422 20051 +1275544160162230273 20057 +17817542665307257345 20058 +17903168185329254917 20059 +12101719327920820230 20064 +15431021432954108421 20070 +4691981457577099267 20075 +16559064393319996932 20078 +18001594280147007489 20082 +5036954345796828165 20083 +16207709115718196230 20088 +11898914813597216261 20094 +9517441673771496964 20099 +15005172096722831363 20103 +2117051391238695938 20106 +2634634509000056833 20108 +11240018416178738178 20109 +1259566990012073475 20111 +10502585449561874435 20114 +15379344542322503172 20117 +1273888554069470209 20121 +11278004198999097347 20122 +1827865460123197445 20125 +2047020824378660866 20130 +7501068138958177796 20132 +2698538281278756358 20136 +9059533821448235522 20142 +12930883866432925698 20144 +7783759813844500996 20146 +1749704905749281286 20150 +1274177066543056897 20156 +5922424819971382276 20157 +6328018530626065923 20161 +8366837725193172485 20164 +1197169868837848578 20169 +3909015357158680580 20171 +13317507619678955522 20175 +5870260525103816195 20177 +15881696946271722501 20180 +2588345123998614531 20185 +0 20188 +0 20188 +16791615931471769091 20188 +12539921716937731587 20191 +4997496766942586373 20194 +5010414756208735748 20199 +14085342587228390914 20203 +398530998710940675 20205 +4172135862636688390 20208 +339811161756599302 20214 +12748497325959553540 20220 +17786737337063679490 20224 +2432022376275598851 20226 +6084725827923963394 20229 +0 20231 +14150568772303942662 20231 +923276857452545031 20237 +6877577224065388038 20244 +2096097088861138947 20250 +15311559337693387267 20253 +13135309270526311426 20256 +15725711824950901252 20258 +17062877467519842825 20262 +3839962978154605572 20271 +7253170076227113988 20275 +6761844897943748612 20279 +1853684103449674241 20283 +15960095941266948097 20284 +11660910742008655876 20285 +0 20289 +1663486478448765956 20289 +159798298889593861 20293 +390797847414501380 20298 +16005517899999861253 20302 +6694275807228417027 20307 +341207426804946952 20310 +3634769519964149766 20318 +16864240005202516996 20324 +13061629193872069122 20328 +8285715135198672901 20330 +2011784816277109250 20335 +17565393038093605894 20337 +13444916732707495427 20343 +11888719322997841927 20346 +18119316735837112836 20353 +14246061797357800963 20357 +13231311446396050950 20360 +8538349582108576770 20366 +16120886963461291524 20368 +3427345641570108420 20372 +14762955636211800070 20376 +12405058537594332162 20382 +2503816407511029252 20384 +3177654140908392450 20388 +7194023902664893955 20390 +6598890679650269702 20393 +6837482320265545733 20399 +6806548276880915973 20404 +2323292685920783875 20409 +0 20412 +13842307047732763652 20412 +18037008587508754436 20416 +13761811569378169347 20420 +9688505751504786440 20423 +11950508854512614914 20431 +6504001030869410310 20433 +3129903187304091653 20439 +11142113562930397185 20444 +14604509358003709959 20445 +3756650620605579267 20452 +13249897144813484547 20455 +7773576636373322755 20458 +3252567352937370625 20461 +3306756886213426693 20462 +14835928642467174403 20467 +3538537848679917574 20470 +2322281838953525250 20476 +16397170132665978371 20478 +9740798354317300233 20481 +2224286688164709378 20490 +10734751764140519940 20492 +14572070415428617219 20496 +4905660861537120263 20499 +0 20506 +11438800455875187205 20506 +17477841181126999042 20511 +14367372768367177219 20513 +17442549647579831811 20516 +6632135510003993089 20519 +324496252004114947 20520 +7309277075027355654 20523 +12863972923635016708 20529 +0 20533 +11785005586876940807 20533 +10067426771408508420 20540 +0 20544 +15857527714771969539 20544 +2057608270321920001 20547 +5519102264874992135 20548 +12085541399814265859 20555 +4375293168862630404 20558 +13777834246488926215 20562 +8974755444211913218 20569 +14620201366626537986 20571 +12816490396071406598 20573 +7307487151727351814 20579 +15439620819565173252 20585 +14143446053210657285 20589 +15867192884809664517 20594 +2396618219346794502 20599 +18427146915056947203 20605 +10528673111173340163 20608 +13619404673299129351 20611 +10282650525721860101 20618 +2094641169424931846 20623 +15825313665247875075 20629 +4906141602518134275 20632 +9136358595180691975 20635 +5086258793049265665 20642 +624876556446643203 20643 +308526755115618312 20646 +12182886901424788997 20654 +3554479980351518211 20659 +3935300886033861123 20662 +3523234791466981381 20665 +0 20670 +13142427439544219652 20670 +1321827976347963910 20674 +9472617336615228419 20680 +998514928565102595 20683 +827339675178012677 20686 +12271484690066211333 20691 +11721650519062288387 20696 +120228527470947843 20699 +13709523675124023812 20702 +15401356991799624707 20706 +2090653067641225220 20709 +16669837047441053192 20713 +4550190197005299714 20721 +13933324304867045892 20723 +11326376816119635459 20727 +6710184449221879811 20730 +826735405164560900 20733 +573675804245547015 20737 +5041463674507204102 20744 +854894677104183301 20750 +676285460094497794 20755 +9277950226673244165 20757 +4168575722368252421 20762 +12590854801420328965 20767 +18020920690506287105 20772 +12992109679856144899 20773 +482697836815617538 20776 +7147533131350332420 20778 +1690131852394161156 20782 +15104880330314616322 20786 +11278778754604714498 20788 +6530897433906494979 20790 +17494758960615311879 20793 +1578159119920009733 20800 +12525502789413235718 20805 +4594306237764248068 20811 +10986801612122035717 20815 +6460380616123995652 20820 +1976117358297293829 20824 +5006006242731498501 20829 +16465937157516359684 20834 +2184917714727667206 20838 +5454503278186452994 20844 +16386625642699280899 20846 +10043431612474676737 20849 +932648325205054468 20850 +723383238245603841 20854 +0 20855 +11837545375336603142 20855 +11189361892773571587 20861 +14680391879451565059 20864 +3043077137676455939 20867 +6765504954436076550 20870 +16781329686899748358 20876 +11370379508762813445 20882 +1030752917994263558 20887 +152428535842101764 20893 +710154632532503553 20897 +17504311966717456387 20898 +7205864750443206146 20901 +5571301390358614534 20903 +6590732381919544323 20909 +17199755848461466115 20912 +3058708825787216902 20915 +1716398282413364738 20921 +13663599899545879044 20923 +2441605714472627206 20927 +5922473711307836424 20933 +18046291431900225542 20941 +16540289702289087490 20947 +586239268472714245 20949 +7310398616563956739 20954 +1985611961180592130 20957 +15725748922047214598 20959 +3959638009595182083 20965 +9732168491062881281 20968 +12526002159890500616 20969 +1983101858320146945 20977 +8135662954269472262 20978 +15762439447543422468 20984 +15385972473849468931 20988 +14742097672031522312 20991 +10559949778566312962 20999 +701250680636293127 21001 +1841921788819264516 21008 +10295440267136420867 21012 +8416198665286860292 21015 +12044256344715125252 21019 +12753043176791689731 21023 +0 21026 +17014050260299444742 21026 +4817857361562529287 21032 +8109583194272565251 21039 +14188605727068792837 21042 +9198792630640279045 21047 +3909833419221493762 21052 +5613544736376432646 21054 +1099957425951547397 21060 +2248172787438880257 21065 +4193950026072278017 21066 +10455251690365321729 21067 +3029548007608699394 21068 +8407408693874681860 21070 +6662485137673429507 21074 +1343899910520402947 21077 +16632266403022248967 21080 +182674054572869125 21087 +17110124237156054533 21092 +0 21097 +10900817203095961092 21097 +11363196708342289923 21101 +15066115161511562757 21104 +17161818620129069059 21109 +2767042166208909315 21112 +8745284671907755525 21115 +3327051561688621570 21120 +1087395368523212293 21122 +3905385754397729287 21127 +10287198023494434308 21134 +0 21138 +2222992491101303300 21138 +5120134287954715142 21142 +6923653625330327046 21148 +11567765986523726858 21154 +12033963867717419522 21164 +9968382703792120323 21166 +17920832629210706437 21169 +14513875058304578055 21174 +15582012415153576454 21181 +0 21187 +8727439471582115848 21187 +16895985902864412673 21195 +5873565047637296131 21196 +8950971182012398082 21199 +14919316168268394501 21201 +13844097584260147202 21206 +13115596712752442374 21208 +7964029664992521732 21214 +3338463043180224514 21218 +13668397393650259973 21220 +10195681273192326663 21225 +12436209770921341956 21232 +7074088000409042953 21236 +8320465691798641160 21245 +11129213647644486148 21253 +3949709747729144833 21257 +16879036666579204613 21258 +9189852427532172806 21263 +0 21269 +15237877858915287045 21269 +2312971279406036483 21274 +2152539942514893827 21277 +9304172780241539589 21280 +8419203840183352835 21285 +17808455135318616066 21288 +15570703668872541190 21290 +6190994970287042561 21296 +15707493481375044611 21297 +4599117065238474753 21300 +11010460437168170500 21301 +611150167517811713 21305 +4221231748634015235 21306 +10023795546634433539 21309 +9764778577034282500 21312 +3816830674052945923 21316 +13700476902379949060 21319 +18094837431957215233 21323 +9259765840107295234 21324 +13759676278342151686 21326 +7285340188403022854 21332 +17648598646481500675 21338 +9065635359226671619 21341 +16446515701059506178 21344 +0 21346 +4989159058661054473 21346 +5912702787915616263 21355 +12390517533395150338 21362 +3227390554956251651 21364 +12870732957313833474 21367 +290947465128649732 21369 +2426154350596525573 21373 +16228334758588378117 21378 +1588271816736413185 21383 +6327232833827674626 21384 +18397261334348111875 21386 +115161999134412294 21389 +10392264250290048517 21395 +12102117708560999429 21400 +7904954547129593349 21405 +2680753330197775877 21410 +15286907472764841988 21415 +17915124529761732103 21419 +5395705580939708420 21426 +3201073171058822146 21430 +5655369129043261955 21432 +12581078458504907777 21435 +7598370205151044610 21436 +1360330592612329990 21438 +1018181171040923141 21444 +4351596917438845446 21449 +4248231101260796419 21455 +5006788722715210755 21458 +1053985840124137477 21461 +9074059183475374597 21466 +14301004750426842116 21471 +15170499060308086278 21475 +768687345963412995 21481 +8042830231406824454 21484 +5041393906757188099 21490 +7832294413587594756 21493 +919266476974402050 21497 +11940252243753649669 21499 +17559618364124909570 21504 +2337097711860563461 21506 +4232669742721398275 21511 +6089617810457046022 21514 +2025279551541653508 21520 +4150338218905349636 21524 +1096768820530862595 21528 +14991916194281246725 21531 +12338606762212916742 21536 +1089762643802576898 21542 +735140890886595074 21544 +2638568827183484417 21546 +11516896655880297475 21547 +17816678366655459330 21550 +17206164192527961606 21552 +10003925495089103368 21558 +7407812343752290819 21566 +13455111674725984258 21569 +1298788227901366275 21571 +2684602020992038917 21574 +17124412344861903874 21579 +6602403066532345348 21581 +1904204127476997129 21585 +3396683297624431109 21594 +2953340529981228550 21599 +8190482527122081283 21605 +11151467362170096644 21608 +2948707554251732482 21612 +9011213038063974917 21614 +6376201727323225093 21619 +6222655457955177988 21624 +17642625974458107402 21628 +6671269371547347973 21638 +17518976063203996675 21643 +14566917452044518405 21646 +4485125318568888327 21651 +13446445590217618950 21658 +3856439238494857218 21664 +7781610900692685320 21666 +11423958037612163076 21674 +15133513015331113475 21678 +12528448693663910404 21681 +9875793292816077316 21685 +5388691297918334467 21689 +6464868593653337601 21692 +7581973299889496071 21693 +15251334491400836100 21700 +6380320780332338184 21704 +10388196767867992068 21712 +1348545499540703238 21716 +6939506353417955329 21722 +7086502631324968965 21723 +16332415090413343749 21728 +9835467149077562371 21733 +9928644134089568770 21736 +939378884493388803 21738 +14605309646066344968 21741 +16600745762544315395 21749 +4141361088946446343 21752 +16648144165059656707 21759 +6512676467933048326 21762 +3720811956280214017 21768 +7432137145214219779 21769 +0 21772 +1801848482990656004 21772 +7439726524625954308 21776 +11030869445837579780 21780 +1312522429832171012 21784 +17053716560217270791 21788 +2525395215921498630 21795 +902149584162707971 21801 +17269951643111717894 21804 +17706979582835312130 21810 +8569361283907306498 21812 +3227211449965453318 21814 +16176865516880692226 21820 +9133677426162622468 21822 +15681655357958727173 21826 +6127895180085325314 21831 +4210377897724626434 21833 +2261930105638088199 21835 +3873013018670274053 21842 +3850452330501816322 21847 +15843652794177393155 21849 +14376385860323232260 21852 +17084756853281022472 21856 +6325865360062770182 21864 +284758832225449473 21870 +14236645415698696708 21871 +18201155199740269570 21875 +131483926138085381 21877 +3683452210434364931 21882 +16365881135466083842 21885 +13484755381761964547 21887 +7830776051015433220 21890 +3349799667825610753 21894 +5549206956364402179 21895 +3088199652520227844 21898 +11314643989156079618 21902 +11354368179609058824 21904 +2197625227025479683 21912 +10817776634686449672 21915 +12096706165949851138 21923 +3418287286074632194 21925 +5023799920588523011 21927 +14019116615532006404 21930 +9007218901810604548 21934 +16991764548964818950 21938 +15404513031325714436 21944 +10338922594839391235 21948 +2206956388475377157 21951 +9901021809547021316 21956 +18333633423410029571 21960 +5328519000583155204 21963 +2581596870223860738 21967 +12949297760965123079 21969 +7715107274375577609 21976 +15854632594844798978 21985 +2852786058019577345 21987 +5351908428192635395 21988 +16596223306048737284 21991 +17091855138952738820 21995 +9699468903416023555 21999 +16692541819944913409 22002 +15984134769986055684 22003 +9458723217515140612 22007 +830086543148188164 22011 +5263009796089693185 22015 +12927115579775457795 22016 +7728469037605875205 22019 +11355702790069036035 22024 +10377630547141944835 22027 +18042981926349491204 22030 +16547849026110424069 22034 +9389073755934550531 22039 +5988213126880701444 22042 +96238009511768069 22046 +18204718514200865285 22051 +6889058463685453826 22056 +10979170019864964098 22058 +1187856079712977410 22060 +3268013158186765827 22062 +13519815964861358595 22065 +17986105748115130884 22068 +6493581176766496258 22072 +6449849524686274566 22074 +4037757921026968580 22080 +6027625871016129539 22084 +3932448528451522565 22087 +4210827009982554115 22092 +10493779249841908742 22095 +3311609933179069444 22101 +16055860354872171521 22105 +16610037822938013699 22106 +6249252761057494018 22109 +16331128639877757956 22111 +13030312964146327043 22115 +14328951110833032196 22118 +8000589421772715014 22122 +5337330021087037958 22128 +7786533271542921732 22134 +11321426877158520327 22138 +18115733920596866566 22145 +16130929459691239939 22151 +6710174071263012355 22154 +2843424687225005060 22157 +2834334279639441922 22161 +18033293080648119814 22163 +6877302156185191425 22169 +10708701003869826052 22170 +11185289707638685699 22174 +10357029733606544901 22177 +4752189770610651651 22182 +14023975041967735301 22185 +15985906855668645378 22190 +16145119332226445316 22192 +7983838220611748355 22196 +18066508996568729092 22199 +15564466565726754819 22203 +14560546420517897733 22206 +16511838835679718918 22211 +6053672881563056645 22217 +13809586824990085638 22222 +3742469589374321665 22228 +4075938001447224835 22229 +1306588562551745541 22232 +1805321183149549058 22237 +1374750997617241093 22239 +6979648223204439043 22244 +7233404206649611780 22247 +1031056287268008452 22251 +7358612721703002628 22255 +16064625461118436357 22259 +2045686568668655107 22264 +5169850874739360772 22267 +3551506017632978949 22271 +1549013787044477956 22276 +9957080837858744835 22280 +5347871253266483204 22283 +16293238490452659717 22287 +15803617842387151875 22292 +14845722140417528834 22295 +4660055485704855555 22297 +1501545398606654979 22300 +4150790203014729219 22303 +17699500804586072067 22306 +13943751078985374211 22309 +16440785177746400771 22312 +4934714071299316227 22315 +6467762276789779461 22318 +6664437151689979909 22323 +7656142276606312962 22328 +13949790918542480902 22330 +0 22336 +5200983370860096007 22336 +11022470308628215299 22343 +6770947897243534343 22346 +0 22353 +4561484292058856962 22353 +17132989158181632005 22355 +8264387683027673608 22360 +5420776539462196227 22368 +8955973971005734918 22371 +13090463092532462082 22377 +1589506324991089154 22379 +7450086241425052676 22381 +3802168297303979010 22385 +18146444816359472645 22387 +15340603894592698886 22392 +18286483006721009155 22398 +3806545225700161541 22401 +4334722178940665863 22406 +2081170773343186434 22413 +5338432593269969924 22415 +11813850647187749379 22419 +373944724354998785 22422 +5300610024950776322 22423 +6514639294673082886 22425 +13869581399536437762 22431 +11013455405500388357 22433 +700592101581590019 22438 +11468918149233141251 22441 +2803905460410578436 22444 +8676802043478010372 22448 +7728675077091284482 22452 +17748911503843868165 22454 +6255681507670837762 22459 +15141730510760260097 22461 +11718807157744083462 22462 +1095389158896742403 22468 +3760001716533834243 22471 +2380551746976498692 22474 +12593654449499003909 22478 +2145434879245456904 22483 +7599681347093448203 22491 +1368595881168212993 22502 +6851813120850276870 22503 +13676264658814208007 22509 +16952298714951423491 22516 +18149184725340769796 22519 +5208277236836602889 22523 +16684671510445403140 22532 +12896195403766216707 22536 +516816411709764614 22539 +3634917458421421058 22545 +15650812638852208132 22547 +4911029078973440518 22551 +14601654347618227716 22557 +13928041825358191618 22561 +18336504841150048770 22563 +8267863420101979139 22565 +15362253561162886146 22568 +8596821806541943297 22570 +16191038206501861380 22571 +5570663054284063749 22575 +15143908674070461441 22580 +9450965921071311365 22581 +1586934034253596677 22586 +6986851756786393090 22591 +15646450947573103622 22593 +8905721583717425667 22599 +8203150046583179780 22602 +5410611249959646211 22606 +14274244144833535493 22609 +15409910478961511940 22614 +2592367961791529987 22618 +17451964157220407809 22621 +11599025863868672516 22622 +7781049374378737156 22626 +16583591371788170246 22630 +17799119784078969858 22636 +15845332138470181890 22638 +1697954686465047556 22640 +11962042445815764487 22644 +6946967110062070791 22651 +13447937583958208006 22658 +11203285075141521410 22664 +16200671410699478019 22666 +11859890377214117891 22669 +16984016289604191235 22672 +17032091698930918404 22675 +207765120750967810 22679 +10972070089208955906 22681 +15875315600693533186 22683 +12089951068096475144 22685 +9154215876293270532 22693 +14641432592623983106 22697 +14108587141028790276 22699 +5583192239524584455 22703 +17755693616199687683 22710 +12947467627359682056 22713 +18278983440106267652 22721 +16907467828468293637 22725 +2402201356433790468 22730 +8407748241712239618 22734 +13918625605128253956 22736 +1205331529699813891 22740 +17660703489308045830 22743 +14625996650795479556 22749 +13264443401168966658 22753 +5351223397352941063 22755 +3019958839923697156 22762 +12791194224214238724 22766 +5121594097864696323 22770 +1591325557909621764 22773 +328400902150787074 22777 +11091303398470555653 22779 +4744881048515057157 22784 +2405336135107859972 22789 +14577001392673377285 22793 +16651541324354549249 22798 +17239346865472359941 22799 +18372624019092647937 22804 +16838152910299022339 22805 +8298503068703180292 22808 +11696419272553442818 22812 +514603589797871111 22814 +3560203682717268487 22821 +1128540820085903874 22828 +2842919432152992771 22830 +11284182633570969602 22833 +15496012841983188484 22835 +9811331962390428676 22839 +7521818092192246276 22843 +14279734848016173573 22847 +16014883570427206146 22852 +1369728818936221700 22854 +13976182253652704770 22858 +6177800076944853507 22860 +10131458721466340866 22863 +6846038547768445447 22865 +927666206116186627 22872 +16278197941907453956 22875 +1120781626630468102 22879 +12302126035327268356 22885 +14663701351282040326 22889 +7826391605787035140 22895 +725088201256400391 22899 +15890160177956461060 22906 +1893625188190945282 22910 +16713611603306421250 22912 +7724376373189709830 22914 +14770082458668819463 22920 +15801237762255936517 22927 +6550893047580053005 22932 +7959628657334673926 22945 +16669263398493144068 22951 +17411591507294350340 22955 +14857114470717784578 22959 +2721272076472443395 22961 +17812885587519841284 22964 +16289079364411535366 22968 +10737723387939384324 22974 +896857434213666822 22978 +15963533698329163780 22984 +7884698281905409544 22988 +963005294589969411 22996 +12036580754564992515 22999 +1900805969219218951 23002 +17007395761501405186 23009 +6907546889726191622 23011 +13583702651987140611 23017 +17060745767902551042 23020 +15081579287289312260 23022 +8934739447152493575 23026 +6586743779681291266 23033 +10914185291818729476 23035 +1378596801066950149 23039 +5823312007043734021 23044 +13329922632083368456 23049 +3567236368350573061 23057 +14595597579340588035 23062 +17577289038082317315 23065 +17392103991860933124 23068 +15077672770433274371 23072 +11903563274172935685 23075 +6703171676040275458 23080 +18441267014003421186 23082 +657611433268889091 23084 +3349504300397952516 23087 +5401646663717814276 23091 +13608483969248519684 23095 +13687838317379163653 23099 +10703515441354891266 23104 +0 23106 +4085666049388265478 23106 +16351935552392455683 23112 +4084061254361500677 23115 +3749989960896403463 23120 +5392590371633913859 23127 +8757457927804455944 23130 +10879000376933002244 23138 +9709024205850395650 23142 +9661264218644721156 23144 +17782821297817024007 23148 +4117175590489236484 23155 +1955606343922150405 23159 +4888204179478496261 23164 +13976327072161117698 23169 +2664220304137269250 23171 +15452195082093653507 23173 +11564124196147200517 23176 +11248921904935255562 23181 +17464667169617009154 23191 +15682146834800731139 23193 +15325813334742820871 23196 +625058176852277250 23203 +6792062691291963396 23205 +2735344866354851331 23209 +1489991315145231875 23212 +6263432200883207685 23215 +11040821240934684675 23220 +18301904319070961153 23223 +398568629909108226 23224 +18000414740356190727 23226 +3945959834883642371 23233 +3814158315869486598 23236 +2480933356392543237 23242 +7004661828607857671 23247 +11730148728958727684 23254 +3660457626607125506 23258 +1032602729683830277 23260 +4591828703564868100 23265 +14642320334208732164 23269 +6117791444381724677 23273 +6557877055289853955 23278 +2641245271921356804 23281 +13928815910184511494 23285 +4597287016704886275 23291 +15988540448724835844 23294 +17093265980596980738 23298 +15825319707655557122 23300 +16976971738088833538 23302 +4026707435963119107 23304 +1703199570393421829 23307 +14717827630981348868 23312 +12197638158357576196 23316 +1435811009344943109 23320 +6694005348414600195 23325 +1754170120677504518 23328 +385530458387282948 23334 +299061585962219012 23338 +9487972959486218758 23342 +12330704425746692613 23348 +17655968347818396673 23353 +0 23354 +15974859936697913862 23354 +7900362394601404929 23360 +5173304976749303810 23361 +4281214160477505030 23363 +16678183982938669059 23369 +13550345478608704517 23372 +8315052556398230533 23377 +1995348202224588805 23382 +14642838728513425926 23387 +16434067210952745475 23393 +5749352763640326657 23396 +8690219119739757576 23397 +10214291532936668167 23405 +4560364614408376837 23412 +13295134916897649669 23417 +7233988683450445315 23422 +12199561365437656068 23425 +3023987090124494342 23429 +17033036293320432136 23435 +17642729202824666118 23443 +13779758565103773701 23449 +16441611138823327748 23454 +1872280974355039239 23458 +5643540475241117698 23465 +0 23467 +3086648214048952321 23467 +17965820418314814465 23468 +14262262230974279683 23469 +1220383309848577541 23472 +774336959833226754 23477 +6574732177851603979 23479 +0 23490 +5471862789112256001 23490 +2075487540485368325 23491 +9739975108845409796 23496 +15172742446683025413 23500 +5834401953086753282 23505 +11000181454481522186 23507 +15959977589592475654 23517 +5806013214275668995 23523 +7803442975281405953 23526 +2011458936758635523 23527 +12976664978090406916 23530 +1692404376445973506 23534 +18164872379232075266 23536 +2504171925942041091 23538 +10476712736279285250 23541 +618884562037946884 23543 +16339062414287423491 23547 +5573862762813105668 23550 +11963452536827220485 23554 +11788302339257602561 23559 +11650248730920203781 23560 +9891789936323301378 23565 +226404097654363652 23567 +1077396230415575557 23571 +6181876753702493699 23576 +2241623369758218244 23579 +12911248238089222 23583 +891271444825858563 23589 +2823543700061112836 23592 +32232735051300866 23596 +910949092552152577 23598 +5410915296840137221 23599 +3019626934691348484 23604 +6730613013842226180 23608 +7791850653807835139 23612 +6370757099402613762 23615 +696253306435951623 23617 +15238082994729647619 23624 +14552283528341307399 23627 +2772232367063406597 23634 +16154957115177418755 23639 +1854593538268649989 23642 +7266415030732323841 23647 +301220941601383941 23648 +9032041057266855427 23653 +4739446739545135619 23656 +13216933286225370117 23659 +453373969466250244 23664 +4409711095354429444 23668 +4588258086122737667 23672 +3219398163360651268 23675 +5958329856541359624 23679 +1672510838648952835 23687 +5152733325419501058 23690 +14642860033348762119 23692 +5414731896382608389 23699 +556041158375913477 23704 +12806013021140688899 23709 +343337027659408386 23712 +14698914095346745349 23714 +14172374839910533121 23719 +1827061227422996998 23720 +15886333372703001604 23726 +1982592370950663683 23730 +14893030837770820609 23733 +11625346709203278339 23734 +5728002157502507524 23737 +1780107030132830727 23741 +3929262467303954439 23748 +0 23755 +0 23755 +3459508030837579782 23755 +18371426115810920965 23761 +8024196725848841221 23766 +16062692361091055620 23771 +4786586348593057288 23775 +5395625385059270148 23783 +1103814025491281413 23787 +10016300666577472002 23792 +2416688545672506882 23794 +0 23796 +1419457670264119301 23796 +17248000444768005636 23801 +3422821416867119621 23805 +1300837850166848516 23810 +8338140517572752897 23814 +10399537359124577794 23815 +0 23817 +1900292543448404484 23817 +14296219139354726915 23821 +15494762139714329603 23824 +13563262891851988995 23827 +8323592430402902533 23830 +18038461953954348548 23835 +14508206967080323074 23839 +17289033366274126340 23841 +6511007078209430532 23845 +13403787503260142084 23849 +11299554574851096068 23853 +7625445259338707974 23857 +5325055663283554820 23863 +11469552268559904259 23867 +2238436702984384514 23870 +4940348252328283141 23872 +7767132131302562826 23877 +11405002630090592257 23887 +15139842711709395971 23888 +1292456295705838082 23891 +2348051575821697026 23893 +3358533889978337796 23895 +17348692078770426884 23899 +2388246186657453061 23903 +4593444831230942210 23908 +7133365250268871173 23910 +0 23915 +1039037797815128577 23915 +7807087826002586114 23916 +14206444713983735814 23918 +8575933924667360261 23924 +12333288770287091207 23929 +17244603126545324039 23936 +17489307857801881605 23943 +16384867659956181506 23948 +5917882930716136449 23950 +4744473709060999171 23951 +3281296741024104962 23954 +8585979868496927240 23956 +16779510364648418309 23964 +8931760668844849156 23969 +730179289289681413 23973 +331536065338069506 23978 +445453113271466499 23980 +10884880543704734725 23983 +14650952768036314120 23988 +17838040455875427845 23996 +3129499167393200131 24001 +8472834158508828677 24004 +13098719148617663492 24009 +16496667410993503750 24013 +14585274372446877190 24019 +12915621168008658435 24025 +10154241506973336582 24028 +7520913087997871113 24034 +1920232495844721154 24043 +1033754029863631365 24045 +10329086685454614017 24050 +6674289242278040067 24051 +15400367557971538437 24054 +4877800751391133699 24059 +13521909811769661446 24062 +17927588636607007235 24068 +12846313623048792580 24071 +17755969289417637379 24075 +10684001616516415490 24078 +8572533598381428226 24080 +7348704938291699202 24082 +9587283667570937865 24084 +18330431462839625735 24093 +1565182245567966724 24100 +5061226681426988035 24104 +16984805720092964355 24107 +1354108542770641924 24110 +11628831892967716872 24114 +8850118920425924612 24122 +9878165404540480514 24126 +4295807981413631490 24128 +6897388373796591107 24130 +13568944098449586694 24133 +15959560375481425925 24139 +16693274617145896451 24144 +7639754089899679748 24147 +7425920437820742659 24151 +12752776242888193026 24154 +14197810556718156802 24156 +5477024074005876226 24158 +12213945472258234881 24160 +897214858763421186 24161 +11008949188966200326 24163 +3998386455410351108 24169 +17002566057148617223 24173 +15181936191772549121 24180 +8106170804600175108 24181 +9589915058011585539 24185 +10790723845633364999 24188 +11817853979174982145 24195 +4976930149990109700 24196 +11933012147965219842 24200 +8467604313264584706 24202 +12599625485060402182 24204 +9690144971717321735 24210 +17676709226874246658 24217 +17950462329895987715 24219 +538031135979133443 24222 +13380404999002729989 24225 +10460805626487352835 24230 +12715017017861530628 24233 +10889535500041909763 24237 +5763050036061642246 24240 +8638437171541730823 24246 +18418652890096506885 24253 +17400663715128675844 24258 +13690110168092490753 24262 +4451455363933513219 24263 +13140421600745576968 24266 +2666224664733527047 24274 +4464913825127710214 24281 +9062130823618274308 24287 +5040348274998885889 24291 +1020206644990347270 24292 +3271816885947551749 24298 +11275699838606547458 24303 +9480316693336989698 24305 +2837341402821524485 24307 +17756959436374687748 24312 +7916794937193069060 24316 +6122978168576524295 24320 +9051193865617445890 24327 +6426637935482784774 24329 +13001331074671042567 24335 +7420658912579841541 24342 +4240605091596475393 24347 +16910755677997614087 24348 +17354942983327886342 24355 +4126384131144125444 24361 +2424491582043695618 24365 +10504479870738162689 24367 +2297037800818006532 24368 +10526225826991727107 24372 +3060391590018632707 24375 +16686453992991026690 24378 +14923917107457323527 24380 +13332073478080690179 24387 +0 24390 +6112528679468338179 24390 +12553830680346511876 24393 +17118653746152748036 24397 +13378761498266258948 24401 +16702549562420199427 24405 +16096550715670556674 24408 +4271526272688789511 24410 +14082550666595581956 24417 +5516407255127782914 24421 +14582273020377256452 24423 +819438335757515271 24427 +15139958189668711937 24434 +6911576537024286213 24435 +3133394640701049857 24440 +13674975827258302983 24441 +17703785708577055235 24448 +2524472933294188547 24451 +5343269175625238531 24454 +14462875088943328774 24457 +11051751773161393668 24463 +16522961770703444998 24467 +9339164095940095491 24473 +12848915601667418629 24476 +7083502870613101572 24481 +4142111330278147079 24485 +4133251237038394883 24492 +0 24495 +15340093095697290760 24495 +13347092698943379461 24503 +7581383261881367045 24508 +2857868746458924548 24513 +3359704722205343237 24517 +14849144084290419204 24522 +5156734774726122501 24526 +4749341750922222085 24531 +15481701273740099585 24536 +12922427250719397893 24537 +42054378150928898 24542 +12417496545884979204 24544 +3214247396756146177 24548 +7318900239482085381 24549 +13452075674417212421 24554 +1171770846824980997 24559 +0 24564 +17693727716453805574 24564 +9689972770123727876 24570 +8932753961392444932 24574 +18042579417072513034 24578 +9619010311062455301 24588 +1674842872331020803 24593 +14628523989790646275 24596 +8441581647292379653 24599 +11815482669562408966 24604 +17667370067619728901 24610 +1444905419972723713 24615 +8459043029918013446 24616 +15236349068327691780 24622 +8106215658681483269 24626 +0 24631 +9907603874810804739 24631 +17373151899460746245 24634 +9423825811785608193 24639 +10735864572141648899 24640 +17241433450550100484 24643 +2258587391048064514 24647 +4955534734689803779 24649 +16790329274003033089 24652 +11012823425965373443 24653 +13661666526419530757 24656 +4324094454380131331 24661 +9360213681387404808 24664 +2851986789337379334 24672 +12560850452060877827 24678 +4983663384748707331 24681 +5644220484929834499 24684 +5022472401863368706 24687 +17419175391610006022 24689 +1258038501275629061 24695 +7362533860452292098 24700 +13374287433704244227 24702 +16116668094450542597 24705 +13742196189889712643 24710 +5661830272926333445 24713 +6488223011782494725 24718 +5303310342026806276 24723 +10142022655883912709 24727 +991204745936345602 24732 +1395189928966221317 24734 +2519692055192375301 24739 +5326948120198852611 24744 +16956610439235075077 24747 +2584436989211819521 24752 +16089500179667610630 24753 +13061899385392462852 24759 +13484483223575451651 24763 +17698056660934227457 24766 +14180552261923379717 24767 +12689039820796697091 24772 +14066473493957729283 24775 +11044383165274888707 24778 +841982007637265923 24781 +1181277551102196741 24784 +7964072246481441796 24789 +3148936901211401730 24793 +0 24795 +11749502941787435523 24795 +3264989095448910852 24798 +16692183044637437442 24802 +6376485215322875908 24804 +5280758589983933444 24808 +10763628608368838152 24812 +16148256561045958148 24820 +16037154962989100036 24824 +16320091538391290372 24828 +9132458288343558145 24832 +5955073322379139588 24833 +6350303117398892550 24837 +16629169423665475074 24843 +3118502359841879558 24845 +11587738009508386311 24851 +3009142862622476293 24858 +14145779910963157505 24863 +8072695766280922627 24864 +9389830932725936645 24867 +7362784697637072897 24872 +9712093158599732228 24873 +15837073061511683587 24877 +5277137361193368581 24880 +7560127104259670533 24885 +16761464392047078401 24890 +11266614809968856069 24891 +7506418503667806212 24896 +11837132231177132034 24900 +2431174054192776197 24902 +10486833579218559495 24907 +15668992447432133124 24914 +3876680590297168390 24918 +16358179472025829893 24924 +7282935203339809284 24929 +4425136550044760066 24933 +4304526858305182723 24935 +7752510027704217090 24938 +15646508290874868230 24940 +5782901043333767683 24946 +17102711678503652868 24949 +643472226555888642 24953 +8094301031423940102 24955 +3938095734681522187 24961 +17201323660217532418 24972 +1829368606813394949 24974 +2976715259959019010 24979 +5934558395055148036 24981 +11170327153386434056 24985 +11852789231403143683 24993 +166208761437711874 24996 +3399955527276592642 24998 +17733857225077496836 25000 +18148198247332535811 25004 +8709523408888406018 25007 +11896810298113801223 25009 +12006520825525404678 25016 +2009988013238208520 25022 +6806454659573938180 25030 +1785353518161431044 25034 +5451568168276802564 25038 +459303146796803591 25042 +6111734645592462341 25049 +16849377260105372162 25054 +15895160268209280518 25056 +2697032440672750083 25062 +6584962116018051587 25065 +15330955522854038533 25068 +9020620472025508356 25073 +4898746297800303110 25077 +8942777250665162754 25083 +10324148713730882051 25085 +13172221906870614532 25088 +17573543844797112326 25092 +12125910421492538883 25098 +960475376325316609 25101 +7031187105124917765 25102 +10010635636506541573 25107 +6855934737182716932 25112 +0 25116 +328821992352671233 25116 +10734022028193679875 25117 +16864281656027684867 25120 +4612413030646767618 25123 +2246079574029591557 25125 +11138652624849966086 25130 +7250229107477824006 25136 +11000401768508054533 25142 +11399432076446354441 25147 +234597506679486470 25156 +18178900387656384514 25162 +11950999332595230210 25164 +8142059128118256643 25166 +17666931050359060482 25169 +317436924739744772 25171 +4690094436638882307 25175 +15221428457798421506 25178 +9997731088328935940 25180 +17460834626509844996 25184 +3868711487731652100 25188 +6358876234988056578 25192 +11852052316389835265 25194 +11621892952961959425 25195 +2704682443395304450 25196 +12728498675399946759 25198 +2918286897073455620 25205 +17641971301052259330 25209 +18026504822107777540 25211 +2434378742062347784 25215 +16997419448242788356 25223 +14073258178164115459 25227 +12413761291031735814 25230 +9474667667185472006 25236 +15974805840193064451 25242 +13025611722523505667 25245 +3809621267578796546 25248 +17730978702620285444 25250 +18391375647865050116 25254 +8741199140599127043 25258 +11040646739696655365 25261 +6473135419343022596 25266 +10553272469773770243 25270 +8585982438980352007 25273 +10259866090928776198 25280 +4229226009505894408 25286 +2002944021128144388 25294 +8262106295486657540 25298 +2638958292004426245 25302 +6716212752782377479 25307 +16606805567053944323 25314 +16569161729901697539 25317 +13898846027268744706 25320 +6697042513417145345 25322 +0 25323 +13136981759685128708 25323 +12885366357695755270 25327 +11421369206899778566 25333 +5862456585037456385 25339 +13222548494753234438 25340 +6092040936122270212 25346 +4707301901028484611 25350 +12337566475949270533 25353 +14648566677827276291 25358 +16311782330434884612 25361 +13353913547625121284 25365 +15142381058349566979 25369 +15184047937294281730 25372 +12378039272343114245 25374 +9021505885947860486 25379 +12919484043324618246 25385 +294688707577154051 25391 +3574781208941447170 25394 +9775687508684043267 25396 +7179124226549407235 25399 +18428372281580294148 25402 +4172455897179081733 25406 +14629049941856310279 25411 +9110710067015171588 25418 +7737932268083508227 25422 +7030487427851442694 25425 +6015706505222393347 25431 +10690805751857896453 25434 +1792130134350293507 25439 +3270282490179074050 25442 +9160230700588991490 25444 +1501275329985030662 25446 +16682156730447748614 25452 +16865037037501394949 25458 +18287974994743754753 25463 +12770959110129288199 25464 +2664081489822129155 25471 +844289860844562947 25474 +9320725112162699781 25477 +15848413985541323268 25482 +714399586554869765 25486 +5325599719650135047 25491 +16127700066179685891 25498 +11246087946884446216 25501 +10317865897027765761 25509 +14120909642853503494 25510 +10750359165492725766 25516 +10665949919901158402 25522 +0 25524 +10268494043919521282 25524 +3180127476110164486 25526 +6514225770751130629 25532 +5848127685141896708 25537 +4542051428430444551 25541 +12307406507141786115 25548 +10642483578899606023 25551 +10406118947534204422 25558 +5364884178056393732 25564 +8331308367300432898 25568 +8231363453508637189 25570 +15429730063344815618 25575 +10119182072058990085 25577 +16134182472455695362 25582 +14324187521253962754 25584 +2946844295967776770 25586 +6710088418407883268 25588 +16266794939106578439 25592 +8020009302884012039 25599 +9393567207509819911 25606 +5628410909592268291 25613 +9632675985619778566 25616 +15106682042010132996 25622 +15041770311573039107 25626 +12084896222414160386 25629 +13659226818801915394 25631 +17053839838698876420 25633 +14665028853595875331 25637 +14106202957523787779 25640 +14145807055682495494 25643 +7718095822900658179 25649 +12550952433270238723 25652 +11964315797905999876 25655 +12650505036830474245 25659 +3971311418341217795 25664 +5997121717068898309 25667 +4025291685231636993 25672 +3969176862572239362 25673 +18247394154093760005 25675 +11930810837389575172 25680 +11974038225773906436 25684 +1065227006476386310 25688 +16677205936684410883 25694 +6232542593154732549 25697 +17583639373664094212 25702 +12630881472352333316 25706 +17759818976410924035 25710 +10809549544660057602 25713 +0 25715 +8445020147073658884 25715 +14669676056926794755 25719 +498146987669929989 25722 +4500295423050479109 25727 +10740576978377233922 25732 +17926602667697829892 25734 +2778356644747562499 25738 +12793292245348180485 25741 +11220448559454531077 25746 +11043275450454522372 25751 +1594361548965472772 25755 +8482113541783310851 25759 +13436426771358762498 25762 +3950171796639753730 25764 +5581303570318299650 25766 +3451909095431964167 25768 +4164087320962755585 25775 +0 25776 +9547688863885844995 25776 +11717316009583938566 25779 +17992572675509758981 25785 +11476165060331347459 25790 +329615558090927105 25793 +649162263552226309 25794 +16455662145521947651 25799 +17377844383373149189 25802 +8404076177656756226 25807 +12147693852938766343 25809 +6381095894792707078 25816 +10352927462178416133 25822 +4705208070869412356 25827 +15851904368265430531 25831 +13968237336416032259 25834 +9827577657889294340 25837 +4449049914248235010 25841 +16416804306632448003 25843 +12871406321745873926 25846 +7940137828212463108 25852 +18362166920692106763 25856 +2960619891364167172 25867 +15735872260771139075 25871 +9108481211231335425 25874 +2668250430370550788 25875 +10575802152973732355 25879 +5060836940660225540 25882 +225935621271530498 25886 +5136450202482414087 25888 +929619418192132101 25895 +5323106225983073283 25900 +14468416374528692227 25903 +3158312860566415362 25906 +16504139215795462659 25908 +5208604782711139843 25911 +15499914520012354563 25914 +7204770493179136003 25917 +10425084598104214532 25920 +16401636989731839490 25924 +7114314555962834435 25926 +4608087797083171331 25929 +1086611278259000835 25932 +9389117504066003460 25935 +15559849048559148035 25939 +2583606560764443652 25942 +7233249512106878468 25946 +16390582902469327875 25950 +15967147632756437508 25953 +4687950263513966594 25957 +682127553081737221 25959 +1392730081918804995 25964 +15508687208803156482 25967 +13445158928817536517 25969 +18040087329496012804 25974 +11404744719521039875 25978 +6301923519743508485 25981 +5236535096553666568 25986 +17093642626751245832 25994 +7261775123759214593 26002 +2752498443646272515 26003 +2602205184213988866 26006 +9331022359099524099 26008 +1838469583533214723 26011 +11905775773009579526 26014 +13076411875848438790 26020 +17582844665996553220 26026 +17695943599914966534 26030 +10438946923530348034 26036 +15189325447576700932 26038 +9811119704845099013 26042 +1601358214761967110 26047 +4136077380269795331 26053 +2393178210431113732 26056 +6992961595594129923 26060 +11273390515254538757 26063 +16063489391670912004 26068 +6384655979376765443 26072 +17401154554202073604 26075 +12482153433877380615 26079 +5125644823643668994 26086 +15658265951098080263 26088 +13700413867231517187 26095 +8034728922292801542 26098 +10634172503995254279 26104 +13823845266064883715 26111 +16136502074685336583 26114 +749089641708413443 26121 +14478902594439708162 26124 +7708476582186693636 26126 +1411832986028199426 26130 +6996575117043125765 26132 +6627039338485023233 26137 +4941548995048588292 26138 +10373344075190348291 26142 +17565948463064997379 26145 +6316727755283813382 26148 +1412142675659866631 26154 +17053220136998554120 26161 +15784271545709816833 26169 +3845454550052392454 26170 +6374831004386275329 26176 +3052803910992719875 26177 +14060787293753129988 26180 +7356784107140054535 26184 +6973332790096857604 26191 +14393293923489219588 26195 +15992110615424755205 26199 +10690129550121712134 26204 +5190428440157835265 26210 +17259684175383696389 26211 +15162872248667344901 26216 +16781128712985041924 26221 +11024263086631159301 26225 +7526756467701550088 26230 +2433231503350495745 26238 +15832898365217523717 26239 +10174020538673911810 26244 +3279340628610055174 26246 +12276084677422041603 26252 +16765041636076270082 26255 +3897722727201650695 26257 +11185231720285553157 26264 +6682218396351600644 26269 +15104213348152564230 26273 +6938148494824109059 26279 +10363527731843049477 26282 +16112184052286707718 26287 +5652526013441936900 26293 +6925706492423299074 26297 +7681424602968274438 26299 +9115792912330009603 26305 +10990896473772795910 26308 +3300867457637391877 26314 +1634148065683652100 26319 +6033099898189581826 26323 +8911920652632036869 26325 +15516200399397776901 26330 +7183434510464201218 26335 +3267066247057486850 26337 +9012013437147953667 26339 +13531870591023157254 26342 +2437485689886010369 26348 +6282029469274071558 26349 +6880787829220288516 26355 +14996563937210630148 26359 +13107259545000180227 26363 +15805362181959176193 26366 +104736626298488323 26367 +7746666782171317766 26370 +3686254413490985474 26376 +7127034453407985665 26378 +15433433439287457795 26379 +12790765225752589828 26382 +6734329130067298821 26386 +14333054115189806596 26391 +12343096678158494725 26395 +4494373399638777350 26400 +13514255386800320005 26406 +10519985967326855171 26411 +11457526110845063172 26414 +11800132265580204547 26418 +4017636677137776643 26421 +9118662773664055300 26424 +1084099391304635395 26428 +3509827037164940802 26431 +7114317414149865474 26433 +16215347268046156802 26435 +17776274976577979395 26437 +8498838532323632645 26440 +6454058771584061957 26445 +3979012846548461063 26450 +10869950400546141701 26457 +2927330403807771139 26462 +11300013502218768898 26465 +3419672510766187011 26467 +14058390141759306756 26470 +2948453057188647429 26474 +9454073228773507590 26479 +13492021842929333766 26485 +4165023507705417221 26491 +7149761388420518913 26496 +13092897104224630277 26497 +10161250386963085828 26502 +12501380476475987461 26506 +2404491124345533959 26511 +5155290569575194116 26518 +13186769602419250694 26522 +16538791477988460036 26528 +7280542347486107139 26532 +8205475341630528001 26535 +15066013487896818177 26536 +4315216179578035205 26537 +10503529622277065731 26542 +15409413410257585155 26545 +17388473949448505865 26548 +8415548691924816389 26557 +8776185331252502018 26562 +4034424727305955847 26564 +4725192011484287489 26571 +2424817954677742596 26572 +3441985511285469701 26576 +14248763451225953283 26581 +14109974725205381126 26584 +14207869257212154373 26590 +11880288734714171394 26595 +15104696342852610570 26597 +2718961385697991172 26607 +974635662805450760 26611 +16927159581943613443 26619 +5971987555932634116 26622 +10176520528048138243 26626 +12944783450924325891 26629 +12003699145952933381 26632 +831499420274737665 26637 +1314216752147624966 26638 +6505756082744112642 26644 +1529012795533582854 26646 +16406602483471521793 26652 +1189125470082538500 26653 +8448907404825290244 26657 +3386027088917379075 26661 +12540889452951068677 26664 +6081021958448300034 26669 +11089303225900029955 26671 +15625536180985217027 26674 +3168865723989516807 26677 +8996733438082536965 26684 +4959961459338318855 26689 +15936213723303172105 26696 +6617465630777346562 26705 +3587440022293449219 26707 +18417276856431980545 26710 +16733779981721669122 26711 +18278838024968099843 26713 +5145695853491911173 26716 +17355576114862952450 26721 +9419101045057380868 26723 +3534261451971335683 26727 +18065870420268092933 26730 +17904079250290067457 26735 +4040806523439695875 26736 +18077620394820917767 26739 +18018924878757530118 26746 +16797168899278565895 26752 +11507771973593056773 26759 +9443685200927650308 26764 +14985542514757513220 26768 +18292992052246623747 26772 +10838541904943056388 26775 +756149150367128580 26779 +7713605972288802306 26783 +13423162952485000707 26785 +7842696680735605762 26788 +4922043114771383302 26790 +4026194912863751681 26796 +15595198164082869763 26797 +17022766296900182532 26800 +3783355763998928901 26804 +14406746453900785154 26809 +16951018148644279299 26811 +747472028779317764 26814 +12876520263814872581 26818 +4905115389316380163 26823 +12056017391853350915 26826 +10548879070704442886 26829 +218206559538859010 26835 +7031688233926810119 26837 +11146418484464128515 26844 +52548056156746242 26847 +15523286578596368897 26849 +13962517756107528706 26850 +12086617445338604548 26852 +9766758909787998727 26856 +10084407913623306247 26863 +3421748525058441733 26870 +15098955317169594370 26875 +11730894907309712900 26877 +877184686812369415 26881 +9011367144134895618 26888 +16682405355126100485 26890 +7466787728433217538 26895 +7234367528425661442 26897 +876703762468583939 26899 +2930754505300540932 26902 +7191895122002008068 26906 +12638284450797098499 26910 +13472745364819640833 26913 +9266471225961960965 26914 +10594743925520069638 26919 +2098655612900039170 26925 +2202679759423621635 26927 +1914110522745687044 26930 +577953640499057667 26934 +5535915982676369928 26937 +1015635020666674178 26945 +568482855285538306 26947 +12578704525611824642 26949 +9170488549266398214 26951 +12960734279358268417 26957 +1161233290461582855 26958 +17929822500921318403 26965 +208787720529776137 26968 +6500332478534814723 26977 +17527872697910394883 26980 +0 26983 +1436715985740534791 26983 +7259324023326572033 26990 +13616980442114094595 26991 +11989871806199482884 26994 +18049391928171046404 26998 +2348129893628711431 27002 +2143194199258271746 27009 +14092180993918221830 27011 +9801623755463312386 27017 +14195740580484729350 27019 +9803124421150553605 27025 +10816782357994013187 27030 +0 27033 +901068270668570628 27033 +3497443508606598150 27037 +4357456412218394117 27043 +6973330539006237188 27048 +5041724034333788678 27052 +11150395976534933507 27058 +332000066340868613 27061 +14922621564214126596 27066 +15094895760524083716 27070 +1722441699299897861 27074 +11974014167420798469 27079 +9184102620063967235 27084 +12382051695089313282 27087 +9323417491116622342 27089 +1782582342376880131 27095 +1884580856210058245 27098 +12595903208123166726 27103 +9532267579801120776 27109 +10254745611543500296 27117 +10686003471404411396 27125 +915354497230220806 27129 +16629028752607140355 27135 +11452598146900946947 27138 +16584533337837836803 27141 +1173837254526333954 27144 +12550233575223316483 27146 +11522173677029551618 27149 +2470400434563669509 27151 +5422762347299761155 27156 +14993212851102904833 27159 +17714463571857018372 27160 +15102855663794168837 27164 +1367334434752116742 27169 +12635273504519977476 27175 +8068044802032619011 27179 +11009400167082576388 27182 +1831598667348637189 27186 +300206304468616198 27191 +7287423899691977221 27197 +8262893207927267844 27202 +9776631744107233283 27206 +5256710787449839623 27209 +3325313162496898569 27216 +1582257852211192324 27225 +8219245287897874437 27229 +7803426097268346371 27234 +5269664226044603395 27237 +13716361679061471234 27240 +14644223514120921091 27242 +11798771630740101123 27245 +6966323499378643463 27248 +6675671572028502532 27255 +17005374497853868549 27259 +10868938849124961286 27264 +18010584309903407109 27270 +12047834391674040326 27275 +6404040253294264835 27281 +17460582980058472452 27284 +16969525222822637571 27288 +483277799092455939 27291 +17331249202410206211 27294 +8474118663113083910 27297 +4001617938897362947 27303 +18127274806199374853 27306 +103282098524103690 27311 +4482916999278105604 27321 +11921619250520573444 27325 +9110989652445481478 27329 +16082671713940928003 27335 +14636383019101991426 27338 +6454812723984165889 27340 +10842771062793883654 27341 +3618158929348574212 27347 +1989959533020367365 27351 +9607446019093179397 27356 +1551136878812438536 27361 +17282480354697683974 27369 +16753726835720065026 27375 +16878810692208423428 27377 +7570298741478965767 27381 +2936647655091593731 27388 +7786734902563060229 27391 +18201829043227020808 27396 +788233897531943429 27404 +6682518947861395458 27409 +9429180065988483587 27411 +2334971045857193987 27414 +14821329012873553927 27417 +9451310781069559299 27424 +623376099224083972 27427 +7182665830854666754 27431 +10783560161432391172 27433 +9811798413268192771 27437 +2039698157233842691 27440 +6016481299672906242 27443 +4648363994055632386 27445 +16903846468228179971 27447 +9692218226681251847 27450 +10837150339544740868 27457 +3001973247140076036 27461 +12573844650187006979 27465 +6992190895032488962 27468 +14614649110491045890 27470 +1571698054313717250 27472 +3801458767595498501 27474 +1688283588130783234 27479 +17499772686860033538 27481 +9320786964962413574 27483 +14665582046311143426 27489 +12375167229161074183 27491 +18156818210118712321 27498 +15539487076902052354 27499 +1223471304503691268 27501 +15919566797868698115 27505 +15929192700121291269 27508 +9374411591875857929 27513 +14854117269421352963 27522 +3846050171284005380 27525 +11335470970640859141 27529 +2013901752797222917 27534 +5784471517996397570 27539 +6744046946657422854 27541 +16373216103296174597 27547 +9536214652926972418 27552 +9033956476939438598 27554 +12547231179349066757 27560 +7659745524622468103 27565 +15730093464262291972 27572 +14264973356853753860 27576 +1073940270101903361 27580 +1794581202754454531 27581 +7913738456819301892 27584 +10335908714015709187 27588 +1057673475068073477 27591 +9571318234701181444 27596 +3885320158935123462 27600 +7876518912308534787 27606 +13268031077525482497 27609 +10847301515155502599 27610 +13563845673891144195 27617 +5981118572658320386 27620 +15446893933694315009 27622 +1399236513518853637 27623 +13235059203361521154 27628 +1203721769572909576 27630 +803803674774941185 27638 +5874732067706151939 27639 +3159910226666438658 27642 +2196286546903102987 27644 +2035795113895628804 27655 +490721940481129990 27659 +5717527980656148481 27665 +928309901655580676 27666 +5112896691045796354 27670 +13382236456941776900 27672 +6477492675748518404 27676 +5277295886150110724 27680 +0 27684 +11005219938239795717 27684 +5847725934908801542 27689 +1640218877152997378 27695 +4818234936557756937 27697 +8759579150687487491 27706 +18319688464425117701 27709 +1494316932479347202 27714 +11055121841065881095 27716 +4824792377325358595 27723 +2441123696075267 27726 +15913703863370449921 27729 +7608430830275507716 27730 +15956334909150771205 27734 +4080924765564415491 27739 +10576625027305013761 27742 +1323181948150787 27743 +313033290177742339 27746 +1776427542963808262 27749 +14388861971797638659 27755 +1775357233608142340 27758 +3363501173727874051 27762 +0 27765 +9308433499745982469 27765 +5276224411256330758 27770 +3988593014847274502 27776 +11216970942360866818 27782 +488258262902660613 27784 +4950952705910089218 27789 +3631476439088841219 27791 +1294779717687377923 27794 +10715803137916163588 27797 +5328725985145536006 27801 +16776743523519132165 27807 +0 27812 +9744829232405560834 27812 +5341756538827965447 27814 +12039445084268695555 27821 +6760263371317772290 27824 +3332009157790863875 27826 +10320838674814260742 27829 +16949775230106059779 27835 +5861644478749366275 27838 +1726395507824388101 27841 +4762207345663982082 27846 +17231522098167322630 27848 +14421880835698057732 27854 +5023077295979502595 27858 +10517850086874432514 27861 +5967440146584827395 27863 +16527541002954472967 27866 +10436331953910065668 27873 +2389760603551931395 27877 +0 27880 +1144865120765657603 27880 +13217748892195369986 27883 +17352613428464657922 27885 +16874883911103640579 27887 +3625054944999195650 27890 +222641457109766146 27892 +13573804061346845188 27894 +16751024350720579080 27898 +17270022517511147523 27906 +16483865784783036932 27909 +10095698891733476869 27913 +16091801845664832520 27918 +15924732150171906561 27926 +3743350229006833665 27927 +3886476840331721221 27928 +4098326747457178115 27933 +15621319143650570754 27936 +7534482055619792390 27938 +9010562698180718596 27944 +3181775493912207875 27948 +15797105414076362755 27951 +9296861234419807749 27954 +6566949203661880323 27959 +18068146058198479878 27962 +436316601605250052 27968 +2885835946433782787 27972 +13153676947951734276 27975 +17723621905562034182 27979 +13819549391996856325 27985 +2003804760717710853 27990 +8205931975694454275 27995 +15125294250247107587 27998 +6317449691354001410 28001 +4219322813745858052 28003 +13285516621104327171 28007 +10989625686350212101 28010 +8320728291070231558 28015 +7004984528467301894 28021 +8138899476543091715 28027 +6975996642794673667 28030 +0 28033 +14477087581034197506 28033 +2266445890966857219 28035 +10863628170032659461 28038 +8870992452930714631 28043 +11103743873297186308 28050 +3493084442508635652 28054 +7613967897028892678 28058 +3227404645997482499 28064 +13609388987549826054 28067 +844379174302879746 28073 +16059796883572610052 28075 +12409718663534289923 28079 +1685610172745182724 28082 +8449226054224638467 28086 +16964148549595787779 28089 +6652492446995490305 28092 +16814385779031072268 28093 +11373855676045344263 28105 +14374167088413822980 28112 +7338465394369864196 28116 +12879728353448430597 28120 +9698711388291870214 28125 +10740258424332114948 28131 +17511360503302813186 28135 +14334197222464534021 28137 +5455664294809846275 28142 +3889380993401960453 28145 +10808463882408597509 28150 +16505424262269172233 28155 +16403084178452968451 28164 +5488877421673754116 28167 +7260525236711706630 28171 +4696250748284396037 28177 +13211486618893089797 28182 +0 28187 +14405937888728907266 28187 +3604799783293285379 28189 +7050526473530572805 28192 +8342118180843459077 28197 +10059889109467995653 28202 +3363515925853308420 28207 +12058020965264691203 28211 +9644600519615225858 28214 +9444876214311674372 28216 +11350208736578022410 28220 +254014860943010822 28230 +9191340437695017985 28236 +12105950291699320329 28237 +4973744494501989379 28246 +10572028240281957377 28249 +15005000415016487425 28250 +1170475292465013250 28251 +14610503057742862853 28253 +8098380612115629059 28258 +5070386353942812164 28261 +13208117600015078405 28265 +15377808355664708101 28270 +15348765223604192264 28275 +5390474485189083650 28283 +8223672257288811013 28285 +11843635436557724165 28290 +11206162458096382986 28295 +16033956667416208902 28305 +12589412289300688387 28311 +14266728349861871619 28314 +4267034585002503173 28317 +5814924700879080453 28322 +3549144793931417608 28327 +1011041673916844546 28335 +12374553421143135237 28337 +10630726501372303366 28342 +15562317555394782727 28348 +8177121955889117188 28355 +14211569375672433669 28359 +17146586774501263874 28364 +11745490811942546436 28366 +3235954126176388100 28370 +7828615272567475202 28374 +18114499259696720389 28376 +16593842778257996803 28381 +898166200350760965 28384 +4558614593671642628 28389 +9703465472593849348 28393 +5040571854608980995 28397 +16159692675805888515 28400 +5747351305253837827 28403 +13766686556146796036 28406 +12321083553511142403 28410 +245293378479454725 28413 +2527865748840571911 28418 +671396008333757447 28425 +6755770754094261250 28432 +11917262911950073347 28434 +0 28437 +11854058001767773190 28437 +14179283291829380099 28443 +134373028844454406 28446 +10034393354179604484 28452 +12221759817135455235 28456 +18011477218108530691 28459 +13969845616243802115 28462 +1089417119149966339 28465 +12735284320972413955 28468 +7172355266274189829 28471 +10491091757293598209 28476 +17512173895328646659 28477 +13854244387665177093 28480 +17824241592496628230 28485 +14832920351129794563 28491 +17824119926557303298 28494 +5782297239942292993 28496 +10764918475682580486 28497 +16715466561939157509 28503 +13281573129439463427 28508 +2056712948233608707 28511 +426165506969822725 28514 +12888684045008132103 28519 +9053398823455370242 28526 +17336215333469513729 28528 +18135979154388678147 28529 +17201334874352393222 28532 +1723356914923388933 28538 +16618674322630411268 28543 +6927553433081135107 28547 +289718581383745539 28550 +9098370825422487556 28553 +2042623869618211848 28557 +1146133447527424004 28565 +13212711791705075203 28569 +16656584854303180292 28572 +12572817499936624643 28576 +16495758352791886344 28579 +9369465163504755209 28587 +18008101913589939716 28596 +17369804729127171074 28600 +10587960006650902018 28602 +8620579858862876674 28604 +7157134710230219268 28606 +1015657708556980228 28610 +9356003711502009349 28614 +1031312370930092549 28619 +7612008806781787142 28624 +16607562693107749893 28630 +8568560037012391938 28635 +12052143592608662019 28637 +15532402070317715975 28640 +10502933739744537094 28647 +642902553308375558 28653 +3831226227702153732 28659 +12409485542406821893 28663 +1204132007906466821 28668 +11295560234266911746 28673 +15507872800999186437 28675 +17473039362042592770 28680 +16874692203455670787 28682 +2928165155303744001 28685 +16015610506460756485 28686 +15324885533455863811 28691 +2256839257844861442 28694 +8853382759335904772 28696 +0 28700 +9886455693472769539 28700 +13763521238001075203 28703 +4060090142792666627 28706 +11706047132741561860 28709 +6472252586696652804 28713 +0 28717 +15765020684687997443 28717 +7024624666103097860 28720 +5462753588276397570 28724 +523795216989565954 28726 +15467199474791821315 28728 +13275389291200395778 28731 +2475555437863681025 28733 +9607422861033050629 28734 +16542534775475255810 28739 +9923644374322809347 28741 +0 28744 +11762890047760966664 28744 +16395610519953129477 28752 +8643599986767270403 28757 +4680251321657830403 28760 +7886544113881836037 28763 +18100335970417702408 28768 +3166177673145484802 28776 +9327728589623866885 28778 +2285617782327759875 28783 +13965281430759948811 28786 +4971808050061984260 28797 +17866929591479090177 28801 +17042883909468065797 28802 +18021391754670301188 28807 +14498545658744043523 28811 +2006739692947066374 28814 +10411253569907978754 28820 +5145498990519415305 28822 +16444844687595390981 28831 +735410016066073604 28836 +17067338696161135617 28840 +16901334427956061702 28841 +2792593367151667203 28847 +16801238504242486788 28850 +12712325001406675974 28854 +16095230693407693313 28860 +15936609986207438852 28861 +17067750192879406081 28865 +15333719036836194821 28866 +15646620585964832770 28871 +14797746461655280132 28873 +9290569442509729284 28877 +6317952758739202051 28881 +16231961553342372869 28884 +321800802723052033 28889 +13584434525326312454 28890 +8525616112472134659 28896 +5689503089897523205 28899 +14195194120926960131 28904 +17331327368140907521 28907 +12717739267676483587 28908 +0 28911 +11502403691957495302 28911 +17604302121809893890 28917 +4153720625085576197 28919 +10212477135288064517 28924 +8817432328782411779 28929 +4495134564576483333 28932 +12167956651366092290 28937 +12017383539423245829 28939 +9501236034756559875 28944 +2295133439312901637 28947 +8732769352873553926 28952 +16075032288775313409 28958 +18313603218796584963 28959 +3060949486282982404 28962 +9823463615207083523 28966 +2891995868511851013 28969 +14907903069978727431 28974 +2764131931438161925 28981 +6967772881039249409 28986 +6223601220339009028 28987 +2763385844645452803 28991 +12019042483414708225 28994 +13419786462306517507 28995 +15063579675448973828 28998 +8896417646520913410 29002 +14700063690716129798 29004 +10046348414274082305 29010 +5344487626671703044 29011 +4611562515937225735 29015 +14965680219308433411 29022 +10318803624594633220 29025 +1463966924492120066 29029 +14596261665692102146 29031 +8789093157025207299 29033 +9654371579036536325 29036 +0 29041 +8906380587700728833 29041 +16816574082282547716 29042 +4448330955907774468 29046 +6375757011593868802 29050 +1602212385208045575 29052 +3572481030199282180 29059 +10008620628418993155 29063 +13271286948872834571 29066 +5238377377933459971 29077 +16757864975786004994 29080 +17593612359936842242 29082 +13051584215582799364 29084 +8423024020667539459 29088 +2423106658742851589 29091 +16481016440824012294 29096 +18430216627881030146 29102 +15139285096087502851 29104 +8239649138843060228 29107 +3469186207717830662 29111 +15830424202530588165 29117 +6581018834123716105 29122 +15789574596323324933 29131 +2963342602993265157 29136 +5624390516394881540 29141 +1790450151060238342 29145 +13038007301254403073 29151 +10594749091586140163 29152 +8920847488983915522 29155 +7427668914158840836 29157 +15110496269677746694 29161 +6185104222967057926 29167 +12593000518292551686 29173 +5973147807534836227 29179 +7395539839025771524 29182 +868840097759251462 29186 +13463110284063083011 29192 +10368962378148727301 29195 +4713806715307677698 29200 +6250001449646425091 29202 +5405720363654814725 29205 +3187013777846316038 29210 +16059184211163681284 29216 +3764928086254023171 29220 +957449202281837570 29223 +18409873855032721925 29225 +6426551321317575170 29230 +1682402638484997124 29232 +1805098072492632582 29236 +7104762322263786500 29242 +13517149917478566403 29246 +12604250581900897794 29249 +16862646658799758340 29251 +14415225397741895686 29255 +305625961345777669 29261 +11260737380908026376 29266 +16359788414603555849 29274 +13364349071461839364 29283 +7337443529497924098 29287 +4261515270118546435 29289 +7447735784412458502 29292 +12212736271937741318 29298 +12232209887385945603 29304 +13390908735652078084 29307 +6805947978688978435 29311 +17428092915439775235 29314 +0 29317 +9672494822143983107 29317 +5137719982673004036 29320 +336874906740476417 29324 +17388952240079238657 29325 +2578513365418002440 29326 +14087915943972995587 29334 +582621624951719429 29337 +0 29342 +12584838770663609347 29342 +4147292332721115649 29345 +3292122421166123013 29346 +3667354360248334339 29351 +16768871779376893445 29354 +1902758103816471554 29359 +6523546155408460297 29361 +17813280975734395395 29370 +6224287249403795972 29373 +13669982250452536323 29377 +13341076330759644163 29380 +14293098934227611143 29383 +1816653744873552388 29390 +14272695589484578308 29394 +5688032699464201217 29398 +15252695206923304963 29399 +13849446184339829251 29402 +10650997061537609218 29405 +18394179008316584451 29407 +12907476786081478150 29410 +4139825861324158470 29416 +1823865137316715012 29422 +13928499879807597571 29426 +14251616686545917443 29429 +8898524832738356741 29432 +6742599723521129474 29437 +16749526192511615495 29439 +9879804729782895108 29446 +1447684966932512260 29450 +9733786695900717062 29454 +8940883584465882113 29460 +4058655346070766594 29461 +5624772647529890817 29463 +519295434243513352 29464 +1233079942036435462 29472 +13247112848601841155 29478 +4266900495908525575 29481 +11718045663883139587 29488 +3583919942788913156 29491 +2174654148715484674 29495 +4422611502403411971 29497 +16559771998305512963 29500 +2331135494074928642 29503 +6871499043113983492 29505 +14329086904529404935 29509 +3337314035840573955 29516 +5214711758839982596 29519 +6330893514543333889 29523 +17406550705589452802 29524 +7688568101928572929 29526 +11517821915434861060 29527 +18243945847143981572 29531 +1454994119942469636 29535 +13638316797770497029 29539 +7843702726065972230 29544 +5562968487687761411 29550 +8522611700094936067 29553 +11004272510676596225 29556 +15084890462187945988 29557 +18045957488835277316 29561 +3538345522948319749 29565 +3970771538655395333 29570 +14138351798262187524 29575 +1180136369659199494 29579 +11406181661649156613 29585 +4783497507482071554 29590 +2402941237590972417 29592 +17132537603352860165 29593 +4702433322579917827 29598 +9674812952215768070 29601 +69081766659005953 29607 +14579697367285540357 29608 +7999726578752138241 29613 +6428975881139499525 29614 +7052169996220272647 29619 +10680399772009010178 29626 +4536047539072899074 29628 +0 29630 +15826039429580020742 29630 +5245148884771670530 29636 +607074983645271553 29638 +15745249145054054404 29639 +12131086600258927621 29643 +563888695258600962 29648 +7061025051109434372 29650 +3708559402022777348 29654 +16083462252151616516 29658 +15880879740278806534 29662 +171426583477672451 29668 +15511078036502409732 29671 +17216852673827458568 29675 +5617727268510531075 29683 +8024996604384297986 29686 +2297473761257340417 29688 +12323886104428456456 29689 +11328762910403783171 29697 +15447847389222722563 29700 +12349554671705870341 29703 +4567833863553495555 29708 +3732456592044106245 29711 +8231664756309725185 29716 +3267362584522692101 29717 +9524773010625958402 29722 +5811964255603210244 29724 +1070088383772529670 29728 +2537406609496519682 29734 +14803661885159527426 29736 +6312943530737393669 29738 +8110444840047646212 29743 +7176334498499146244 29747 +14058039387792699395 29751 +15169792689431166467 29754 +18088865934519351811 29757 +16398339274146746885 29760 +10443863150248381446 29765 +14770547353187780612 29771 +17719342372573721605 29775 +2664975923473701892 29780 +12646693243846520837 29784 +4826710605621551626 29789 +6943633528855012355 29799 +17816282824649897990 29802 +10623303539888195076 29808 +4385932695181354497 29812 +17027012988127992837 29813 +7253401811106718213 29818 +18167125983772461571 29823 +4814930003154700806 29826 +22016669932071426 29832 +0 29834 +12100258260688946689 29834 +4758409647488238598 29835 +17430049652946758666 29841 +992861376646371841 29851 +15096791897249129988 29852 +18016834568128480770 29856 +17385107123701630983 29858 +588321580726793220 29865 +16697938239322977796 29869 +5736659030050895876 29873 +16330912578220441603 29877 +2515451208478318594 29880 +2164148044958082056 29882 +2325751282787148290 29890 +16396081059951610370 29892 +14983517770217172486 29894 +16085663718450063364 29900 +7285132258374895105 29904 +10572986958445018629 29905 +12833246185589934596 29910 +6447636554940617733 29914 +2202353723542950915 29919 +16075080294721038339 29922 +3166923922368512006 29925 +0 29931 +10298285324409892360 29931 +15333063537203022852 29939 +12907038480681762307 29943 +6492842552131100677 29946 +4704184932110593539 29951 +3433219726358612994 29954 +14500763476944779265 29956 +7625854148978155521 29957 +9461809952991494146 29958 +13730547131328014346 29960 +983153615087691778 29970 +13275485276824515075 29972 +18085847897146898946 29975 +3554861731131312129 29977 +14806411652981354505 29978 +11145068024525702153 29987 +909749405897881093 29996 +2476199110342981635 30001 +2613573169563869700 30004 +13523671049703767042 30008 +14110474859937713155 30010 +17576912583626599428 30013 +15913427229484016129 30017 +2648621074867866629 30018 +14703303873583101956 30023 +18347829779311069701 30027 +13383888230999048707 30032 +1995887229537386503 30035 +8428042838411819525 30042 +9476180941400330758 30047 +9238143437956059652 30053 +16385612505098446340 30057 +10861885217512871942 30061 +2480250995507072002 30067 +13148573110135086594 30069 +867032704334898691 30071 +12275130144382082050 30074 +9410894462220690946 30076 +11836877733916215301 30078 +9720055673692032003 30083 +6659477774486116867 30086 +10308751041135007746 30089 +13763730345419341826 30091 +3268663127635409923 30093 +5290951473206291975 30096 +9069521782296097796 30103 +17666290167494248450 30107 +3405611334312201218 30109 +18323272419860160004 30111 +17539476207565510662 30115 +85653795364583430 30121 +8560304411759686146 30127 +3190417476410562057 30129 +642359636370592773 30138 +10813161837319305219 30143 +14542297602850473476 30146 +10332797345328492037 30150 +2242029096545891332 30155 +6526662045868537348 30159 +279308234901677570 30163 +12350299812601003526 30165 +805802566307788802 30171 +18002646765896846339 30173 +8948507217656093187 30176 +8060523702983353348 30179 +15646886228811620357 30183 +10870587801845401602 30188 +16911132881442463234 30190 +7641550832688464387 30192 +16473837308521569794 30195 +4902301583813576709 30197 +5023908231208951303 30202 +1460929338837772289 30209 +9039795532949942274 30210 +1291875584697304586 30212 +12111087266862130690 30222 +0 30224 +13773587441905475078 30224 +14729033243904416261 30230 +5293416284078215170 30235 +13320186602059841538 30237 +7519812522841175556 30239 +9363035743313202180 30243 +14660887055721548806 30247 +17957289355772212740 30253 +2829720452540459523 30257 +17647195421948033028 30260 +3856733476797652994 30264 +16549369705908753930 30266 +12310792812452135426 30276 +17514486026234011654 30278 +14496724320103679489 30284 +5280915393796706823 30285 +11865033130965747718 30292 +11959436972008615941 30298 +4239106116107555843 30303 +10250443795182241794 30306 +3448556172891906052 30308 +11249423071018960898 30312 +2537525124462416391 30314 +5460465030174589447 30321 +15575561375121843203 30328 +6446650893766662662 30331 +9098156061432271366 30337 +8996267651058745348 30343 +4986799749388069893 30347 +17128598104392092162 30352 +14288891696882919426 30354 +2021048820488480772 30356 +18351071106087180291 30360 +15045635583282886660 30363 +13783009326481729029 30367 +0 30372 +4491020854160594437 30372 +17126995738840011778 30377 +5338962182555110916 30379 +1451543846879291396 30383 +732760755323449862 30387 +415169820803559940 30393 +1000200710864270852 30397 +9422308393032687111 30401 +6294663824237519362 30408 +5223548785574550533 30410 +4736900074710119428 30415 +5283973332845061124 30419 +9686613176177159682 30423 +0 30425 +6996532535157431300 30425 +7108747376955592193 30429 +11977699762089501191 30430 +4608051765771447301 30437 +5168058496681237507 30442 +7784757370905373698 30445 +16569193312725025282 30447 +14784593508332860932 30449 +10940705921890846210 30453 +5092777084011795971 30455 +7022373175748471810 30458 +5307984928686069765 30460 +5145131368659417606 30465 +61074356899098629 30471 +3041894724569154051 30476 +5726827426732187652 30479 +2564555373708715011 30483 +9215844719042921475 30486 +3746834053193074692 30489 +2101702217557916162 30493 +16598254846643675650 30495 +12623335308780354566 30497 +11388167919164633603 30503 +7722908667833408002 30506 +8964933738945016834 30508 +447940713398856197 30510 +478889576481511938 30515 +3116605263496908293 30517 +30522 +15524056308156023291 +7629281350801770423 +4599461227359910264 +460010501969 +1256398974978584954 +989585306368897082 +15287987246124194458 +2624475553087776397 +16770481615952636575 +13217700199285026669 +1998795817793894308 +2596888135805187815 +12916811443309585866 +5885297337779768445 +12395414163197940292 +8707080274745652023 +1470296917966146277 +417018684979 +13950077918785244145 +3331190244687228266 +2848546760629840622 +9168593207572981830 +1626046267480552182 +17462940151928540698 +2949113337359051253 +10158546382084904624 +17782439637510196490 +2676033351739115904 +9870724626412586 +1817503749366507070 +8973743832958979213 +14215481509680276661 +15309398074547711327 +2583578220706283961 +13065070596957035663 +1042835199137174697 +3798785647455202519 +2602164597383903970 +11214613651591212145 +9870724634130246 +5885976121588465511 +5196829205934730346 +1709856283085515333 +7141996804578035196 +17994826932708531266 +9870725141919161 +11757180014592265618 +31586284216018038 +17296410966260724126 +16760836077873724 +7033105760275398997 +5409264972054029930 +8221823040559397780 +1147642989435908904 +1286221629024853191 +9391897706793229984 +9555769852467766351 +803141333804871076 +8211561456004118280 +2625039564398275843 +9941138681621846632 +9870724653478986 +585952638193572928 +5600195317109704044 +18062046967310139496 +15663328263737785220 +15287141171121506780 +5831598103021950485 +8391049291537016037 +15289397396921983501 +1997667691995678329 +5895024564989800980 +15287423178925235854 +9612178895991302071 +9870724661212262 +15294191589786195246 +11681251366039404763 +10475598666844162653 +1467988644601212440 +10460733961090783380 +266904255345554194 +12318365723906542221 +1996539665076540673 +2946293117443911132 +15791923486860602889 +7194265606575489711 +15293063562867077655 +9112482678314975990 +30458222903562826 +559089197 +5883901131227669995 +10905496688719717893 +62915730 +3784374912697835249 +5671807405265998899 +6012976174249615771 +15288269305517057761 +1730290063664633729 +11232862455617701263 +6250067602413874614 +70648994 +7300765490991137662 +468607832971 +8253999917178707836 +4017417587998156051 +8102805470461451750 +5303893093062348330 +6757860745649796762 +17375405732369226410 +7032259685272715569 +32432303330233792 +12991440749543298882 +6431101369878920541 +27356059670505293 +6154199846417673706 +14256452938553695815 +6205475701751102644 +6527884510368848273 +9870725207645734 +1873618231088915129 +1786642098172010306 +4613852900778660097 +15947115216739130074 +17289631549178342487 +3532982538532104270 +6981265889333346589 +13252643833685290771 +9870724715345051 +3187423099130618061 +3878614004656906925 +2384543510041933865 +14383055795155834 +97715420 +7138759569688363520 +5319918520868022537 +10394854768294779799 +2624757556593386511 +3477471148185364775 +17479635317879229319 +3867407656721258560 +6736241924279245438 +5249797155383874856 +6103488109872367256 +15292217487864372433 +4342724821818092661 +1783548277597102313 +10714918364066035497 +10042583961566655224 +2414448873112820773 +105448723 +1983843766236893480 +1038040993376331644 +7087765773748994540 +29612147900878008 +14108728388800812184 +16181045709928024118 +5332949825900711062 +101405088373681455 +1361488768782918516 +1192315299587690172 +9870727242610477 +16488501822810043827 +2819377816053302949 +16354230178502886383 +5812897583379456955 +7299919415988454234 +1873618454645323581 +8854886177038032283 +16035735729017541604 +159421316186126130 +3222869534187936207 +11069209987851051781 +2813908262694556245 +6156455943246587425 +15290807388655740683 +8813451672089094387 +6925759852446220398 +232154798099 +9717750866933276307 +17785259896117865555 +28484129580278724 +5851982645744113574 +196694351502977939 +13304646022541500331 +11132577981273173969 +9019152132478280631 +10344377673806138876 +10163351606963747367 +9870726269597365 +13819031587993432 +644154969 +2672695638434128587 +12393440069873437715 +9086434751042308681 +18144287406214883035 +6264336012520277319 +1650738764618625506 +8990977686124377056 +32150347115665324 +15721176019379709155 +18328376701227789973 +520196988774 +6722191038494891185 +163448162 +498703026811 +16153465402256013747 +7086919698746311112 +14414852539201695218 +2843741475563247766 +8597138013777583604 +8709732826087623533 +17634637760346538519 +17631552790872271952 +9388164695702249920 +1254706928152687733 +10381145633145054645 +1572796379011507385 +9870724800410883 +13736232135137770051 +13460349110998221489 +17681752695418990978 +13948385820369056540 +14363308676198719275 +15288269249628629603 +3999491521748356935 +17616677733309049856 +3598538847360734352 +6407780380180963229 +7193419583161959063 +17060688321802281929 +4550503020413738468 +4713167469917857325 +15292217539453526977 +14916423074419061387 +6704085945551444889 +2366626164980330471 +5876226285749414149 +17079630191614978340 +12484612888872834224 +5352348801563765950 +9336987562237568258 +933515197984678357 +2367574150131823865 +11722522519282145054 +12799106027345178578 +2203614370003173607 +8412057600244518600 +935489342897154319 +1873618506234479507 +3204066844433990471 +14946201981959087685 +16434950874865748014 +7106783930712005948 +4904404320319052296 +5303047099741311443 +16892239413473718313 +13222096480399396837 +5939887919898381071 +9651137534997766172 +13050601114700232252 +2625321610894510754 +10513874242729437849 +12738276254631803278 +2625039560098984005 +9870724854543670 +1992881785903856274 +1873618441748678927 +311384754869251181 +15292499491369978872 +2785415326238575884 +1733166933 +9194029986771398058 +4365596477677984798 +15593960942208499279 +9675056182159544482 +15268775188645635853 +1466296546185010362 +1943289755113510023 +8180059236188099590 +7192573508159275635 +932669187467795769 +5303047035255546313 +5356296983911098272 +5835546388547570309 +1317329508063867494 +782962408223956285 +8545007112842921653 +9811526506704620883 +3547456411520090646 +252380560 +9870725877823044 +4255178349871964848 +4011069717272668568 +12116988438795739565 +2571803318972004151 +4927877544240421979 +5295201909141159528 +1167049841370884849 +10481515389337031496 +328478129841976552 +6672837949675878809 +7299073392574923586 +15288269301217763005 +3611166367999739156 +17215878252576708708 +8971856406698617191 +10167299892490541466 +245710197296357438 +9096726350103080350 +5887235996162331894 +17783567711719199942 +14101035093612254 +11977864089922064691 +1270478860423737113 +5353476806987746016 +6152225697205919296 +442814582043 +27356055371210669 +9870726408795869 +17190313216042024565 +283313582 +14956089009447721650 +6313103557196270966 +14262234001769908425 +15353111055435130549 +14383051495857630 +11228068150976606367 +1410790466306073023 +5408700909154274074 +11611468529673987426 +3068049046899137789 +15438526495173861369 +17933750666284128452 +1432829561057785309 +2624757552294091496 +27920101075004342 +5247566007868484656 +17320052027169532259 +2698559735878272497 +3831400973528283286 +5993604007128807783 +17627202174358263055 +814286485 +4826570575824119234 +11292821522090302091 +1935660024149519519 +818153136 +11237266887800415542 +11300160798669233168 +16879729066389214173 +15293909556188034116 +2850284722128904643 +15287423226215075212 +9467310877348145129 +5557008752083027647 +1873618450346020308 +5248105001080403459 +10754469081008513509 +4791486465568876233 +1361662533288282391 +8351021376252891085 +16358402449810345790 +13290656284748632148 +227855504403 +968496635821772068 +17944163576803978038 +16367553597842348808 +10127586034317532321 +15294191572590285005 +13819027288702679 +17006104435530867673 +5901227768804950936 +3189961199463960195 +1573132449850090686 +13859301711093646340 +15292781537867410482 +5780604289886654026 +1605337806596763639 +1518982380352857485 +2672421311952599598 +9157067900260923083 +16251805842761936863 +5194291114197480294 +12357142887632169892 +605557034314829394 +96258139764430244 +14229542852125748014 +6377011672450819552 +3493083035910933725 +494403725586 +14581733581932556777 +15945141119116524477 +5406444756436931131 +11238262650285724543 +3459957951274443637 +5462796855430091810 +8799617787702427309 +7091632722874428840 +5887104174302325394 +30740265101711654 +17756287572256048746 +10808002067170534178 +17665479438249905570 +278954004969969440 +17305164455171199886 +9870727009367834 +16215402270900379099 +18315937179320329316 +830399540495409508 +11149959913285820482 +31304332299482347 +5621982556817736485 +2395604898 +16198687013053688781 +5993604058717963994 +14633483086300318850 +6914519263123223335 +7879019275372531567 +10352699001901052059 +38835486526101373 +1873618544926988182 +6717643103419573200 +5352348797264469932 +40932558193245269 +17954672406052483178 +5785116591022102636 +1873618501935179977 +6926887926655221912 +17407775140466473235 +2411071396 +5405598724426047092 +16052696454644592536 +1981657501801261006 +3462214048103355889 +17448309298063492298 +265627134533331391 +6262673858549852251 +15293909564785390193 +18446442990319850223 +11182322173924232442 +12914923429176565113 +5884848086070735407 +379647476803593749 +3453178577183854176 +17542946455516547821 +15290807392953769020 +4239948864342087539 +15287423213318465194 +2625321606595218478 +2625039555799691627 +15373960034460589220 +2412665836111730591 +3431717726747184072 +15287141162522917162 +1840738113231656340 +7088047772955312626 +12162011192766978253 +9870724567167937 +1531985421723914527 +9870724571034568 +260967875911430091 +15292781546464744903 +9178090636032107097 +6520140091093883726 +868812296638846985 +9870724574901212 +6872944261489385789 +5726358153366673376 +11260491923127621762 +15711638307477870312 +11818157132458101781 +1622184526995346901 +7734243451317273856 +11483777213875046168 +9742034253351631204 +503001063142 +6926041851652538484 +3934614182098834766 +8754016916637699798 +12538477155043513887 +32432337723461669 +805679524421050719 +15287987246122935112 +32150286927941862 +5516046791189021530 +795641534022568630 +14101030794314749 +15288269275424515478 +2146416200306528789 +1411918531917725448 +16655465042802839521 +7126195226022784504 +13524360535096450309 +4690184287621622973 +6423923764031281208 +9870725102007662 +438515280056 +2624475531592560499 +11842863504061843152 +9870724605834245 +9870725109740943 +5773587630547822091 +6453783688492567070 +1284455503083422926 +1042835285119554664 +10905173350565415314 +1988364156 +7032541736068186435 +1041143148010812452 +5009194185446669134 +2786543391849062873 +8363198908260968902 +13681696359428852427 +506379815814642135 +32714354125706319 +16874923781322653118 +1944417820723986922 +15289961326549609359 +6981547940128817455 +12162857211881213544 +9870724625167387 +5881584636093090571 +13453519300172077763 +218681408484889630 +17324797938978137603 +2052045680468446243 +3671038 +14143644136688063565 +6879575328001833229 +13493553732200249454 +7537695 +3911134543245754926 +17946822069105815095 +17760612867621469546 +11404343 +11846258750106249385 +6153071819498469920 +15292217457771817006 +8702030264114887840 +2206716481647028810 +15290525393747385888 +7193701582368277149 +1873618489038550391 +5515050465755668345 +3220611591653301733 +9308649427282177913 +3933486056300621980 +7407043819254670597 +16068156643263859136 +14418466534433295917 +15287141171120262317 +15894193108039636411 +5566476498435443603 +335239252809042523 +6587399347873666185 +13693253505669549604 +5722409915130917825 +15209512063275063087 +14245100990001005341 +933797197191002259 +12644080653952552167 +8753170850233533865 +17063720868378326938 +16432418256543496399 +16871265277961256774 +3038114471257579373 +18349862087501945096 +538510833 +11444170014255885452 +223556211193 +3228036267942109810 +6902477434606788740 +2042496903 +15289397375426760829 +15291089439451213066 +138579808724085498 +9870724671566990 +16369420319013754427 +9078366157069957119 +11183571704128154928 +4443634474708587167 +1554057000 +1733110154606955913 +6980701865126134027 +4386668139559725110 +18413391983689269330 +11279918573498347831 +17120804882392510278 +1514961573407562608 +15494352691276102648 +15293063541371843741 +32150338517103231 +5565348480114828262 +351895551019583834 +13086328443852972385 +2837475523980259743 +5429433323061333427 +490104447669 +16457530956312368790 +11967097193144606172 +1955074291192262257 +13513390332480987407 +6524975230323345246 +2911559435924496773 +3870997107617308014 +49642429453071194 +5879046432580187225 +447112611794 +7087201749541781978 +29048123693682485 +17941343374083509398 +2431982719322314678 +2416614035654907370 +13850612818404511436 +32996413518581579 +11286125290817795239 +740331179229255790 +15289178944639886117 +10381427610856196552 +3517578625989434115 +1041143135114195554 +7299355391781241672 +12061232556372402454 +5996988234053992984 +18304893710506924569 +7190941895787616245 +6197818834070612485 +9257277746004305542 +2239872160221716394 +5984954169514466175 +5251489270997407931 +1167613826886937472 +104203525 +15390728623807289507 +6605958281447026228 +31586314309935874 +12852758387335646012 +6088875966159459989 +5352348771471214669 +15287423252010984579 +28202091682807525 +12084836356065344380 +1873618476141921794 +7885906741318986866 +8635985927846780981 +31586271318139343 +15290807388654478063 +2625321602295926099 +16366386920213000161 +17781311606291717716 +7086355674539098550 +6155045908522470181 +1089389850446149536 +6128307541450452356 +9995197535073997232 +6206321690771601905 +15291089448048530375 +11180753484910450760 +18326431800623128897 +11513845083936944019 +14821223763399480790 +18272579795703786380 +9944700266957453840 +4997605251384557930 +15287705225421395227 +7415538610404546471 +13819010092772606 +154469687 +5565348488712166097 +3229097897723825405 +9362328123013340894 +11742834345081909157 +12057284339630633050 +498701771475 +9551365454677031500 +14791913126549401043 +14022690072277500607 +9870726291551934 +14549761466999921646 +30458188511713005 +12060668497771980938 +17804060812849736700 +2394639639130030343 +10296928487833286134 +11236970531217629174 +27356089764440658 +4534407047512672583 +1786360098964397459 +1256116941380350272 +14101026495021470 +34406478336631793 +9870726299285190 +109394696450803884 +828707450676532763 +5885543850455012253 +2945165086225419895 +27638097568148871 +5058465021028544452 +7687600354340398109 +7354015405254837215 +2624475527293268065 +16040186186740343167 +12553974444628906480 +13615927846551034792 +7241043922144660560 +858398218214576845 +5529830611051370069 +12424382439595707400 +11370043875115429034 +11957902820310142777 +16390551576946826936 +29612220986633810 +30740204913966171 +5903884228619468800 +6979855841712603379 +5832726160033854316 +13614115066376567879 +13316150991155898424 +18412545960275738682 +197002611 +1251604691834055735 +4437379979283355809 +11452522727666175780 +1413892608045113873 +5410392964580126213 +16878448794260035738 +11951091679077670371 +7344550947391498597 +10911952814937685564 +2150364421346368684 +17939921402619501490 +4133574841719471206 +12987787523270726230 +7824637840407287516 +6043037466324245285 +15288833295331177023 +7192009483952063073 +2205024383230808541 +1785796117749063825 +6929959708802227106 +7871853591972160091 +6840459473421803186 +3007753865419557605 +849524320139695045 +1873618484739254055 +18272015780095156769 +9870728842016564 +14764657101031878835 +9870724845565213 +5831598141713227455 +7141015688012694093 +1732546126101692370 +8171425314112418061 +15722382516523325738 +6551614956226371477 +5138916826086002089 +1198918767384466286 +10588235898704708703 +988739278655997199 +33278352538405974 +12158132803790527139 +5722409910831623056 +15229096404798835 +3261565670785291501 +7353169330252153787 +5540680986801153843 +1413046597528216202 +2359415848762427008 +493559452283859290 +15058453592556785784 +14565855901331778999 +6881347171592906558 +3807130416385772008 +9832686126736295150 +17327489778991972258 +5401056691908072875 +9870725368804819 +10132679198804491240 +10690462835536520713 +10290327232817928640 +1575616521542971754 +1125687328531818223 +2298109076185749133 +9870725376538107 +18098227022771143324 +10112349153519034475 +849402218485273418 +6954522878053916067 +15289397349633515244 +17996069787993648772 +2276123859217171351 +9870725380404761 +12846750210874356229 +3788597100941953082 +2835783425564029591 +2992491432143695885 +2465915733178064192 +11644549546702873435 +18327605819744869951 +15287987271918839981 +4249311151961291217 +1868611368115260183 +5755891984756707572 +5083563915342270630 +7085509651125567902 +10003986808099848613 +929917219948139083 +2624193528086881925 +1945545894933000176 +5387900141979257490 +15288269279722560198 +2502785113463406395 +15287987228927025959 +5832726211623009717 +442813333471 +282068382 +11073865650458147423 +828707437779906462 +7612361991563066326 +421319346139 +16800446660977438073 +5822433823627242836 +285935031 +6366353527348399644 +6196126735654408668 +12255671445621650769 +3365548213300979076 +423703827937522535 +103743349278198732 +297534929 +15623949474932069517 +18175101559871003495 +1043117275727352749 +7246669497425658616 +5180680959777265849 +1251604678937435106 +2897724829972836929 +273937202870050526 +27920101073767397 +8115273316579240972 +12595141875602250326 +1309214413 +7631966286953261944 +3974700764184055222 +4562124381333884663 +13346139703866761276 +816907943 +9942463108347864303 +1873618471842619293 +1320814300 +820774598 +14342899168741705604 +7916614371163646264 +1899850279307386621 +11444170061545761082 +279124222843506536 +16632567774389937528 +11313764932574393330 +9105612360230662145 +9851298011526990785 +12408793658117407563 +5009357308242899453 +1340147431 +6583596437319798352 +4535535134618293591 +1374865351926091421 +3913452348761462572 +13292684351442611528 +4197549513321244137 +206360286599 +1693503902275620778 +15292781537866161052 +9592738396937938595 +5402945070619055213 +5888796302811271523 +15639645420123016371 +5835546354155746016 +14739094180206432054 +15896859674140691210 +1256117001566835413 +17094376519214261101 +5599429747268672744 +12908144110973182331 +12982671511023606402 +15132481537671971541 +6262122720842048001 +6206603702874548385 +6781430324967401742 +1597022911781738689 +1363347177 +16152489459093476388 +13105031987622068312 +11653222710562603138 +15293063524175920753 +494402494717 +17298949096688017209 +5991347897402027979 +8936416115184380208 +2486454635153090478 +472908503292 +7352323306838623139 +1837917927709746549 +3596136887273985845 +9165456129352942625 +7852905094729064352 +6926323902448009350 +8755764469561451521 +29048106497751595 +429916705757 +15397078589241438507 +14383081589792865 +10169273981513321802 +27638071774885706 +1605019678889548794 +15293345540578176746 +8484392770843383672 +29612216687355634 +9870727015855899 +546966169530357930 +7592843752711736378 +10429165941191227029 +5459976721497342605 +13921708807377076830 +10617906773240338015 +13072526435092408028 +8392045041254747025 +1707901714615781853 +2148672322930151047 +4758410102859262429 +3723184253158715911 +9439679720166874481 +17644982711755747755 +1873618523431780312 +11228068116584732854 +14206929112909103767 +7087483748748100064 +11083988851659773596 +15112016058677993638 +10189090321643823908 +7562135700557800888 +3733753594647237117 +1134125493305372097 +13226010606693793719 +12531357558345502833 +10482361438545193273 +13186249660293072809 +14755227646041592830 +3784724792312664061 +15287141205513497525 +5293539447540681884 +10747542314255327630 +5357989129618594145 +1873618480439957820 +16304492486363994864 +8755449666619317926 +11770418089422174045 +6041909435105811298 +9653034717995082156 +12024068771569089007 +31586254122194890 +10743598362790153195 +987047180239770171 +5599207760805185651 +10375505339483622009 +12152601868746496740 +1730854036284011213 +2625321585100001444 +6153071746414109946 +16567942547986325000 +2330447533672306343 +3935460171120536019 +5354604863999658292 +11292010839550732036 +9870724565922744 +1338765348637191623 +9034578601031454717 +7016310497406234309 +9870724569761976 +3387142657418801694 +2442023618815074219 +1573642372331228182 +3206637242895979337 +9870724573656014 +273182570212578694 +316743105212853596 +2412665771624715286 +16952496369064364346 +2845029541903936866 +3223433562694579018 +7462267818244330394 +17469317028178652890 +18213996529798046265 +3143159678306029373 +1915314009234745453 +28766150283170115 +1406696323579932447 +16968411150078184275 +2106141661137490293 +15289397302342414439 +17530831070139853150 +5353476845679044941 +481505857284 +18413674034484740200 +1776768864815358596 +315615035301915237 +5245848942942771138 +5215580144625923265 +1411918531916484972 +27356072568514730 +5517738906802532036 +5299098870104338529 +6366071515245382767 +10464976386601990257 +15882855686643583514 +5501745141036423024 +7462549834646555616 +5223960103625962435 +9870725108482668 +2011891000885325414 +3961803269376774211 +15692157487438783116 +15291935514452634695 +2435686161698282394 +417020072160 +14194830971440668226 +7426905677441821103 +8421459022910023108 +31022238513567258 +10067399823217160080 +8526790380748032335 +1944417820722750925 +6493812980615497799 +886444938757748675 +40245529848931559 +9870727124121383 +2030164825772412533 +17462940130432069930 +5458807700921848544 +1873618532029107854 +909620420025075762 +13515324999689920171 +2425835 +3364340290829110990 +6292492 +11902668864698075127 +17087641503657964063 +17175427809786596657 +17299513086503363641 +15292499560156451025 +16162827254851072492 +8309831114279762414 +10481420442142792275 +17892430 +6815608494671604753 +9870725143295420 +5778348197355733162 +7947698401704635903 +18412827959482056768 +1993152740197683744 +12428612728626959439 +2625039585893621125 +6980137840918921465 +1873618467543322523 +1788898229392916269 +15948927659834101632 +13341986048965749730 +15289115337529313319 +7871853531784416219 +9870724654855252 +13655523387674210646 +5915592292141436575 +7192291483158381159 +572110149897423102 +17416860906428775358 +5512098595943811459 +15291089439449945998 +10376580649760854212 +9870724666455162 +14648987522385858530 +2418058849019184197 +14318194643535794959 +16165083394671785792 +5461104800004442338 +7141297687219012179 +12663159498641186258 +11362090069724899779 +30458222904943456 +5493553925598958384 +6208295835683988829 +1575898585235084109 +4651906966371122607 +8587285861105358531 +8487173076311553473 +17589054587982730866 +11734883727065365868 +14426056237757183731 +11120471623495597524 +14101060888258990 +7646254130275764939 +34124461934315489 +7247797571634660130 +6313103625982731214 +3280048821686463265 +10114249505392779885 +11877318444661894057 +72025270 +2623911782530881792 +468609224066 +1256116932781755882 +13451263125959485619 +1414036927372402829 +12779319083936657563 +12644547818986621904 +15526082599812297615 +30740239307206600 +16582140215040897456 +3827505636603996319 +12410654537281525980 +425617416638 +5353476789790575301 +15129829070242601468 +3896536008686261624 +1122939678161447245 +6205475680254630910 +2116474955010753805 +683965395648908090 +9870724716721320 +32996392023376143 +15291935501556018451 +2122353976881661777 +9870724720587961 +9810233678125339723 +17424895205632055166 +2624757578088724506 +17912641785480042584 +99091697 +1842828987068135348 +3313969578832562283 +7085791650331885988 +27638024483792090 +689908947061972062 +5249797155385268374 +14801752117097289692 +14259131864331458165 +1873618519132477795 +9058418294164964652 +7034797854392517008 +1987794424247230351 +13911791817300791039 +1873618476140671010 +3189397158060823402 +5303047112639324616 +6684815990639653408 +6176104209096455996 +15290807410151092891 +7004085248451883304 +102615335255618297 +3583096215260900409 +13513632858283052797 +7246951496631976702 +1873618454646690845 +17147561398476947654 +17383394458871290733 +1840738130428959167 +11257008512376917553 +11585541199623370896 +15412641899096707417 +8699084620893795183 +1414738726038355118 +6426676126269206802 +2485203881828826198 +9870724759254249 +2625321580800709361 +1734238211620028933 +4438070835459857759 +1126071385316269777 +297236307772120704 +15292781563662055217 +2141783952 +15710497921254573149 +2308422087216275330 +848678344016028999 +18044499707125262419 +9899545279169581566 +30458274494113382 +12957312627536174375 +33560403333876327 +829835490493752599 +16318053789166626335 +28484086589835146 +2801821130539299437 +7353451381047624653 +10913745283874236450 +15289397341034917746 +3826127997021414584 +16430151110502796725 +11341629473176364459 +15287705203926186341 +15110373972374679325 +11807434647114706296 +17626356125150231548 +17092728787930853033 +18411981936068526120 +17057861910319879848 +15944859094115625573 +7671368224220993496 +6072517587095207847 +599078861879657638 +9216698766836518860 +5153885205510897150 +17351919677054728880 +16043288328478203478 +8752628696345683510 +9019028246175887653 +15293063506979991308 +15291371442955573987 +5141454965111866041 +5878959376267360473 +17620140702182491594 +16413762995541472007 +9890718886864437972 +6603702150226274761 +13352809046639646101 +9870724797920505 +9432352330309578886 +931541139053358338 +5937864999570396532 +1873618239687645063 +7586513367407412585 +7140451663805481531 +14842642043007030398 +15805659603365423030 +880547343113986857 +381285815416473287 +15293345523382236324 +340775890163879741 +9197666107275620435 +9190761456272085769 +9870724821120275 +14154804708694909291 +2292825785040636953 +1370042529145686522 +14546380453145489994 +2389047057022743082 +7570545418701594049 +9185113322238468699 +14665072197586004 +15082773189987803802 +7352605306044941225 +11705112931823721988 +15287141252803340744 +5467162260599686849 +1873618527729823539 +1410790436212265159 +16875205763331852914 +16254343951695231133 +15601094886964017695 +15288551266032244015 +14666204015189106811 +14238537293151557361 +1873618506235846149 +1894834033712966529 +16112354699463510750 +27920070981204316 +6994602712723562307 +15292499555857146948 +2525663005131294080 +12389845650708191640 +2835565962349988657 +7526907729180511613 +1734238263209190199 +2625039581594327613 +6262391790557143923 +15287141188317568140 +9870724848186663 +1873618463244036114 +193555791362544371 +7834125150625343605 +4148540804029886980 +9730290459103938412 +15291089478142487871 +14003328469233504617 +6156738032733325733 +16702955411327316306 +1730676563 +2364352882452613883 +14812347282180224681 +12533842212589682281 +15292781572259395565 +6209987959894903471 +1466296524688534497 +12698591837734581786 +5941261673266757807 +16485991196040957607 +1920901414660812815 +15434242171142238774 +7826218326618890007 +6206603737267771477 +9870725375292914 +3602002429360165730 +9870725379159566 +9625506809263368172 +17090754651615727608 +6823501973795781204 +12482179369149026151 +2566692452070004820 +12924404208197259053 +9870725383026220 +15292781507773608742 +9962038961394750770 +1174110314240825887 +18004909088860565763 +3380810127553749138 +5779476305958026985 +5516046816983672184 +14101056588964377 +689774581648222315 +7246105473218446054 +27638127662080869 +11695412827303452267 +1945545894931754739 +5623513681448673089 +10601535979009175154 +692605781988809629 +1574206422333084989 +1261040335092542814 +2624475557387198941 +13708672584660690953 +15657702785243041957 +5195983156726615484 +28766090095430105 +44686729980238151 +12452979941127647632 +11669272592120762959 +14586538897091797854 +5139762866696819047 +9720112053199449262 +13728324656744314909 +8262357255499889067 +32714379920353268 +15290243403139805539 +421318127883 +3371253340359830137 +5178673286195203425 +13883199269509861318 +4282792076282315927 +16626344201227802116 +7942407828307651814 +292423110 +17008002440344725940 +1410790487801422250 +9203956064266180301 +18061200918102044504 +4451849911887818619 +14195405002715261582 +2971324184531310386 +10169273951420750421 +15950390346513459787 +2553424187287810974 +32714336928536004 +2676033356038547692 +2417511727944522469 +17635078661888023403 +5904789091956113034 +807958179742554673 +10381709644455743964 +1873618514833190814 +8698802600192270930 +1730170804028256476 +1873622147625335745 +7963688554977900341 +811796095 +2442674832276205740 +17504292068232289724 +5344573059049414007 +2979056044617773847 +1783539909143192583 +1688658290302785010 +17076127469186345816 +11146338235232053481 +16960007587568566155 +7245259398215762626 +10530167802300925977 +2574671684328899864 +14972207280555307548 +6485812764085796240 +6153071780807315845 +2058763787074868739 +1413046627622141081 +1947665983897161617 +1732546113203809301 +11073969673675552992 +15287141175420930248 +17378396597546274555 +4376097526755190942 +17899266289968245721 +11405387964662108984 +10913926882466470833 +1592962175509342580 +2792183694107937526 +18002935038529071583 +14007593402781940705 +17781311580497199900 +1996539712367769299 +18323044829962260626 +2625321576501416718 +12061796533289884854 +13581745210808220742 +17090754703204881913 +7294584453512442544 +31868304917679429 +13819048784047667 +14066883983546537854 +2784572500549244171 +3092622612481078076 +7351759282631410577 +4587705734294754515 +5672976408645755397 +6980419840125239551 +13922694707403384950 +879419204419153550 +4440413848773678746 +15292781516370958698 +11506420668899595471 +29048192480129406 +17457597103457786786 +2567466199987927915 +18142877345696278023 +15293345626560556124 +32150321319923070 +5938379999540762619 +580246856915444533 +1365968619 +15289397293743820789 +3461791464603262374 +13928803313500379226 +16874641756320567014 +15829085955714274078 +15291371438656279938 +1576180575842889875 +14858224533326346647 +15503532583397123425 +2316900357241909005 +11471712530814412480 +6889169680069775370 +27356063969908346 +4557929156986016209 +2077730727998089995 +14653054815482754152 +14929509407482189358 +10518648256136753125 +14406506030077797552 +6152225705804645799 +9948159316760868509 +13408940439410131854 +34406452542125845 +266606291617276082 +16075145612971541 +10809976190586543678 +1873618235388346052 +16827900250325788800 +34124401746599071 +10531773896647592392 +17470703043924664471 +7914358239942877922 +7067500762396239601 +27356020978105246 +11904558297271063788 +11194288657586864917 +1396901624 +13135437312223947482 +1083255096133696412 +16397970535970121414 +11444274194798942904 +2624757560892801472 +502018164104236832 +6104616098099106271 +4201226681188379603 +5566476575819258812 +15291935441368269068 +6153071832396467972 +15290807457440937311 +16904712944498838664 +14106448213992946412 +28202117477443342 +638376641856229647 +8119194648364211551 +7296722495918007123 +1873618501936550284 +14993879453779367696 +7383235651682184114 +8752494394018110577 +17272417959105544934 +2105295650620520259 +6641851282131862053 +17937948248414687936 +5513358414629264840 +8907289990505706503 +11269183585821348789 +7990307593692922198 +28202074485634102 +1873618458944740600 +18266078030861644591 +7408735874679267315 +6155045934317123947 +2625039577295037016 +15290525363653585857 +7086073649538204074 +827861392871149148 +15290807392955143468 +16812272571148690734 +12965462578058694985 +9231301876101888854 +7857726175275926630 +10767791215706060373 +10898149942002916708 +8594986363551424693 +11966469445775084940 +5407290775552531051 +15291089473843181805 +14782687056266797853 +13263754581809433667 +1596798666559278191 +10757572304037028623 +14659363226899067408 +6479942129004121339 +15292781567960097133 +5356296979613161405 +14801386735943178551 +2147544240122500782 +32150372909076452 +2779214141606994236 +6371778741861437629 +16355799337686736860 +16186563438455114831 +8021450371307932522 +9950301033540375743 +1127379439846054405 +3452050537366752827 +15498676197682720569 +103179363763489003 +2789363568773777866 +15291371490245433615 +8196828602144216334 +7403331877045810726 +28766150281942789 +10542598463376395997 +1966540664 +17434705886281481220 +16733496955023337711 +14101052289671838 +2146416221801886626 +12906451939472591887 +16483006222726024752 +5194291058310387103 +1256398974978705267 +9870726099596939 +2624475553087908469 +9918656110710894746 +5724666024857845611 +1868497588297821798 +11111979366005682726 +31022281504131536 +9870724603343860 +9870725107250552 +30740230708608058 +12703047306041836648 +9870725111117206 +417018815625 +14160539488401890197 +11233051360444553500 +10167581853004538802 +984791049019026994 +3420009998155265709 +18412263935274844206 +6095117356077038079 +6979573816711708903 +4935889458764265145 +14019103388400103103 +5509410176393494977 +9870725118850460 +9649086479758069683 +8294888080286304407 +17625228016549373259 +12939897194050561963 +13939319480314519132 +2676033351739246838 +6495787104032729203 +15662612681012938878 +5132701493398683007 +1873618510533900654 +1042835199137307265 +5340331841180620386 +14882607364446570998 +9870724634264024 +16323423076943936800 +14690944206747223026 +2131496268116804063 +5560110941110679320 +2414448843017752121 +10316944353037986115 +9034197821469762247 +3773122177597967856 +17787115109969114415 +7140733663011799617 +13958691020226970181 +8942647987110832897 +1893141952492620040 +16647245 +10592171188278987914 +5510769159092269234 +6101795994258903356 +12152159633245030754 +14295096835833090046 +2520713139 +18100306653319816131 +5248105018276475524 +16793153298366684101 +6526103313131130399 +17643101977299737332 +17416860949419338474 +13696473583276414695 +1873618446048106262 +3632445656796974854 +1449461877142340531 +5048900096020145136 +10702295579806883945 +1842148156553248574 +17504806456181139759 +15294191632778161874 +30176206501458263 +14435745753470759356 +4656105560522559788 +5831598103022078268 +12266254924466635522 +9870724661343336 +29894155705918637 +1466296550484426751 +11950664064058467590 +12769623874203027952 +10375505305091780991 +948517604502878155 +7247233547427447568 +16095855390987863628 +15289397375428141702 +6044200327771986585 +547620388 +10040505446818061763 +2032167904025974417 +15291089417954745676 +8083932495104316419 +15228627241849546312 +18359963029326477039 +5574226195017184537 +16206357464900001285 +6927733945769656495 +4277348121210086494 +989585357958174076 +10159392401199271521 +563086895 +63046804 +9549673330466317029 +1842511385911651099 +16847259645936932672 +3515151174665983043 +5223590916417275645 +2418949835165669374 +15455122812444305453 +3119042838539409971 +70780068 +4695711032624499784 +468607970378 +570820154 +1574766379 +3399294746461938280 +447114008148 +7034233830185304446 +9337115557270873280 +8981039678082653266 +32432303330368853 +9870725207782858 +5671848343034008325 +9230173758901014236 +6101885543930729542 +7462757597657963796 +15448636417985555140 +13772803293243916909 +238774704081418153 +11994353924292964905 +1685722539444087257 +9870724715476125 +7246387472424764140 +14383055795285298 +9040588457434095983 +15637912256000959593 +97846494 +27920126868405979 +16663012318422248461 +6143314298442705464 +10240371631519788537 +10531295876509927693 +17053693683486776935 +2240811439676009707 +2624757556593513777 +11287271091089521251 +1145668896112726766 +642636517009793764 +6584171502140345356 +109446423 +8521743514451853718 +13394954019911517662 +5511666316213046808 +113313052 +3591160524196219953 +1873618497637256739 +11127945220196077621 +9733674673132483600 +15292499547258571206 +30176258090627319 +8827153771238612290 +4759630055225253192 +11572882286147809120 +1873618454645461464 +17620381885198987967 +857552177603883421 +1136519902700259456 +15564887666574185967 +651404385311217670 +14983704637822152192 +15291089469543883792 +328196126336507254 +7033387755182621018 +1469680738717089477 +232154929361 +13497936734142427359 +6206603771661018183 +11434534198373321480 +10771188028052609633 +17687394646935102282 +13819031588127739 +18035384405365761612 +2135718191783162761 +12470081210484677211 +1278666867056468152 +1385480031726495713 +2737644042509097270 +15628903405236415531 +8483828720841722387 +6260981682749926733 +151979298 +1169183797852974877 +828143404974104657 +2373990379991933820 +7139887639598268969 +1436145034594232918 +5461104765612607620 +159712579 +163579236 +2361672022975146436 +1946662538275013779 +14101047990359459 +32150304123992644 +8839492891961072788 +13618775005140047251 +9870726292928192 +17619012718253909901 +2595245444809782187 +7352041281837728663 +12703152595582539610 +15288269292620569654 +4717715115194539575 +10972264154087444376 +8018596485399135375 +11353495994446520247 +11775208443731858390 +13087443521783418573 +11509481292180438104 +8706348603460640687 +5991347858710870470 +7018768845480485424 +8723103376958503936 +7301047485898359683 +1627738421784111171 +5887104135609913420 +1894834119695355513 +5192880976296427904 +2250786948119012206 +16874923798518700589 +6175401884511257678 +15520597512816298202 +330734230969141627 +335592258898908449 +6151097734773869254 +8880986669644475109 +15289961343745662910 +3856405167043850544 +5350506414024510713 +12641894427878316320 +1846993591153810185 +15288833316826530397 +13492334015270638300 +15291935467164162157 +8818864656040145434 +11484092590567812015 +9280734854635474226 +7139041564595585541 +10389574189450138002 +1873618506234607656 +5136942702668879558 +7095231073850518331 +2670165163534670843 +11946207383162668300 +12537862846127017205 +5673149743271653565 +10503684833886225571 +7218388648619304842 +15292499534361932610 +17665625649697805001 +5831598141714609358 +2625321610894641743 +33278374033765544 +1873618441748817011 +1991460650378745075 +789173299824505041 +1413046619023568459 +2625039560099114814 +28202057289700709 +5778348150067252727 +3136160188967623702 +7245541449011233492 +391711721474044619 +987047141548646436 +1785796031766807187 +5458637911765423545 +8065904824869207191 +13557203629124117723 +237045127 +6462167827986924480 +13490877557398729277 +2071645033680477916 +1842430211648017751 +17238920448818955627 +7194547653071864512 +9985717550982647533 +16426766960961397587 +3005867732945034797 +17096567568145715373 +1096931248591429484 +16251775783276199945 +2200512120786595088 +16743946889314849662 +9870725377914377 +6364097387529047296 +252511633 +13357664682955713308 +9870725381781027 +18332726249486952038 +32432363516871812 +18111648107145546108 +13516171036001443968 +18328329116060104571 +13600538850271959615 +7719447165796246215 +9729444427091825625 +4733558161601025408 +3709150372114149480 +16226199658283087842 +8484674856030916084 +15511400850593152 +6017370950709941333 +10928543513068909114 +6152225697206048601 +4279896009 +5353476806987882752 +3931171727653753858 +15291371408563719074 +5245848904251622387 +1518418412034276353 +1579222659327671178 +6834404794769095838 +12347951701861297793 +5941023259389020041 +763683708240670158 +6604811754731352192 +15197950040446474271 +31022221316411888 +10419991129607644816 +14383051495990064 +15765845315338856148 +13055421963249400837 +1410790466306200213 +15291935475761495608 +32996366228868771 +883931539947787061 +2624757552294226878 +14961506232684933832 +3864669745988594409 +5258533463858877109 +935489351494623022 +2306803611 +9077802158657378544 +16786227350376893734 +17781311666479585996 +475082778886409186 +8097653480026868915 +2024060069394541378 +204285890191574844 +15287141218411486002 +1873618493337969185 +17475623036696860589 +12650561781710080570 +814417559 +1043399313624931745 +2839511229522716843 +5967789484706510214 +1318323929 +818284209 +848114294015544609 +16255672655665190742 +5029265608133456056 +6153071780806086650 +4466721302205187794 +15293909556188177947 +3151678678197806807 +1992881794501322407 +3125632139938701379 +12134140299873703376 +1873618450346157308 +5354454699551318938 +1326057186 +8587777487804788938 +14583143724133139071 +4845986449758647152 +2598597802082267420 +13470381452520862885 +4552679112490757398 +8904772251964757082 +4451132852614027491 +227855635515 +1839046040610036280 +4479439747493675364 +9550801404675306080 +16395380765236335704 +12884401972733171261 +5727354362725224931 +17750109864738753441 +15291089443750625836 +30458270193554495 +13841528428355807254 +13819027288832412 +15294191572590416114 +1758695911178917151 +5432665585007402835 +13944990570025458058 +5780604289886803910 +2796988996371825026 +13910011282498204085 +5196265259110061280 +1093547034561633188 +30458205707782510 +828707510864407879 +13992926930698728306 +2416648805697671449 +494403871574 +13183405131349765377 +5833854247140856683 +2889033060382827881 +3221657593420539364 +17856119810358337239 +11406560962116461288 +15025010450384835266 +1547628808116653893 +2239293815682329254 +17998422724495764244 +1626046323367891245 +16150166559522891000 +17467452392876358265 +14261952002563649638 +6984556889450880650 +11229712761320580097 +11331286578391820119 +8781693865030079464 +16350816611302459070 +878291164603312317 +11848991023465322654 +1755968139084384272 +30740222110019965 +27356042474686666 +10432184963839765295 +15288269245329453857 +12327358852314114697 +1188221409487377316 +5659496662666732053 +17919894351466864333 +15568274631689571456 +31304332299602091 +8900822151475637658 +29612195190893347 +7889607765372973807 +9461095570455468433 +7017077945682571803 +31586340103332695 +1873618544927135787 +9723436460710254838 +8054291783897989929 +4643874913829341739 +7583819773709390176 +1038040997674503212 +7034515829391622532 +1873618501935310693 +12159755031452408396 +1468961208480458413 +15230238344891338496 +17597526069088235188 +15290807435945720932 +6041909456601164844 +1756054153440868511 +5351401868216248610 +5244615830698877786 +5992475988807146920 +15740334315621935961 +10477405321844698550 +5357989108122145931 +9347818859729928413 +2625321606595349501 +13672685481887613132 +2364808934755619717 +1895116067312526317 +1884114794138701284 +12825132176710712845 +2625039555799823174 +843266976055498635 +5421478547177560514 +684134236397639346 +15291089452347962725 +33560429128531438 +1095239150175204068 +15222009040885001901 +6812506322838687968 +846986211207952640 +15292781546464889896 +2785415278947601090 +1336364348443668476 +9870724571165642 +6983055104012986217 +33560386136707749 +10159392435592512673 +2917340475806475433 +2206152513328455930 +14408475056152408742 +8790820602769260008 +2716569126995504494 +16645742803937348453 +5821427805628354466 +3124549171711137164 +11839960572506024264 +3345314076699877929 +18411699911067631644 +6979009792504496341 +11139197364043002726 +15077014993470368298 +17946419746716148160 +2185307547272221239 +5943738332688503404 +17244622751296786513 +5254153735964012607 +4990689493731859346 +6549705653208170726 +11640209691602212249 +1730290055066171716 +6928015996565127361 +15509304376346679750 +13037893016074336360 +7730859228690280189 +15289679310147501780 +15287987246123071960 +12875452261825144839 +14101030794448751 +101487235252051377 +9870724602098672 +9870726102218384 +2686125770936301528 +18271169730887036883 +9870726106085009 +6209141923583495091 +15293627599972423652 +438515403731 +13559180624084808604 +16236633348208216469 +2624475531592691858 +9870724605965318 +6640227700110090199 +7140169638804587055 +1201144675527971880 +8513053874342606560 +1200046906080642974 +9870725109861030 +12137988731925307617 +984791049017779517 +17226423277848442370 +9181763891149279503 +11837009089245419703 +4123248415798552403 +5731866642365506629 +492242401 +14383047196689196 +8002570657905844357 +1092418960352550871 +9870724625293560 +1193298139301687034 +1873653535808187136 +9958298427727630729 +3802112 +5836392403362672816 +5558136817694804225 +1041707215208725925 +7668769 +17863879857805267630 +800797661642583570 +14816084101072056110 +1836789874996047214 +11535416 +7767896574335212873 +6474545449992729560 +15287141214112202981 +15290525393747519104 +9288263702480623163 +3398915934342550893 +5675796559774556225 +15292217457771954638 +1873618489038681504 +12425249087118926258 +8390416516393606860 +496865393490422897 +6927169921562443933 +6103488036788119402 +13303525797616641938 +15229100704225562 +5566476498435575396 +14029859268638502748 +2783943580416565306 +6267774072314096957 +11447129958722857891 +17089615562588171527 +7870725526360639038 +5782296444190215256 +223556342388 +17616192489741364543 +15292499474174196840 +10195897095599504632 +9870724667831432 +13318286230197268766 +16483976119680785461 +2042627976 +6886936648282540433 +8816997399457640320 +2158834191224745783 +13819022989539669 +16723638723969360749 +546375193 +16807470394773412381 +7033669805978091884 +1573924388733669674 +13133989111204362826 +1584875219904715318 +1203609471854912901 +8318787240946904820 +9958897131204844590 +32432389312756996 +11110227781838056870 +830117541287967780 +13750803869111880850 +4497812679950228058 +5782296379704438158 +7892626560676096167 +5195701123127186382 +7245823448217551578 +12921020011364764555 +5461104757014005855 +29048166685608176 +15741609139262217673 +5141454978009866642 +11122905463301676199 +490104572859 +32432346320937069 +5429433323061447789 +27356102661192524 +16879165037882907875 +5418869474106634730 +7308167250444834200 +5569296726948056238 +3614256319596406485 +330452214566834331 +1708674955075987595 +32996413518724265 +15291935523051368004 +12535324668410029320 +6214288376001339006 +15288269241030160056 +1128796743701312997 +1714117154779585647 +8860008145372657825 +1151813151427935760 +5496092094718742544 +17685418925849923847 +9870724718097589 +6311975556073145383 +6874826589841417502 +16633803289536053729 +2718825232421754452 +7032823730975408456 +1146660881160558308 +5251489270997534899 +104334599 +15339421027537586321 +27920105373200492 +3538912944908689751 +3717985454976223713 +15291935458565560248 +7086698151192850807 +6241248994236917068 +2380943364365619645 +3137008822602520605 +10166171762391983881 +8047942123475197560 +5461950819120059106 +2203332310609189798 +15570198675846749792 +11214613638693466856 +16354660846094453880 +17781311649283646030 +15091099644146751489 +2522029733630461240 +4039226577613970174 +16114127461296320138 +10929709085236881070 +681145240220936754 +9847013287382365469 +31586271318272226 +9273104017923969631 +5357989103822844489 +1007582093488578524 +11369197856001320774 +27920040887411334 +5303047091142863221 +14161425371177052152 +2625321602296057141 +10053520477123789667 +2206445497259541317 +14487663043221287193 +5810283119755942413 +1986666427421954224 +9870724760630511 +1149335070655082461 +5881866596607020156 +15291089448048667082 +5672976434440395186 +1842430203049439530 +9863670592665100817 +10064861692788749977 +14294336569790377634 +32150390106377127 +5780604294184831094 +18272579795703915952 +7300483461691147121 +16751736523360902296 +16306038188589780815 +10441809166173276622 +12013643077216718741 +154600761 +225782549235392298 +520141034337217944 +1090246828391490716 +13729734747357008079 +162334041 +13892586743661285518 +848960360419631378 +5464488923752698522 +30458188511859568 +14101026495155371 +7916549590872436798 +16888390078961504883 +1465168476274111935 +10913080833258434658 +7109030579205002263 +16778219691295259811 +8589681866025085320 +7868022685356615087 +232710822722871657 +5569296714051444164 +3408554609720189552 +12276488370442422750 +1104665456856409280 +11168138985428558318 +32714392818355174 +9070061068236691473 +3399294712070084493 +5133829485924780299 +17234876246831559250 +17580414741074830576 +5570988808168348242 +15288269228133540772 +7243018067057256214 +6209141897790235985 +30740204914083950 +2148672348723556599 +13497082958031232653 +17802959724583855123 +14887447490140052747 +6097847743125268404 +3690669377735904058 +11289095756821912374 +1873618527731213686 +3941610960235206407 +5111755773031552286 +7299637386688463693 +15288833295331306471 +8942722822241325972 +4883334480893977518 +9697577994188492895 +4080548131700363618 +1575334526634843430 +9870728842147638 +5357989133918016003 +11361114803662439709 +13515324952400178129 +829767995794996696 +9290648316666407942 +5910883915777926726 +16870129476681681950 +5347103962961236986 +9870724845696287 +5831598141713362597 +16910582417916254433 +8597156797828894486 +31586258421626227 +13237708561380147209 +5675796533981291862 +2359415891754380114 +5624359713460918436 +14538748281442821629 +5679318733072835847 +2286775792224971357 +15251812739584439055 +649506787993874322 +3234866947851553818 +1031980158290567627 +1464322401271434445 +15290807375757980489 +4843773175276328824 +6364097430519615792 +10109227365611621373 +219257047374 +14714695216411730689 +6033189169013537289 +11224688244128954980 +5516892784510134566 +9870725368935893 +17461812064821715496 +7107056528873508268 +4756890361776253783 +12278677980014653258 +9870725376669181 +2479344660154242165 +16426962334971532868 +4579724191744483869 +17627766168471809249 +894686142499726407 +32432385013457245 +8921296322069156873 +9870725380535834 +10241062054382293485 +33560368940801173 +16872949675101674587 +10498907911937683470 +16954188467480713218 +1990614661358430852 +14755893415135950048 +16169150765152492153 +2957933217444025545 +5886953915273208794 +7193137553861968522 +989585332163660784 +17949152557550749509 +7697026996393676722 +4849159622586687795 +16322708471081354607 +1730290037870255894 +5357143089007825119 +10585391788393908617 +2276633638193338761 +282199456 +5724700708918215197 +5671848360231330283 +30740213511444384 +16881139135504279002 +2427153079854183824 +1614810228552311766 +9152863560558388868 +17683726827433705029 +1884031979426635826 +5515085278788980011 +5567454343707898368 +3205834697635030010 +17624945991548479015 +7172128103264898860 +13909736915163045714 +15288833346920457077 +7354297400162059236 +13726914579031018038 +10159956399610745200 +6928297995771445447 +15290243360149344404 +7018873654912246234 +1333319625018796620 +2388600903224539022 +1801652064 +5778348244646972724 +5620854521300150552 +10636325326090233709 +805439076 +5622828666212607698 +9566893560642217286 +1309345487 +813172363 +1880166538707030601 +5301072911838635277 +18398400527636972344 +817039016 +1394617557421013079 +6155045947215129686 +15290525376551593943 +829835572175593743 +31586267018963839 +1873618471842753311 +18168229267880102585 +15291089486741191888 +13284245003722233077 +2625321597996764712 +1876862824976296224 +13721318416648586184 +4342548029519847774 +2623065733322774636 +5021744610238611254 +6153353818704911944 +7298791363274933045 +27920101612605150 +7529985804650425779 +1796696420632187644 +1413046541639891812 +1254142856654498036 +7993599274919923552 +1987993733308115919 +5720095897080918032 +1197790736167364211 +7721139290007094446 +15293063524176043999 +494402618331 +14258567865918906835 +6258161566011830373 +525267382264080396 +10196065168761509188 +17465760298758179436 +5250643148703735842 +2781470315819701435 +17205553309096939631 +10745117360613371633 +17302333254829494901 +7033951805184409970 +11972890457008117005 +830399583486105508 +1038886986696181680 +18122624728981788159 +12532203568862550303 +12750379446231830809 +14847634415788362577 +2624475522994092579 +29048106497893733 +15289961360942980174 +31022251410332601 +8557399560384875778 +5725098295990250344 +9387385384162627116 +1730289981981809015 +987893190756822190 +5779476207079137243 +16592324700378836731 +14425661011306891012 +16377260960561175548 +31304310804408610 +2340207219455515853 +1873618523431899819 +2671857266250374887 +5886107891859679537 +7086698155490897486 +15514012724331821623 +17107722821695714986 +5513358436124594980 +15291935441369649081 +1409877761 +7557072252417434202 +17786419758769778191 +8144030252697336773 +5575328534275584830 +11333843801103355362 +7652193328184976914 +27920045185447181 +11784456361685248129 +5249939254983662494 +17285796694619408970 +987047180239922615 +1732546121802519566 +29894190097917199 +8879970665920138992 +6045857724930876473 +11136179115413498272 +2277034116541194821 +13390152586296233021 +5347922253025848504 +13555232411643768190 +9250292664872486967 +9394728877040143781 +8351389659080773698 +37535263054705818 +8454374342362350060 +5780604319980723126 +6446485350622509090 +5729178244309135157 +9870724566053818 +8899570986408675422 +9870724569894317 +15289397366828310231 +7677136632586314565 +1413046550237236109 +9870724573787088 +7139605614597374493 +13409614757908405790 +1893705968102628704 +6209987912605201018 +614528662771486000 +3594689160137554975 +7300405137281263351 +128577854685265955 +15769828118059750586 +12831459332086121976 +15289397302342523535 +17135763052476438931 +6098975787241789043 +32432337722357811 +6826664259619394839 +5195983173922676592 +5245848942942891030 +16073122402187220391 +15289961412532127881 +6816736577478154766 +3344902977178069252 +9870725100893536 +12316906647216215899 +13936167227557769804 +14923712027778034775 +7300765460897465207 +438514162424 +12270241411262134272 +2103039519398511019 +5299098870104468338 +1646710721800247681 +9870724608586766 +6176793320558578101 +9870725108626818 +11848796854738970800 +14194830971440800956 +27356029576835097 +417020204788 +6926605897355231371 +15293909659365232063 +17299513150989291830 +16112072687360687583 +7196300254728775007 +38835516620161925 +2156139911701670599 +5885825892653289537 +1870471690219828365 +6978558332220748716 +7513578521803360849 +16596914960660786170 +638094591060882623 +10329598819219957534 +18212326332965262333 +9870726124172952 +14871830661500651490 +1329348746606294573 +3055331183876136587 +28202147570127718 +825887321043201494 +2522831830584090657 +17851769724795118906 +6523847130319958125 +2556909 +3666742348726039086 +4290363220392437404 +7138759539594691065 +5105416417023101755 +5792160745191250732 +10377426660277906005 +14880915248833191235 +6423566 +7342514853872617915 +6311975504482745926 +14851938262865553705 +12376984968939517496 +1785796122047230406 +16364556117061995817 +12623964559030440457 +15288833278135382167 +14971589244285041125 +8086055022667972398 +16640937553264010590 +12514692545578878847 +8995191259855150476 +18301217045165716373 +7087765743655322085 +13712725023991354102 +2625039585893752089 +15282335361333086107 +18172534385631580913 +15289115337529442288 +18104401478770383961 +13832769566562850759 +7197031008673093317 +17599750168450256040 +3468111627971684676 +9940375093616054756 +14552996435662220730 +15289115294537634342 +2344673137987639559 +9870724666586236 +7194265628070970036 +1545209638 +45089908 +4605111764584577780 +28484099486589024 +13304414760094803235 +5246976948366878185 +3094748918170462800 +6812788339242395808 +548996648 +5888796298512119398 +4051631991401297683 +10975651748375257243 +11740202408459717583 +1695502600845423310 +29048166684375948 +490103319246 +7032259706768195894 +303200387233113985 +4871276140776086888 +11527680931640644714 +27356081165969656 +468609360926 +72156344 +9096289819267053014 +13749155634583579365 +3878049915962805976 +7874673760297046099 +12420648455175102710 +6842721525454232159 +468613216161 +6981265910828826914 +5570988842561592094 +1873618252584398936 +11039716201406996243 +17455159575999836862 +12484330915461211726 +17182486729187872213 +1357540564939272643 +5353476789790716035 +3580797965594882313 +2582636126191177415 +425617546304 +8537320788649859358 +1437173080522901596 +13948385790275367911 +10693231836777901123 +9870724716852393 +91489485 +15291935501556143316 +13672484538110861653 +7193419553068286608 +13514397799870851301 +7372527710464579529 +7383208489205972249 +11764207343491952493 +14204954985191454832 +6803857177638874885 +2624757578088853603 +99222771 +27638024483901868 +11629511912559628129 +15453620929461364298 +15453599118730605044 +15292217509359871588 +6156456029227859638 +12886485019045153495 +847550209620591087 +15287141244206140281 +976902955175381281 +6050238139720474478 +7430988207035271923 +9202263940055376602 +233949656293315882 +2569533772563049819 +13669905534306183830 +10222252911390764196 +28202091681700251 +6929768589624698676 +1298736776759756386 +1873618476140793353 +8899713546895388280 +1198918801777827697 +7299919437483934559 +2749379632841777940 +1301152913159646823 +7029736333412801483 +17621268784989014301 +17217602240571382978 +5251489206510495635 +6321619769749815101 +5944302331101140852 +15290525359355667575 +485463575221254056 +6519669903541881003 +7241607916258202362 +14235153898493597210 +5303047069647648924 +10193130350469071357 +9870724759385322 +2625321580800840348 +2860001667367195907 +3732625572027452336 +637929045 +1338485804234001045 +11467879787434425231 +30176172108361368 +14749580058850364305 +13821175449456831956 +14308806572729122055 +5312941452083421047 +9537824296688362131 +1255834924976991143 +15332977698522082113 +13547746171705505246 +528614683759095459 +16145254715686010578 +13951205954302052749 +4726293920948112372 +9009022494402689790 +153355563 +16127951378661457020 +7086919720241791437 +5888796285615484141 +17904069509371020417 +10703476383554622576 +746320634841882087 +1196125078953745082 +6992199516214160037 +160954422715375549 +8294669686619704063 +161088844 +30458188510599869 +16432982289349544074 +15288269314115906532 +11229983338076704335 +1201174898606749250 +477206683385 +8047481268547643401 +14591994617252434530 +5671848394624536646 +7299073362481251131 +3461932078989862779 +12763379338554060752 +15288269271124106629 +3144873647871636481 +5406444717745907739 +3832076477923607579 +7359836753957974790 +11089948972150705056 +6417629343990886314 +12629788734211446234 +3441563578648981148 +8728845244435492348 +2469863992910571655 +11570046614019445087 +4268269652082113354 +2879810678943210115 +27638076073074611 +797260235523189014 +2188314514 +13971217767459525512 +10532987970627046333 +5832726181530581555 +5735908250287611067 +15289961343747045879 +15293345523382361367 +16704189977091404692 +11500631658516908617 +3403242980399804461 +3732501573249549494 +5938944006552184403 +17136135974801185833 +2552000627895196660 +1873618527729949312 +12915913686963679164 +15290807461740371464 +5408700879060614101 +6474545467190046806 +2861650874650479097 +17034137172525139794 +6101796011454965028 +10709931951062070853 +1734238263209305826 +11296478669291473147 +15287423239113224725 +13452391247458558689 +7155231185920400769 +9870724848317736 +5356297048398366763 +16759426304739642813 +2625039581594459615 +9076110043045187757 +10382273724550310478 +4419805489350143657 +16879729036295541636 +15196821992032057527 +2870969767997554743 +15287423196121410602 +973098480394184413 +230688127 +15291089478142615754 +10375505322287829449 +15294191606982390343 +1828798104530925763 +7192573529654755960 +5801668525329959324 +7456714667022557300 +17592553986939114895 +3207010306707708510 +619820727425915103 +13749379671945664661 +1466296524688660898 +17045009756596406301 +9870725871597114 +2246313880 +15270695523793440709 +9614378129971834515 +9870725375423988 +9870725875463745 +10858584038397980807 +6715767593188745992 +9870725379290640 +8326149882993530825 +17696435480897536043 +8935931329680125120 +3261183229037716436 +11479790064270790473 +15145788285944990094 +3766801901046927056 +15292781507773750081 +11715326547630645334 +9131616131521449150 +9870725383157294 +13916323858584006913 +15793142107499994 +15800256793861185831 +10681922109301075982 +13941261607942838641 +3602387540931925016 +12592603749474520566 +8918984013914903147 +7353733375954846674 +1385060917667960460 +5411521012994804076 +14101056589095045 +464310053944 +16770481620252184954 +13015501012126018525 +16882725726232389900 +8980757644483183789 +28766090095565294 +15876751444292409409 +17455978897138542075 +5832726190127934771 +32714379920476439 +15290243403139928881 +5022064850016942868 +5725098287391664860 +6523847177609812768 +12271803412857299383 +7332738546017981687 +180404055358392760 +16961033954905305076 +10753773017318512813 +5509410180692926670 +17297538988880890261 +5509953546228606969 +18315937149226669656 +8547670484909761829 +2624757573789563595 +9525246920338983636 +296420813 +17299513133793349112 +14038965094418048747 +13344092197623979817 +8385717597292224441 +5002118738619557141 +5194855086815787567 +15266924618528019193 +6104586261131038346 +9009348648356504317 +5600909797503867799 +1873618514833316522 +6747478875779044693 +615140332165423897 +6153334173113786318 +16993169885654359685 +2949328439242859003 +6151097657388970008 +12423571160430430792 +16158599967196082691 +11703165067112812464 +6926887896561549457 +5457397679095682036 +15287141196915030006 +15288833260939456841 +17905516655205033622 +1543385872365456300 +12587301996477772464 +1873618471841500358 +819660474 +12455518088752212663 +1690632435215393924 +1091290894742271640 +6100103861449606293 +262522563498547680 +7197556598095884905 +14947075703337240 +6215851847646191686 +145335340848060116 +6814033208644867789 +6638509038243232543 +435824003277011070 +2625321576501547466 +5912495605621467427 +6186790534994683677 +13819048784184525 +9628020868018953336 +11331649863678692604 +15289115277341696673 +17226906596973699731 +7597900317762401816 +6156737976845021819 +13463036398582701375 +6206603745865248438 +266904259645097099 +5351300666617307366 +8093823000016016989 +3275364878270930112 +5888363980090008728 +16278603497544051440 +6547626923385761842 +1588235070999893622 +515899211382 +15293345626560671217 +17628048184875491514 +7119982512147813576 +10280481390364353102 +15288269309816621527 +15289397293743950393 +2414921967332768489 +12221937665333733934 +10493014766646990697 +472907401483 +990293692895474595 +16959819427273994237 +9203109954870329535 +11631533293991107592 +11643343205250974407 +8733200714257205776 +9904941491952175138 +15636711705173454498 +5389310142310395010 +10199563252945938685 +13731990947362980936 +12830519767028080159 +3143159605221799679 +1873618235388477632 +3801029561147464015 +16150710423697376463 +5130445280494970411 +11154113042859304333 +69446730432522538 +6634239828521733308 +9870726022395509 +7032541705974513980 +5267137934678823059 +5832726134239481231 +5249797159683426594 +17855011663041290803 +2861932964138526638 +15287141248504187961 +9386257335748282211 +1839019217048590816 +1873618523430652552 +7529716633433681696 +12968618617149544496 +6760626619132743455 +5461950844914715443 +16757552527981218448 +213797988952784669 +6981547910035145000 +15288551261733068120 +15291935441368412669 +9117550437658669538 +4753072701990066704 +4926515851505969933 +1991460710566612706 +1873618501936688500 +5119287956539661607 +1192315303887244111 +1997667747884397420 +11846258720012570207 +969023931668845417 +2625039577295168229 +12333122794499095996 +1873618458944870193 +6812506387325859247 +3984582318705162689 +1787488186071604017 +1997675995964261529 +14809741919954164951 +1840738134727153418 +15292499508566174167 +7088047794450792951 +13997748926836315723 +2843459484954537754 +1169163685040567199 +932669204663978909 +9610711886643160271 +5195701200510978036 +534208710292958835 +7034510074967317752 +12590629664748538795 +12797258612730436062 +10906583514261360820 +615983703564503437 +1508117076984546065 +5198803530374459254 +1795638906892337884 +16387697236031728197 +215048501563371663 +12913795389359616074 +1893988070487237334 +5136367616353243027 +17546994619366186600 +15289397345333098588 +2329474663654438321 +2668764848316431067 +17569748279156548938 +6926041873148018809 +13669865326459634947 +5991347927496082185 +28766150282061250 +10195897022513898543 +1462765322 +5833854255739581055 +15287987267618435311 +14364395806089370596 +316743040725945120 +9023438201425760544 +14101052289798213 +12535112539958360175 +34406504131413508 +14223898422488099446 +11656072371967576785 +14767825444793889288 +7239351853822514651 +7532536797460379864 +1731418038994884932 +4368433122605610441 +5888796225427741768 +878291194695987645 +6614909541061834562 +3721851243620428929 +1347988088962506792 +14031704005807711478 +9870724603474933 +1667601868113785482 +5483309297806944487 +5299098870103226450 +16535576818062611451 +5410232016589430493 +3999491526047897248 +9870726107461267 +6117295360757940105 +7532271409416320519 +7087201719448109523 +933515266770036628 +417018966691 +31022238512474273 +27638058877132634 +1309930961534481139 +10887935285729695040 +1410790483502256470 +17944727575215481769 +4997369339010881996 +16741605793532304163 +15293909637870011234 +16893779652804831892 +1788616212989571817 +2676033351739377879 +2578055945648686877 +312512850573734346 +8328637003859954331 +7193701603863757474 +9870724634401159 +6660092369580935791 +15967564271985365328 +6986235638051510178 +5778348218852444309 +17956041976174103419 +7930103797640483719 +1777227698684564243 +11468824568195069870 +15289115380520022942 +2423244443410509470 +15292499560155342526 +9267865752796477814 +987047210333843979 +9870725142181306 +2908722406568709041 +7884037138607199734 +15287141192615746286 +1715039373318180934 +6817260743125508439 +10517531094797674312 +9870724653741131 +1873618446048239993 +16877682010409020614 +9232711897928240634 +3666742262745022105 +245051693117 +3403806987409840232 +13452391187270819674 +7404459882469940493 +9870724661474410 +2625321572202256015 +8332963721155325702 +17219576355391297021 +15287423178925484056 +17945855688117067225 +12662636664722034407 +17206207589599167875 +13306546789026964142 +12856620987784971606 +12314650515995439886 +16639527454054099819 +14055047205355866710 +2261778851902525338 +540018170 +5722409872140617232 +11305519054433422122 +12794742673428979352 +11127219626630476569 +7562235613620485181 +17571669445032356543 +1543964452 +6980701886621614352 +1197790774858631164 +18413392005184749655 +9811526511004167920 +14175810705396953314 +2946293117444165622 +1092693155076329101 +8555000716518368304 +5880738582585885894 +17346138111311812700 +18108263953303629501 +2860364611581866678 +2429880031183910630 +6108201112818510766 +6404165963640418885 +5726358161965530664 +16547637318785000073 +1146796978919267019 +10595566391331732206 +511599925997 +1746827684005492925 +563217969 +957809799325429336 +8192767926013271720 +63177878 +7192855528861074046 +4472348301814411414 +16225608884784490188 +14013342384479564301 +70911141 +468608092145 +12155898262057594217 +570951228 +27638110466298498 +4151361015346563148 +1518136387032139014 +13030536827766908656 +15501550415560783652 +15788142833298661619 +4596001690857120566 +13762653909580727251 +18328169869745600955 +16075141313797658 +5671848343034158297 +14258567797132579333 +6122269957538386810 +90244291 +630507990033642656 +15901921307375767715 +14383055795416324 +16797867144924846433 +12247781674335742455 +9870724723340479 +97977568 +465800944200673279 +15290243342952187274 +2624757556593647562 +6979855811618930924 +18412545930182066227 +16873513712206823360 +1605830456 +15287141244204882566 +5566476571520097234 +8059210139317383841 +16990917635978693260 +5776822643553810720 +5164964875350528327 +1873618497637395423 +4442687767729628403 +3688351137434529175 +12552846396214610909 +6514780288104294833 +15290807410149955640 +17781311627787178323 +3242943116712480235 +7086355696034578875 +1873618454645588009 +2625039572995875529 +6100103844253667370 +15289115324631575670 +6156455943246842540 +196067631845350787 +2790209531999698755 +9003422479159138194 +10403581416750859061 +5516892818902095589 +879419251709133743 +6101795938370595687 +7256417795175101628 +4738806703305800926 +7298509338274038569 +4326423634270515640 +15289397384025625080 +6633602123247283235 +10906583509962068660 +13819031588260322 +17944163538111718348 +6235138187520797039 +1251040710617543511 +7247515542334669589 +13326300925314146594 +16548883260086963049 +3387142631624423501 +8074562693751260068 +6921661861769323253 +11982867488767946796 +520197249180 +159843653 +3439258273440998601 +17274157531143610497 +16814175749157899297 +11875947810649568047 +6588119693086311486 +1252732783240505698 +14101047990507890 +451651625195343865 +32150304124125160 +10408833730421092645 +2624475548788743662 +2156289485251366140 +7746405201714874816 +14964333713099010351 +455711465463 +5245848917148372504 +17681752695419257206 +6210551954008446351 +15289961386737614174 +1201738987301137389 +7085509621031895447 +5343981295536721418 +1597254164369916566 +15515140725455259926 +16082815807453015768 +12979598041371795967 +5779476232873794861 +5570022803592197357 +6107189549764909257 +6366071489451011281 +15292217539453793441 +17307675940448187039 +2942283279886018870 +10864636208359481346 +194643303 +598680211361323457 +1698629444 +1873618549226546719 +38835490825661340 +7192009505447543398 +933515197984939314 +10593863342582546860 +1366000495400063584 +17620986807279226841 +17648172293253320872 +1784958299423588968 +16219982623696489426 +1873618506234732810 +7141015709508174418 +13524642504209078861 +8329582776954600962 +6818341508412951031 +29894215892536353 +9273081553817906125 +2327063003298020666 +15292499534362075386 +15721854875736943151 +15229117900280310 +7353169351747634112 +1873618441748941658 +16775357814075844352 +793246565559116030 +9870724854805816 +7830100036718498290 +15289115311734939230 +7836857277106828580 +237176201 +11411502596545517260 +1784103967742519882 +5365103089633748185 +11748432930270235220 +6631979652842005047 +8458776973033496628 +6226704385931034268 +6155045874129517112 +1520923136007739472 +11914531555884803763 +12163362974178038235 +9388513436875233053 +13884327330821183232 +8833119082998420126 +17365146581181273789 +15711638311777416370 +1095239111482826499 +9832244378777441053 +6199257254709911104 +8703243700482031015 +15177810505157775690 +9199725758037891950 +4844055191679947096 +507300639584 +17006904569361147810 +11313741884681245771 +16867932081105092999 +15288269301218028404 +410826680049161367 +8571323523540871606 +11653222680468929421 +464308803493 +10233694917695639091 +28766090094330504 +818063598963603344 +16041596230062052006 +18092303388892535950 +10811668319096801658 +5995296157133255750 +5570988816767063610 +1411918493225475649 +6926323872354336895 +2522831856378710742 +14383051496115396 +300171297002296063 +15291935475761617409 +14837489368893240948 +12606629882390082068 +5459976691403655491 +2624757552294357735 +13514134718701921037 +11319898081495576814 +10525378840839149389 +17621770955940122373 +3545385808015399786 +685262267615044811 +13510731800083435581 +7311508065872404747 +1576744569956416248 +6218953989384049109 +5251489245201780837 +14424533027378239886 +100641207540588041 +4390701973925752430 +15292217462071376014 +12450159764203185067 +12749251397817411235 +7576852735584047205 +5567736360111531816 +814548633 +15287141218411634188 +6594812275998482397 +818415282 +15289115363324077665 +18020127324728608484 +1834724218636358256 +9870725947684447 +5885976061400984342 +1788898212195877397 +10490356163380329747 +1873618450346282313 +2330884775762353225 +5356714232528117981 +3782349952020009208 +17304036342269886258 +15291089465244721511 +10426013281285123436 +5345109374043841001 +9870725959284324 +12745292127565859131 +2588868452679564564 +10864467494618337541 +13228094678249646207 +227855766796 +13729170697355273483 +9630003881633916886 +17390242286159555748 +16683019382329393040 +427496612462663507 +1144540830501134690 +5835546375651207564 +4531161121023729817 +13819027288965069 +99231065340133055 +1518982380353105024 +6362646432234287786 +6208295861478776046 +7594767479578448922 +5565348505908349404 +6310847447470980520 +3822179681402096883 +8963802060134030768 +5837815401971334200 +4693454884206488148 +932669131579597679 +279344297339666882 +5676048666125626716 +6233728105506802029 +8972508179933780269 +494404002569 +14171479472595097540 +13522386403080889368 +3054485070182308843 +7193860624759863622 +2543884493003304687 +12588069258829509531 +5250643148705123615 +5300226866929818384 +18413674004391067741 +451412170943 +6980983885827932438 +11007456247132004054 +12004719042858016454 +9158893242888826886 +1031583703478715415 +5813899563567244780 +13577364532720841576 +12753961153546954521 +15689904543889827722 +10599514620968899300 +11614330566543042744 +15291935527350779052 +15046845124926784609 +2622783458971053604 +6477301687749596685 +30740222110158102 +5460499872422694386 +3880306072979661938 +7219319658503893187 +16885259953617963428 +103461328575477716 +2146416148717642629 +12869109360656609888 +5604163284438293147 +17008002427446961156 +15291935484358973291 +15869995859650222739 +11070187651120768957 +1873618544927256829 +1074168619161708634 +1576462570750026678 +6211116016906930956 +1841584123748829920 +5459976700001012284 +5251489275296945729 +6817300666172459677 +473967541563510341 +14181317373568166991 +6151097687482915144 +2605266760617176659 +1059130335138111081 +7734678113259294546 +1407387388 +1873618501935440593 +14420158632848604817 +1325857314872575230 +33278412726432522 +6494066872183057613 +8824222954794797216 +12261119522412978027 +1735930322933213479 +5412367062202976367 +916886386616785492 +11060281909243769328 +17169981030136040858 +4603566563091883220 +15672533906063366176 +11699700707221915272 +6154763905018302954 +5357989108122284688 +12983787067031964735 +15287423213318719533 +16573439118994382059 +2625321606595480501 +2625039555799954326 +2430666663 +15287141162523191198 +8485238802854595502 +183933968696158702 +7029767686712727400 +17478309774689973091 +9870725059736926 +14424532949995833923 +9870726063683205 +16881703155413501358 +16330874579771460716 +17742190806917454706 +15291089452348087956 +7024942058865632871 +15292781546465018286 +12485983435209842875 +1731418124977265558 +9870724575163358 +18384965403790416341 +33560386136856029 +12480382703020102905 +12581750370228714370 +7086637695240896961 +32150351413980471 +17252293252061872757 +9573468698224447742 +194449071399968890 +881393336433859274 +5833854255738342752 +5387618078287403741 +503001334735 +10944945458828954202 +525512494730317266 +10435119494961387946 +32432337723722096 +17804060817149287489 +15287987246123198489 +14101030794580124 +1182589355307179681 +32150286928189611 +8971487671643285624 +1473120012 +9870726602389236 +103461380164641049 +13131763631778126946 +7247797541540987675 +2624475531592822739 +5567604654326442096 +9870724606096392 +5299098848607996090 +5971737394742304906 +1518418407735102183 +9870725110003090 +5031068290098346762 +14322284629040565217 +7812535215703286737 +10862211393490138825 +15290243377345400851 +13470256369253685187 +10934670399231453518 +799931625982605598 +14383047196824108 +15289961326549887404 +8991012634238145044 +16635669954819198029 +9870724625418007 +27920118269963420 +5463642917535230441 +3933186 +16198608137903151893 +2624757547995065385 +9301103273854003440 +2730411636852871148 +7799843 +956466122809086949 +5277452079515842574 +7793157291901394670 +15287423264907862110 +11666490 +1785522413911230567 +15212634620630618086 +1873618489038802983 +18412827980977537093 +6980137862414401790 +13065116392105518389 +8163729444118076930 +6276398748627899810 +1517290346422681423 +8376033948817453665 +15287141171120515564 +1873618446046996562 +12093541651285623273 +7192291504653861484 +9273103987828941056 +1466296550483316120 +16491624797135598049 +4200651629264717544 +13616281520887372433 +8699084590800135628 +223556472165 +538772980 +15292499474174341003 +1166767807772966384 +1223976962194279076 +1977945944815196838 +42599532 +15289397375427043842 +14273467008584201654 +9870724667962506 +7141297708714492504 +15110668359538520409 +546506267 +17619177932243278740 +13819022989670570 +12751507481748517489 +17999550790107536354 +4443634474708835117 +6639116864609410246 +7208512126866577095 +12156952909566334820 +15511117106600265 +5398761655846379127 +7353451350953952198 +15287987297712361033 +13818470844582220728 +2789363555876016072 +9733152077689742550 +61932675 +15289397310941236263 +29048166685755039 +14513749469580057731 +6596987185085902823 +10577967338929926597 +490104712178 +1873622676421373878 +5083563919641827177 +5245848951541608396 +17684252729367203360 +18411981905974853665 +6979291787411718362 +8853758085633282019 +1786642141162858210 +3383422525335881136 +17503678373373627585 +15290243428934576400 +936335344815725201 +10553879380855902964 +447112879568 +7088390301197156289 +1890885821271987783 +11997456096123430021 +1625764268273190406 +11485630194292779294 +32996413518842032 +1256398940586991357 +830681586991913937 +2229804632046438490 +5535810159209042360 +9550611856885431372 +14787093348585573068 +5995296139937321634 +9870724714362008 +15290243385942763414 +17299513159588003174 +9410331508428187276 +12459944628211159295 +11617115290818145147 +12951001515414807719 +9407311746210750012 +10591889158979004902 +9870724725961943 +10194768969801421863 +6736241924278269266 +13912241950506557287 +104465673 +17626237310165342607 +3669291476777311970 +1863871710920393231 +17788525174786054333 +5092441503082623141 +11892364506346696471 +1983843766235894474 +123222913558133404 +5249797133888939485 +12241985901089002710 +1873618497636166706 +9391368372458899717 +7238223779612217826 +9840127589292852530 +6153071806602086617 +8723923250369294453 +1608060286573171097 +14275831190517134354 +10587647911016209205 +14407856235795454474 +15459386004803185961 +6099821836448719047 +7246951518127457027 +1162004929974904308 +808802771997644426 +1873618476142194024 +5893456514394232951 +1785804408818325132 +12309852946450942951 +4347925901902436576 +5984930277138126373 +12511930394831101788 +15290807388654744893 +2625321602296188171 +18132460199058353190 +17942850211038500101 +1997667722089861405 +8126937841132246136 +1331604873527894164 +1919016334709235701 +6483565123786379685 +12260141588695426933 +14711223162699001911 +11989026848277881205 +1517290290534246807 +17570789919916563173 +17938415983754366754 +6364097421922417535 +7721139358792297538 +2623629473785990215 +1626892316688993210 +13010413693461215720 +654360089959796488 +9870726272480950 +2207492698792085192 +15287705225421657396 +5565348488712430556 +154731835 +1842511416005693296 +3418202265617249198 +13566705862512225560 +9132035970655721319 +15494005608834599680 +14531699947885697072 +15287987284815730356 +7545409860112565237 +162465115 +17374858374604661360 +9349334485489309120 +6098975804437851276 +498702039545 +6210168527151653781 +30458188511971655 +6205434751085581516 +7935261322907499480 +8132786387029480049 +32432333424445462 +1720270693429491031 +2791055637096315956 +16916327697533963766 +1256116941380600712 +6314795677108153755 +12412626186082462415 +4822199202875915010 +14101026495285560 +7246105443124773599 +5622264654903379966 +6232418373048739523 +3197141888701059059 +6698151227744401178 +16395493120484788449 +9165456133652505761 +434216248790 +6490821264810717006 +1673570409701987370 +3950954761024136574 +2433291595626399151 +4792614539776962762 +30740204914217813 +14665093693064079 +4802996927930050357 +18377832136810441425 +17412223533672716797 +5912175786104794871 +7352605327540421550 +14916423074418074532 +5556289740484470910 +7245446739463663843 +15291935467163052580 +18040034251410921557 +1783539943535309417 +13135711852817963575 +1873618527731345014 +3058475745781687329 +5784522635265968852 +841773672491864931 +1773948683590380480 +825887295247442549 +15530835708041503429 +16961952154105627427 +755643360619348858 +1107456968074727871 +5248105056967869652 +1732546147595934946 +4254959725487524069 +15287141209813047835 +17907754113323114679 +15792637963143685324 +11497169803738493987 +11792081802181291348 +7391210168387832770 +5638772024393745411 +9870724845827361 +10374084178165437014 +14973914568267278060 +1464040393467837234 +4792215385223618254 +987047184539349893 +6810895610969860410 +5992475971611338014 +2412665840410049308 +228197755 +1992881785902860897 +13311225526413709696 +10881390095320575321 +12712642341532678955 +7886367766511579274 +33278352538678035 +3245518644367681755 +5881704967874100739 +1466296546184032316 +7341897101159631596 +2191210670736361025 +12595423883407406753 +15275578571694567016 +1413046597528477532 +5783988503915469102 +1068175371656917352 +219257179654 +15291089435152176564 +6364338509154097917 +9870725369066967 +14551451011484379239 +9391897638007149192 +12454107980943747877 +846704164710597050 +16427890617465716818 +13819018690369428 +9870725376800255 +7351759252537738122 +2128531814030721909 +10906583475570215437 +9870725880706629 +15287705212525028759 +8801992546205715364 +32432385013604422 +1839045967525799660 +1519546481944121311 +399564657253439087 +15479855057770196587 +12219562580088407363 +1251040676225705700 +11079423192795528959 +1498787815145951310 +989585332163798127 +1686164359680897799 +878291220490637011 +7239069828821630035 +16858178479776550266 +9096726350102080095 +2739136145374730310 +3597395118854314253 +6462654085110779139 +3614550526140115780 +14463310864315784169 +15287987228927271967 +5569296722648898807 +5779476262967715614 +13493869764049450368 +5090381719048381697 +4278781892 +828707437780169592 +282330530 +27638084671788545 +30740213511576704 +286197178 +9234597529149246703 +6877309693744988702 +111866465377720776 +13508534253930421235 +10370417990725209150 +9523554804725604864 +32714336930053820 +12537580816827032229 +9939529044407966192 +16005333651879910401 +1873618536328672612 +6763975681878401936 +4396907804627188337 +17083975299020625786 +8298103733356619439 +16261820492260846197 +16875205771930714017 +7635945675238502184 +1309476560 +3454588646300200304 +13209471093094952750 +18362783210550618509 +7245259419711242951 +5301072911838752314 +817170089 +6576414755309902918 +4049902545170866877 +17949762000884214511 +8531061018971039712 +9060579322535241869 +1838764002712710340 +6155045947215264176 +9010588495091150890 +10029800025394597672 +1359514598076212994 +15290525376551718365 +7465013733178291626 +18374729960680742609 +9467310877347155402 +7881735167988625398 +427623910551416700 +17087923524359767939 +13485237160559132174 +2625321597996895865 +30176189304422151 +14424532941397242841 +5672976430141222869 +5992475915722887744 +10835901056727990255 +6980419861620719876 +18413109980183855179 +3383022898894689634 +15292781537866425435 +17265262617058283600 +5780604289885677156 +16658392413560126531 +12922981181029969820 +16988750789099343124 +9894523072925812384 +15355830791983798799 +9335705058280675920 +1256117001567099843 +149879155364532169 +7419071508546416013 +13223018370102859342 +7196359620808367870 +34124487727868443 +10864261424787891436 +9868375279139438357 +10756726327912239150 +494402748452 +9504974943638475126 +9184831344526387297 +3048076198437077817 +12509175466786556638 +5991347897402266844 +1822200532863361159 +16878882991385560432 +9908927092227586811 +5888796238325754848 +17048302877138692718 +9325704466455472480 +11451760621033051224 +1873618256883836491 +29048106498005426 +5138070738186951940 +12251367169731089864 +10472837179882544338 +7881616348704102681 +15293345540578430341 +15289961360943111231 +6321206112271214839 +1841584166739392063 +1179692887208769939 +11785584453090308731 +5779476207079271839 +9870726019905139 +7344268883698389597 +12772641161582546703 +5782830536849757553 +1398408954 +283230362756538975 +3431353251379022708 +2574671757413524005 +2150364417047336423 +16854527014566439523 +1873618523432035301 +6181633645920130492 +29330122900257462 +1906709111338857268 +17954672406051493335 +9386257314251803695 +12013377154952481086 +2209547716381134753 +6520986101609794484 +15290807435944616443 +102051229365592950 +11464140787501065027 +1369593346723309614 +1873618480440217982 +5551497810020143951 +16844022412820812661 +7086073671033684399 +27920045185580524 +415138750883257210 +5730738615446414799 +11946060786733501328 +9870726550877929 +31586254122462912 +3872125181825392417 +15292499508567568780 +2429421478 +2359415887455217007 +18115014878068415995 +11599119229828345511 +1153566903691791228 +7238352472149210806 +12105446909435186853 +6155045891326827739 +9870724566157751 +11292010839550993303 +12783702187540489156 +6208295891572697747 +9870724570024028 +8197562950321118411 +5199085337155881114 +11921886842851633314 +1999641806814605005 +7247233517333775113 +9870724573918162 +2206152513327337745 +2962388616195618075 +6829351451017032328 +2880129344002472220 +32432380714308000 +15312344744002609064 +14311414740764356734 +8907187969453991467 +9844013846035459828 +7402091510284376815 +527486661139370293 +5461104748415560904 +5458243698210141082 +10159392371105598967 +481506104103 +130269948802315449 +10778338484471618511 +4445544331933523545 +5835546298267558578 +17437776287605078618 +1411918531916737746 +9870726101104270 +9870725101024610 +17621561872099776610 +7800754624757263827 +18174992035861848304 +438514291021 +14474948657118474536 +11018612558211800965 +10767604258422074586 +9870725108757892 +5386207979077524367 +11288528377159107134 +12899995919504202528 +12593167790876535516 +7093139039356461964 +2558368823777385816 +7034233800091631991 +417020330807 +8421459022910283426 +15197950057643922361 +15291935514452899847 +11608113562049068305 +14835085571082163222 +14425661019904366104 +7482850383114806601 +5106039013834643289 +1944417820723015951 +1410790483503640125 +2146416135819777720 +8655243770018219549 +13895981972509890161 +1873618532029372009 +8621549700391517167 +2687983 +4854434259307999365 +16462507637094825291 +15291935449967129470 +6554640 +1839892025332556291 +10162787574158200566 +802771828051758542 +11160816130067747383 +7140733684507279942 +15288833278135507714 +17238671471831225291 +2206716481646042395 +14665579471014679438 +16558373245361410135 +6204347601746593946 +7811296705109577759 +10908568596608862119 +17660158135199625345 +6675006381259907404 +12449072701226769464 +5193445004803188405 +16594185035380058516 +5778348197355983396 +17144416678735650400 +1873618467543586292 +1788898229393168478 +6155045942915979504 +1895116097406593591 +14947092899385127 +9308649427281187893 +17472419243001137405 +7530320043355358274 +17554608171616119714 +7352887326746739636 +5831598124517567080 +15289115337529569318 +9084437390665530220 +9870724655117398 +12772870734931498896 +7871853531784694811 +1488104377960382877 +13940865408857351774 +6916677212255566925 +18411417881767641103 +1252168750434705668 +15291089439450212002 +9870724666702882 +3146582804613390080 +1746181345776705406 +6364097413323828542 +45220981 +545261067 +3387142644522437849 +6927733967265136820 +15289397353931819570 +16426949196226775996 +9097135786792263694 +32432389311637054 +17088205536462706549 +5565348480113849116 +13465349807040900789 +7139887609504596514 +490103461470 +8666576866089117618 +2564753338 +647654602099665736 +3824643613810039189 +14580442426343232970 +72287418 +27356081166105985 +5255025876700255417 +14322424949763220922 +8688386475638075698 +17625228089634003581 +2718602158699600018 +12157859360936186867 +9714916620294556735 +425613816384 +7437134223972313310 +1873618252584543378 +5671848364529502402 +13112562473004646417 +15288269262526893775 +1627738434682252397 +10862662076345029475 +15287987211731346099 +11655556783171071186 +15610213152337834349 +425617658402 +7246387493920244465 +10466882940337865109 +91620559 +9870724716983467 +14263025731314799938 +15455291255839460925 +5029376191682076468 +2624757578088985685 +11954894262809542931 +7789666919926996424 +9870724724716746 +27638024484050206 +3305731410092126166 +1586523726108044912 +9034197851562591362 +103220470 +2531021385567767327 +18443164073222090007 +1873618519132738197 +16843021112131866639 +9870725232489931 +14371231213321064978 +6474545480086800951 +14786763921462404043 +15724358199937030788 +31586314308962794 +1732546181989157206 +17264773165563802417 +5304739198157995038 +15288833286732863993 +8970693070809082595 +5513358431825442404 +2184750331783308132 +9776875163555676172 +5993603989931888604 +11573994809263544336 +1873618476140930960 +9608971531469725859 +6949109709029318295 +14653781788333464925 +6206321733762436078 +27920040886281298 +9870726751942401 +7033387776678101343 +10215575640360054823 +7012403764072568933 +11021485107472774761 +8231778572020496930 +17307420547699842623 +15292499504268273870 +2625321580800971268 +17825639178001196640 +791272390552856961 +1838763942524968474 +7245541418917561037 +1731136039788693318 +7352251894438851326 +15292781563662316330 +8976281967684566418 +17577217573157431458 +8692390532950209792 +6156737981144454485 +18156237098482275869 +14318336791420408010 +14735929132254117538 +28484086590090961 +7194547622978192057 +7604559457759139911 +14610564085569110092 +153486637 +15267568147865284682 +11742834345080917347 +16382818492672128593 +9144793589536079878 +14545433112514473364 +15360120856645158659 +3895628550832211356 +12622921449567620730 +161219918 +2789363542978136784 +1519546473345543633 +2416262088310673871 +4013043832091580639 +3764779269698113775 +30458188510738900 +7352041303333208988 +8962588316709437565 +11129193715655864377 +11997174045329340543 +477206824696 +8389639136437693330 +27638119065017652 +7301047507393840008 +9870724802049287 +1730290029271790313 +11688760044611710888 +13534751532628931308 +16248578151872226541 +7242735986168111681 +11232176273866644162 +7902856098401037691 +16779181842987444475 +1860330011865272964 +3983621612890889534 +8267988241087938518 +13119788014580281308 +12477949191893682816 +18288107228592430898 +15291935488659641034 +10587647984101975031 +10750585189167876693 +16797867153523560979 +196019566 +14101293042240856 +15290243351550908387 +13711674224866899809 +15287141252803611083 +3000062970512096167 +15131353459163881415 +5830663914644775903 +15092168141359043711 +7139041586091065866 +28202143270987515 +1873618527730089693 +17362817255538903475 +2205024383229849531 +12987787523269739111 +4667874322192558501 +11344167577809275627 +1893141969688809914 +109958699161821820 +15817318383155881381 +1787206130976968703 +6817582656779008682 +2219378583 +13862523646724480574 +5778348193056698639 +15287423239113361360 +5092441468690770255 +1157279319656121687 +2625039581594590622 +9955462504235354518 +5093002727150217471 +10689682775194037146 +1873618463244310540 +15722382516522334184 +15287141188317833046 +10810137742748053740 +1361488734390085134 +16775357814077212138 +9941287861162483614 +5677488628097102118 +1467424551607955817 +1730938708 +7300201432391156580 +28484138179252127 +16644853988270020193 +5540680986800165126 +15294191606982536130 +16848105630658202350 +11268149246643615326 +5996142189145510285 +10256871348501033257 +15287705255515595566 +1466296524688810708 +7398759407563780062 +3098413000628184381 +11411077441895556827 +7874246159031684239 +962239532943807388 +1839046010516348028 +17204989276292524258 +1049541662233617411 +746325599 +16025494029661729166 +16579843686302695034 +2390185312237133354 +7401639787228444060 +9870725375555062 +6015751889870661976 +5197393255935525991 +17786951955841951895 +9870725379421713 +18111648128641031438 +1053524127770502983 +17422586627343735091 +6863396644812182592 +9870725383288367 +10753025826577715928 +32432363518386776 +9870725887194703 +8278511008446374635 +10369571915722470439 +3018298471404432525 +103179325071235256 +1945545894932013697 +134793217465407738 +2153908494234559731 +16204632762007442100 +2624475557387458717 +1240063138945768463 +16737240503404360339 +10477334394070901121 +1254988944555382953 +12817747362951356325 +3075656758671584779 +18381053812134272252 +4076954702532669545 +13760709923767801882 +32714379920622337 +11973532095252092085 +11129475740655424390 +8577538860526360217 +8713716078300710696 +1200046888883599038 +12903498736355393046 +3361815645018734692 +292685256 +8181328739401289461 +15522713715103584581 +32714336928809746 +2624757573789696506 +16310614754326436311 +29330157293474795 +9870726922073870 +7086038682136097388 +973176372562562859 +3955495966009932010 +4222704740394226811 +5357143003026952105 +5513393171775506464 +15287141239906971414 +1873618514833455304 +8698802600192534472 +13327266346497556474 +5885825832465678560 +7531690769748938682 +5944020267407909914 +9373626553925268188 +815924893 +1873618471841644417 +15525311699043174613 +14594554080759134411 +15288833260939595716 +12348750122672858841 +12060104460667198064 +1255552977359871221 +6156455960442904256 +1628020382299408572 +12591654146264356098 +6187441192029017939 +7511405001902418874 +1873618450347683134 +6752362138726908827 +3069079458030052630 +1256962990588780621 +33560463520640436 +6248129653559728815 +5304739129372913845 +2625321576501678931 +15291089465246099469 +6269101774807914038 +13819048784317939 +16741752804539788436 +17224768886585707013 +4347925833116092686 +15289115277341823699 +7541956522169741986 +33560399034845176 +2529531367741543817 +14137369733883185362 +4560302222027482231 +846986181114276167 +8804410014392922590 +16737001338585431446 +6518315999997603987 +12269921124803748502 +17094376519213262057 +17939033630403662889 +32432372115731056 +1551462646837743552 +8801992533307832282 +3927011739620222942 +5732303977939737484 +1808894516123994686 +7301671987551880499 +10248216095869245231 +109033155035885540 +6979009762410823886 +18411699880973959189 +1138122942483870602 +14471678324407809649 +16874641756320830376 +472907533049 +10114786509225489291 +8058131735588728795 +1201739004497194130 +3611513330056130345 +16483215864269335583 +12424417179544784828 +2021332458341355099 +1730290024972499280 +6928015966471454906 +17782439693399044703 +2201358182892981698 +1873618235388608275 +15289961360941863560 +7664780934043341248 +17814975840899059681 +5471876946336703378 +15290243390243415039 +15235824385987594203 +8321191778847888107 +14510953358855203782 +1200046875986974396 +7034515850887102857 +15501077368423543154 +14665067898565339 +5249797159683564125 +14017573175544265359 +3271455447591630020 +5541264770713325695 +10661759817962975958 +961759945131511638 +1873618523430794463 +1408763647 +15290807457441193458 +15291935441368529555 +7239633818635733898 +16484583022124546860 +1873618501936826089 +28202117477718756 +138984330194536520 +9266962182080650538 +2902127743481093400 +5683634553747164818 +17662977685017806465 +2285680568671889696 +4983149958303002549 +31868356507097743 +2625039577295298860 +1873618458945001961 +15290525363653855352 +7386379944371963929 +5672935479475450559 +15509536076691958068 +4675908641477452458 +13074753287084194536 +10802018431140108628 +8697392509581210969 +15292499508566299116 +1007582076291529421 +14429418949638901670 +9413007478785855513 +14092212362992498291 +8824504992692395590 +14428481261316087118 +5623392699018645115 +6300002854820656656 +10342451712020405562 +18178176032572000245 +2785415300443105385 +8854886116851920541 +2442023618814088483 +5871164884426435608 +13960824438201265668 +12068249601228026317 +13307798931131676082 +12681041688412119100 +4156318401029423173 +13307516880336134566 +7033669775884419429 +7982583793721956040 +11033414263523796143 +6268252942656032040 +881393336435241826 +1730290076561666915 +7028608203314241982 +5141454990908002495 +1746736033136122425 +1735084269425872945 +505677876670131335 +2341393856519411754 +14101052289934227 +5991347884504387313 +1038887016790255199 +3188833189742343006 +10157468106661718666 +2332012875764801595 +27356072567528853 +5833854212747908857 +6152225714402236420 +11441894924405970147 +10585391784093501583 +13836178783633613047 +7140169660300067380 +9870725103646068 +31022281504395664 +16077787910842630918 +9870724603606007 +931541121857707259 +12180761913526199675 +2146416178810332411 +17987656836110361902 +9870725107512698 +8910110154532664270 +16392223356658340845 +9870724611339285 +5516046748198836012 +417019081359 +17599712193397024755 +31022238512586223 +5302200977449162946 +14268167369644454391 +4094033179501014844 +9127491855471229083 +8070152345684287337 +14383068692161795 +830681556898108038 +4970103817181947028 +3641272205610928783 +2332012811279024420 +15291935492957695878 +880547325918336387 +10374285323404205033 +13195084493883073135 +13294615563597990173 +9870726623098617 +4561910316531657792 +16340493341965880832 +13193327024172329555 +8049634251984235888 +1043117249933101633 +18250406715760799680 +9870725134571535 +3248038558279805559 +10869860987124465804 +9338798349572580739 +1575334552429621186 +9870724634539061 +11847668763332906065 +6534429686359853789 +3761956926416053524 +1732546151896591368 +17393050773869308001 +3878613910076338047 +6927169943057924258 +10844617942550920444 +8048793475359466380 +2328473418854061618 +1255270892172570060 +9697337405408964560 +16173464470146146498 +5675796516784258992 +7341897126954293192 +7058279794388587004 +9870724653872204 +15294191632778418318 +17422075041604385459 +5782296465685690118 +4594049832084523564 +1575616568831864856 +14266293381143796009 +7688360202405638152 +245051824093 +7139323585297383952 +9066413016012829626 +11254960631523331198 +9870724661605484 +2625321572202387090 +9768109707480416523 +8106071886713535605 +8482084103035110644 +15287423178925613057 +540149243 +13819044485023908 +7191787919201623861 +16409823229268203788 +14757797057313387059 +4978143301206563402 +15292781555063740152 +13536993689471127 +16165083394670796418 +8555000716518495752 +1996539665076928728 +1414738674448231486 +17516205877386679445 +4831503757951251449 +9435617338945912212 +691676978149666567 +724667011080920431 +3642118224725158500 +153456695047385442 +6047549741664253203 +13647762154727690899 +6098975817335843736 +63308952 +16758377811460582981 +7404505671630666202 +563349043 +6024120029234355271 +14426056237756190379 +13160497683558315389 +3755115258874519557 +8600430310025343760 +5250643165901186074 +6337342946992343907 +14465977220360254785 +17245096198968656436 +15594797272826211018 +12398037902653464815 +3061427692979963796 +2530457361360558120 +18043401381563221801 +71042215 +2927894592700494577 +468608232644 +1575898520748321572 +32432303330645359 +15288269262525656374 +30740239306197998 +8318427307995835530 +3848633150599819956 +12594577834199372952 +5141737015907596494 +2725200978109358030 +90375365 +29612212387064777 +6815326486865722615 +7032823752470888781 +16645761359050460924 +8152953255884309641 +17154008149781143872 +98108642 +2624757556593778816 +32714319732888440 +10198717281121678755 +5995296096946885314 +15290243342952320315 +15657440989375970927 +14910807821973066357 +11078361523465623243 +13991391243742233579 +13035898745205496714 +746149276692602453 +2936726836535696012 +5725098227204056623 +1492645904842971431 +1880166564501796049 +880547270029890158 +6185740956063705059 +5408982899763718000 +1838764028507344293 +2265433577080238987 +6400397909609112729 +13940115397007321779 +5412085028603505760 +12494522522501060914 +2129219401877045033 +6151742330269346998 +15290807410150089225 +7193983598770979495 +7515448154541134751 +11718910014443698507 +10782370605598394762 +12915164710029630774 +2625039572996007704 +12749251359125023229 +13513632858282074175 +5728764444739438898 +1039884988972941814 +15018372275201457114 +15564529833679081226 +1251886678142774517 +3449824019105670946 +6156455943246998973 +12826857471070790317 +5250413499738166489 +5831598111619680399 +12799111975240233116 +1629161277 +963414975523794795 +11057894865362623296 +9870724758271201 +13237708531286474754 +15291089469544156753 +5516892818902227018 +12545157347485707029 +16825330213464927545 +15798241638577277370 +5780604315680311314 +10363686875760645148 +14665622013520787509 +17304285656786099190 +5198803303557630089 +1095239124379576451 +18306023692144687110 +5432665589306956209 +10934615007495788420 +2950001802434732086 +14612094343334731055 +14462895139282630747 +15291089405058371724 +7106576757289082593 +2807316373451052516 +9135138120990860153 +8214174268225170565 +2635993685958410253 +17178370643127776933 +159974726 +336639206865059070 +15741861301866531558 +17173040774849712402 +30740290895356206 +14605947718330244975 +7999174347475655972 +32432354919798690 +14101047990638298 +2522831933761285398 +1411918549114040942 +2837757540382961615 +9870724800804101 +12482881246181026547 +9870726300923591 +2624475548788879704 +10163902770239660648 +15289961386737754397 +3810030574638219693 +11701191021079496879 +5887104135610190724 +1016053527303116481 +9195158069578185018 +5245848874156701568 +14537520180616050140 +782242303113437069 +7837359108808134215 +15838615109059690819 +9870724820137230 +2355338628669389503 +17680425426275872978 +2527073082844985859 +17796820708673071332 +7299637408183944018 +8380327196105135220 +12484612888873211468 +6783807687633541097 +15288833316826785729 +17018729383741909454 +11324997467887514509 +933515197985083230 +3883415041176704561 +2704423169904371745 +15299577268671306952 +5778348214553296869 +9185852015288598982 +1714227020 +12557640597676307627 +565586061691335885 +11347244940186371685 +15292499534362200422 +5303047099741708609 +870346606921064665 +12249607926636237584 +11626061263276162099 +734843566066641001 +11509066634408715904 +7241607903360452905 +6562660560423493107 +9516933842087075822 +1464040371971387198 +9870724854936890 +1873618441749073841 +16363166289661945614 +4956670950121363636 +5195701204809178207 +240752529082 +15291089456647515795 +13436093398659053078 +237307274 +12576044618902696660 +17336839796298881023 +10473820069154400015 +9870726870562570 +15291089413655698509 +6189377403852769618 +16206725293285981435 +12754891657085916890 +12485176921677700772 +5636167896104458145 +9870726878295819 +268490856288772864 +15974084862334490481 +9625506809262379100 +507296899771 +4089771542585347452 +9870725382043173 +4065061556721888626 +13038602074545986424 +17050134424117007208 +15932398067869297426 +1574206422332097927 +8829045524260142358 +3895628516440362909 +4391823033678838887 +1384352022003475638 +464308954022 +6818388851727943820 +9132390765923558628 +17945008138675382908 +5671848381726801649 +5461104709724424310 +5839236516000051133 +9175023023351675268 +5141454930720265425 +27356055371581427 +6996567784476918517 +2678571791705391038 +17194372438658673851 +3069305016885189748 +1519546395961863052 +6244455129419229433 +6928298017266925772 +11016920455496226117 +2119841800478333555 +5140044853005594417 +14383051496255285 +1694703987789597736 +10445465599053614589 +9080559974659465012 +16593903001780637096 +6439646011077775230 +13497614351222793680 +15291935475761771267 +10936791446025558964 +8599885612119771517 +2624757552294489632 +2299993216590295067 +4148387548948753060 +6151097678885688674 +1876289221937094026 +7963688554976907716 +1043399313625204623 +1873618493338243084 +9480521397579444127 +912038644489067141 +8831873412884345133 +16396392956869830857 +1784130019891160050 +16855640362244781463 +818546355 +230324560330435010 +17192721361846888983 +1094393045078797995 +5619565529195548967 +8650474279445474895 +16219743446836928732 +4315194148672924041 +6206321707967910649 +17536100556496588088 +15291089465244860379 +591836081131054080 +1466296554782747759 +12918763854349627763 +14798960469630203724 +6101795934071425322 +7294584453511452904 +30176189305785417 +11270550134515122412 +15041760489058683632 +16683019382329520255 +6927451942264242344 +13819027289096267 +14906859635325296545 +18232229389308402604 +17168369927962890772 +2325192589248583698 +12549622261011521696 +4728860507982872879 +15009813827273518930 +15289397336734637444 +15369906677232836491 +1839045976124497096 +12416013361138578652 +903133952482171115 +10161366550410041149 +6965360967470770627 +13543116117081679420 +5885261859847619020 +14101043691345735 +7361211863105428443 +1201739004495938129 +14775421719582555180 +17388608885738977203 +11074815735780632177 +451412297679 +14653054815481762055 +2624475544489579891 +15285545851043926672 +6340598769837609501 +3875602719820160386 +10550587301332015037 +1519546404559204846 +9013091190501542432 +14378284476977077674 +10377761406219005461 +15291935527350916123 +2345607496310660571 +13044507792076653098 +11739040462247254363 +8424561164648083512 +2337133545867524348 +409156595892770120 +10231989982691347967 +15293909629271559275 +18198700987292071934 +1873618544927397483 +6151097687483029729 +13556780324782233954 +9870726529054437 +5352348797264857641 +17923164431567576805 +6130765796047197332 +7221703076405404509 +3794911060389076727 +10433991425051732875 +1873618501935571401 +5348239349666947993 +28202117476476793 +4581098893827451995 +15290807435945987395 +17460930595627875429 +16221687404438952837 +6100103891543658014 +15802209657742306409 +15293909564785782489 +9413007521776417937 +6020728396863317117 +10757572347027852715 +7033105751677206867 +13958007565980950703 +5354604928487070452 +3857974274121937980 +14161425375476598242 +5730047846718980454 +16421351689580520761 +4145558130873280032 +988739295852309832 +11473766593121770555 +2625039555800085053 +9870725056001371 +15059564958356491391 +10861816027137001136 +15050292378613783964 +6934696917358829147 +5248721418517823262 +1771364300565138242 +11897516709942661608 +12167502394355563987 +1938491253 +513754474061261890 +2523959977877778045 +15291089452348229789 +5516892801706298769 +8070402889435849088 +4026170138928566451 +5783988478119722228 +9797418163082707705 +14448182458800611332 +16431008191725837382 +1568829035453363079 +10635921794709209422 +7194265597977297581 +1996539656478350661 +16156684754098129627 +9388513432576090891 +5837238478365609605 +9870724575294432 +1999641806815973505 +15287705229721091171 +9870724579161061 +1358668596158023938 +362398141595602041 +15197386033435462308 +16688455542662113767 +12490303189019680314 +503001453343 +1461651209 +9616471334043587942 +1416712789268131698 +9870727087093538 +5462796864027833577 +1100680858359392856 +13393719741987688998 +1574206418032816523 +1730290055066430857 +5194291058309403321 +13464322011058685617 +7239351853821398531 +9375259065463616089 +18052542663206660228 +7300765482392945532 +15600453352904087295 +460009646396 +32150286928318465 +9870724602360817 +8537320823041957484 +825323275340881959 +18092303384593380416 +17998422711599395290 +438515686140 +5942328254974083583 +4899574120860903295 +17626638094263084368 +9870724606227465 +8484392800936339141 +6926605918850711696 +12478172948446058415 +6095117356076044645 +1254706867965338021 +1041143148011207670 +12689652909718711032 +15290243377345542808 +10002765370978679306 +9870725117867417 +4333790767825710465 +1571104254799731715 +9849384022552156887 +12315494108807773679 +32714354126116656 +14665097992499830 +10868020370799030824 +14383047196960401 +10229516639352395865 +2150364447140034962 +9870724625560607 +6934128324390829241 +14151987057237757276 +13714844348898824305 +8095744092864395281 +7138759561090171390 +15745101183391519293 +16857332486455698571 +1359514658264081303 +9870725129467301 +4064260 +2624757547995195389 +5249797146785685094 +1306546738906221529 +9870724633293868 +935489347195586402 +5412085062996727828 +7930917 +1734238289004090971 +5511666307614710645 +3526509882569922795 +11797564 +7087765765150802410 +1464040419261239838 +10592171188278009396 +2794943081434534665 +18370837089873586117 +9799345802374370952 +666254901333219932 +10109611948417312448 +100641160249623175 +17504806456180155379 +3789266998286825834 +7299919407390262104 +1041707150723215241 +1413046623321877462 +17847527399173661290 +5944302301007470397 +14607385723143808285 +1535117082 +12108411733473503058 +6817864677481911860 +16285378285009240167 +38863958 +7582605490651874807 +5782296444190476525 +6925759843848028268 +11559488140755693742 +5303047039553965626 +223556604508 +9870726164346531 +4530582984922302788 +9870724668087417 +7029736260327328305 +42730606 +161798583001902112 +6156737994042446576 +6013889958159211945 +13819022989798638 +14322142954856336167 +546637340 +45398647160771310 +1992881725716501025 +9870724675826835 +11310405428615328572 +15751385425378301854 +13003645470104820283 +11257586035547447832 +13000153596431314724 +7095406224089833202 +15293063541372236797 +14165591608719859051 +18276632678810792666 +511598799941 +15043322351971538196 +62063749 +5303893136053316809 +15289397310941381525 +6876602157457619372 +14367472968051224441 +14107289518250218088 +17300923237302811455 +11383867318797674948 +3431937098798619957 +13255834995987660016 +5895503452529110351 +105153452786529438 +5796863017406975446 +9587648737439469536 +447113025571 +1357540586434744558 +15787129165023949593 +9870725206799814 +1585383218 +880547356012266116 +15288269241030424968 +13301154954869226346 +177074650366222860 +10381427610856603193 +5342525537091611841 +9508117465405351959 +7193419574563766933 +12535711295515926539 +8734462910471683283 +12406108725640500888 +18120304561411535000 +17335214655854558215 +5540271068216192655 +10532987940533373758 +13856376426038759191 +5996988234054376476 +2059964907575519910 +5832726151436897321 +17733865212901744637 +9870724726093017 +7162632211190858297 +15471013794591809875 +10670653605843061857 +15291935458565831923 +8737266831655316934 +5885825858260312902 +9071506008073853184 +16307934016737519668 +10636325330389783644 +14781285735908463042 +10541654266261565931 +5766981569280224071 +9752004170917099767 +7967014305277239066 +10288044522788637201 +1873618497636274939 +2576363847232524560 +8365026283725482522 +28202113177163696 +5548539146849690566 +5303047091143126749 +8603359422188510298 +17082847233409116392 +13016990407504892395 +5566476507033191768 +12748270311860295289 +2625321602296319259 +2500126427173621534 +5793518604902938186 +12939318870796673631 +9298565156323660190 +2053509812619855042 +5674104418367992350 +8308324011471816715 +1790709167968112308 +7880043043777810265 +6589811821595414479 +15521585615099990579 +7192573499561083505 +1202584997816911315 +7024942054566471509 +1254424911749607343 +2785415274648570903 +1207319175418679449 +13001682102565735156 +3090551779704378056 +8276788249793081603 +12540081039338920374 +6374771627236275765 +5516832380128143086 +15289397319538722761 +5559264896202193030 +5461104765611608440 +2063569050645254085 +2293953824856884847 +13374898155346339783 +11638293600493984254 +12274796319317563778 +5894020517106380199 +6314795720100110638 +17092728766434661036 +7299073383976731456 +14234508205378001122 +30458188512104265 +1477329488301416292 +5195419281952937959 +30740269400135137 +1954877918210256078 +6243932746435207221 +12060668497772358456 +1359483596465455706 +14814059355306855896 +5724666020557560769 +2572415600398252494 +14101026495416400 +7437127181007605230 +14101026499291586 +5991347858709879033 +434216377503 +4867413200845347196 +1256398949184458461 +4314819272363162324 +7833561147914993351 +30740204914353324 +2621625390044293485 +7150065641558660833 +3934896194202202266 +933515240975654897 +6196736653374986568 +3831297342191782928 +1746572884498918730 +6231190056761504640 +14383042897660595 +1873618549225449342 +2169005683868175785 +7245446739463786361 +18063175032920946030 +3493670867319668584 +17736056655158074503 +2624757543695899937 +16863746392386442734 +4008957537367105584 +31304272112127418 +16996745852409680714 +7786083262071970747 +11008724123489082267 +5785116595320530945 +212862329 +6929959708802616010 +10592171183978717499 +17788534566143544239 +11127785638639975627 +8383464655762757876 +15397349661003755877 +5831598141713629066 +985946599364831398 +5352348737077144575 +1179025838192226887 +3040117549151974119 +684134283687774634 +11265167757449175536 +1873618441747835697 +17892584866493509807 +5356297026902053392 +7718679577431849825 +5303047078246500529 +3703701212822509299 +6262673798362502334 +11743153391473274937 +3764334357959808362 +4374969106776731242 +5722409910832010335 +9201135878743278772 +3482225908551071984 +15348814740942045623 +5354604868299327574 +15274450213741556577 +219257311226 +8915989727614999717 +17958290734101236200 +15895720572215508846 +9870725369198041 +15289397371127861661 +9578899180366815457 +17359928778200925842 +18066747657552599544 +5888796315708299966 +5356296962416255730 +5572116878078392809 +16253194079653685224 +13819018690507556 +17051161967565041261 +175322119705935608 +7032797667558243032 +82528786831666836 +9870725376931328 +10718984542888085082 +1197790749064242852 +16583739439456152329 +9870725380797979 +7353733397450326999 +15420834705366981996 +171387371971096917 +11848796923524306930 +16872667624306386042 +485805547153 +12484048873263346599 +1146796953124883791 +17841250302039962983 +29048162386602364 +5408471212899110877 +12004847539945354930 +32150291226378785 +14280399715628563897 +6946246893335954969 +7223059653757388594 +1360642680882744723 +10482669878882282320 +15291371408562736170 +5775490868206268501 +15287987228927397973 +2839229256111311653 +12746154417354124602 +12488239579328754616 +1747004031218561681 +9870725911770710 +6877309693745106682 +12909283101122309414 +29612229584383674 +286328252 +3357575107008078897 +6097847794714696441 +5299098831412210981 +8477529075407349772 +9660733658897402568 +18116016210310285625 +27638041680087785 +15288833346920735842 +6919877745582160494 +12987671390144443212 +6993058173406238153 +5511701056162108767 +17593400006054857317 +17202451137266803853 +13464164481390611703 +1873618536328797978 +5412367118090332511 +12162857194685681771 +11020586642937885164 +13560019180287638445 +13071641208840273115 +7342514858172173761 +8552934505565808786 +14851938267165104578 +4131756885809841053 +15294191680067031275 +15287141218410501685 +6926887918057029782 +1873618493336980271 +3051358568939477475 +817301162 +14947097198818149 +13712725028290898109 +5884848077472538685 +1251886695340067072 +285938480839136274 +2625321597997026778 +8238517427652352389 +13877305484601734369 +15679245927777250199 +434250991118938578 +1200892899400693044 +15991329612793777436 +829835507690063373 +6153353818705185768 +9870725965903465 +17392852282941837606 +335132329133939582 +8879858573940433955 +7088047764357120496 +16872758265580306083 +7028326229902518541 +17935149165637144776 +11136049654559361867 +13122856944941681759 +16204741244690780570 +2147544210028974282 +2773898507855730948 +9026822436951053759 +938577221244432679 +14243906649715582873 +15289397315239441035 +12186364192724099046 +6045587551004596683 +6044795377725105206 +3608753331855454593 +494402877125 +468807076180682814 +5516046825582647178 +14925404126193348279 +15293063524176304283 +1363740394 +9241910669145360017 +5196265237615086944 +5991347897402416902 +12301425206993168667 +7991526094668244792 +6050251095005225915 +10758418422029299999 +32432329125282409 +10759828435258191061 +11303992210264965508 +30740265100858942 +9695569776152489513 +8461230827060607186 +3411997969245233461 +830399583486354060 +8722866468433649219 +15544667035127461041 +6154199872212707541 +1375340270 +5416903162625348246 +15199360105263538318 +11037180349310330140 +429917080356 +2624475522994368594 +9350687017873532647 +3429943004616282517 +6829027748760607444 +11878042084817848361 +1897117983381337464 +2522831886472787216 +796287374104080319 +13165236096819726934 +7032541727469994305 +5779476207079417743 +4613997209956193842 +1413892625240186001 +18061482934504738736 +7276444590248450968 +1873618544926133324 +12306875953402038053 +8054291783896998718 +6981547931530625325 +6827279971330580815 +5251489275295831667 +12909565147619732284 +8807982124992894573 +11068307376171609765 +15293909607776346755 +1410139907 +7880488278793281516 +14152551158828775019 +4590243795937215174 +7193701573770085019 +1873618480440360568 +10675690836223986910 +1251886703937402167 +5455705550585811293 +18355154975736420224 +17828235624496847539 +16146067599794911445 +15287423213317615009 +9347818859728933969 +31586254122589002 +1517290337824227508 +2849674907923788891 +17364509302366084069 +1895116067311531597 +14427726834025504707 +9870725054756182 +9870726058702464 +11918547770780427781 +9944154806538146243 +9436391241578605688 +10914208898869168976 +5458848587100981955 +5265910562483346718 +7719447247479583312 +214958017002 +15513853507232414339 +8857962551646450599 +5354604864000038748 +5340613827489314448 +9870724566288845 +6621247738664277457 +9870724570155038 +5312941456382980397 +17557843670454376360 +15897859265386516004 +15289397366828571922 +9363795546084422570 +1413046550237492143 +9870724574049236 +15327223662880124908 +7562235583526800908 +8339857016756586297 +1786086408024777010 +1254142843758141275 +6980701856527941897 +7525188923689153065 +5833854277235059542 +6011408714502655597 +17939922315943701932 +9069694239906153589 +16826462082941729705 +16534209617217086591 +5425080494119590369 +15289397302342790141 +5345701159052127479 +5302201063430293708 +6549705653207180411 +481506241247 +5406613406419588513 +5195983173922933208 +2361706707035775428 +7590943417659436272 +15637388777417434675 +32150286927076332 +1575898533646332520 +8210619437363832977 +15288269275423642853 +9870725101155684 +14270655938778062328 +3556224020418733722 +438514428432 +7087201740943589848 +9870724604982270 +9870724608848912 +9870725108888966 +15289961369540582951 +10442852986254678155 +2577002748724404716 +4460967390017575468 +9572107682921271336 +8421459022910398271 +2129240136896229256 +16419095558359762419 +11422235346247430464 +9763801087524692048 +6606162839980298873 +6443061665402805733 +4123248415797549342 +2468384022945032276 +4736264104721392432 +491259354 +7852905038840995409 +7299355383183049542 +5301072972025382631 +8941625236594973244 +15406359677685625617 +9870726624474874 +15288551291825902119 +6204347644738557066 +5222364346185049327 +6733292533464905597 +2819057 +15040978729766689527 +8962179496692050922 +1361488803175287162 +6685714 +525102972357006924 +5847385801418298343 +9870724635915330 +14311172801615956401 +1380692883287576825 +9870725135955377 +10552363 +8263358504600101147 +6101796015754522547 +15287141214111211395 +7724696083912536120 +5568018385112679264 +14424533001583864197 +5778348197356121198 +2518484914 +7460011687021330568 +9870724643648581 +17404595615100137033 +8637278882685282695 +1873618467543723937 +9870726147634846 +13480098052608171968 +28484163972637825 +11841014716146342013 +13655523387674612891 +2625321593697734691 +5253100136504119108 +14815878731793589149 +9870724655248472 +5727354401416743196 +15882009611641320191 +7086355665940906420 +11994917969995701476 +6032008797801694041 +14045391212846459551 +8854886146944602339 +11132295891785694029 +15289115294537901492 +828143439366349649 +41485413 +9870724666835709 +6364097413323972168 +545392141 +1005889956380019828 +9984259169219980425 +5722409850644288705 +3068771142868231123 +6306953179140543151 +11490081257974860721 +5406162714240557916 +12796716796845106330 +7660382775691194415 +18416497682307633444 +2170133758076010775 +12759952334900916206 +7192855550356554371 +1575898585235479052 +2407143038142984678 +11187893676522954357 +399783013382497393 +1623790166351432884 +490103572560 +8623726694876598037 +5248951050287803728 +2000487911911397430 +828707485070159069 +6361518379520760575 +985919106031104374 +9941880145921710432 +17955731434090939245 +27356081166224161 +7874673760297302366 +3522810865597948146 +4178883490059604425 +5726358075983401983 +10429166001378111305 +34124418942912451 +6411545764377422401 +131249737499679948 +580191820 +16075162809290589 +1873618252584675713 +14106274658388552099 +1782984231895049873 +7940601578509916376 +7354015396656645085 +425617787354 +1972904779484305836 +3885957338469448473 +9870724717114541 +91751632 +9183139190223016950 +9292416580112839558 +10968759497312251387 +6053028402293443677 +2624757578089117472 +18412545951677546552 +10359607934526891751 +17535013868194108929 +6979855833114411249 +15287141265700368282 +7580267950467137981 +9870724724847820 +882239428633980183 +5352348814462180055 +103351544 +15291935458564576732 +1160107295621123492 +4151360929364450460 +9440210843932575052 +1086291850409955260 +6241248994235924215 +14259131864331852489 +17321972846729642330 +1873618519132870854 +8118963725238416203 +7192009475353870943 +4989419314252950077 +16484582996328791961 +13695397298624537118 +15290807431645439276 +28202091681942736 +9856766353087678622 +2625039594491353137 +1873618476141071094 +6011895748734496607 +27920040886431425 +16221687378644462139 +7141015679414501963 +6105193743073177821 +306220492118380964 +6513063683555473918 +1730854053479077129 +16693358301310306443 +1840738130429352854 +18214565923569693129 +1995983927642055823 +145335345147612458 +5780521020060296606 +11030839019091087501 +14424532945695412647 +7298509359769518894 +9870726759806723 +634324563 +15287705268412367212 +1838763942525097060 +30176172108639413 +2593041312621538078 +1980635170485125560 +846986206907691835 +12611016287737833688 +33560403334282846 +2522267888058836363 +7247515563830149914 +9388513449773392783 +4282424446553124418 +10159392431292230411 +153617711 +4119084579038312248 +6208295844281716949 +14572005040461463770 +5780604272689881126 +15289397341035305404 +10483207517846336301 +7294417450578829246 +15287705203926586272 +11406639409630570185 +2452976101834110031 +17205553356387079811 +6524975260417660501 +13689663543835251658 +1256116984371292849 +10040553306233531023 +12301343579813470324 +17891751271863968151 +6680725003041776988 +878291211892183269 +422847609951239688 +7085509642527375772 +9870724798313722 +8979734292754679137 +9870726298433221 +11631533298290659666 +13177769285178058370 +6509618409622343228 +15288269271124371408 +2384107316593708657 +11667482570719053789 +5197957314536093147 +13747186725612756554 +4886163694041110191 +8483392165818291015 +13829370923438598841 +6366353518750207652 +6206756537831610351 +17199514878479919124 +878291147406382923 +3546892421705320421 +5139762836602038217 +17064825168080026101 +797260235523440931 +15293345523382625092 +3682767152562455923 +15668850572958645074 +4801304812318048366 +5995296127039576456 +13497082958030246417 +4358433398544095660 +830399523298634919 +17519186700240950935 +16696975802530155937 +13516735030113869718 +7246669488827466486 +15290807483234599314 +5513226652957347896 +3640323153088757201 +5661738430124332592 +12271694091597462508 +5469094538686390745 +14437962511803362174 +1873618527730231897 +28202143271094573 +17367803244119077021 +11880016169542576993 +12710123380452834104 +15288551266032631753 +3909861025052307316 +5511666324812017148 +14734581879071319146 +17648172271756970505 +5459976661309983191 +6101796011455220787 +10992311089537504535 +6241809254224391791 +29894215894047145 +1782138208481522982 +11559421710747048429 +3261565713776263227 +5103405418406822036 +9870724848579883 +9073007892707822428 +1873618463244438771 +13671275472959648411 +1072037457616913054 +16609442224487362294 +316064311709227921 +8221844085436076839 +6699895458043813712 +8659619754002769371 +2286775792223981324 +13009654029345363488 +7359433925624936534 +15287423196121680645 +14732438437247721081 +5357989069431254731 +5356297005406822722 +15294191606982653888 +14581169549127126457 +9870724860179783 +16545031380502991069 +4579824205164463454 +3665614253022068131 +8773072981860493855 +2635993716051094203 +16085772215206423105 +923505340445301798 +5557910247962135717 +15220235379111454950 +1570629903415985169 +10367597559703289031 +3127312818991737582 +1905898423442087189 +9870725383419440 +3766801901047193389 +16337104745240476042 +2361672031574115353 +4523546378088228224 +17626345388899197724 +177903190204309705 +17641922897637616158 +1244961421058390476 +485804303931 +7872981661881076907 +7404505645834917908 +12796849896123538700 +1574206422333474175 +1286785605941468482 +6008809191785052585 +11787935005164846750 +32432320526692475 +5299098874402772204 +7352323298240431009 +5406444726343503117 +6926323893849817220 +1183077101237453235 +7515603406020824212 +421314655027 +1873618248285379664 +7751747450592908836 +13455211411485507658 +12966362425739923889 +8072726556923203646 +12290170445125525491 +1200046888883728149 +14383072991594098 +1783266235399495915 +8109847348651242239 +10184983752153569330 +292816330 +16757552583869927085 +2622783428877381667 +5249797172580327733 +296682958 +6311975551772864258 +2624757573789827184 +2221348088688431517 +15290243360148360829 +7787136313562313680 +9232147856523988439 +2163339848029127916 +15291935454265292103 +14342899211732653079 +7660072835933877879 +5436516692071888680 +9371707452376953993 +1575334556729036847 +1278354954965245399 +7087483740149907934 +1873618514833584011 +12966644442142175695 +6151097657389230718 +1944417760535408582 +13076193478088073006 +1880166538706053239 +13100244218720362053 +16158858703724157857 +1890039827952525120 +5785116582422664659 +4904404350412150361 +3654816544079167643 +816055967 +1873618471841764601 +819922620 +1628020382299550543 +9870725949191777 +14060082314617567643 +6431681680095532763 +1884114807036976424 +6262391777660907686 +1948083978070810838 +119263690596506279 +8335721576467227078 +1038322953890715789 +8115895767916891347 +2625321576501809327 +5542550368496067576 +15287423183225045834 +13819048784449091 +3205275677406341518 +13722190593283397286 +15056180748627358292 +65328991615068355 +10821914528495391294 +10906583505664283265 +3387142648820619516 +10173910595829715233 +7892956539650130985 +15057295986472462771 +28766163178971872 +15453689147130125383 +18097467579192383242 +2186325960811879188 +16222802787723523377 +6208295839982428104 +29048192480513076 +18010208493826022654 +13166364136636964501 +5565348462918065866 +32150321320307866 +2960898694535663909 +11739843167758346587 +15288269309816873222 +16174432731240476526 +9744694614536765993 +30740286597439988 +18413674025886548066 +2121831449192051875 +472907662881 +5153756500002945353 +7803671802807266333 +6980983907323412763 +12317069699553499094 +17302333254828494568 +128577803095143255 +16931611838274884871 +7352369464500556496 +1603375975111748248 +1038886986695199370 +3482789898365190082 +27356063970310213 +4129490617788556562 +15793417253295877 +13562557272023586889 +15289961360942002997 +5267721725907250848 +10161648566813666082 +12073088508578766797 +828707424882421041 +948019863933441041 +1322843273083500749 +16977612306074968228 +987893190755831371 +3391090882758263458 +5299098818514329076 +130525093392052958 +4224944260454245346 +176197993773081026 +16377260960560188717 +2115587861591050590 +936899394816453353 +933515215181143072 +2531021389865945200 +16780734179722999042 +9604786828674682064 +1873618523430914618 +18006978259953277164 +5193163009894979088 +15292217492164209588 +5164964879650076036 +15291935441368662187 +6856532310576475213 +16536747807833263492 +6100103913039007773 +4429089947638919438 +2195247887786980249 +4709271688407183818 +290284644730541598 +2947421221745990858 +7408735917671473536 +2387236853258008082 +7224394085122656588 +98949079030709061 +15501473033754249693 +15687084388461979027 +14028933987768280870 +9807927549284013164 +18412827950883864638 +28202074486017924 +6812506387326116514 +12229886213732643118 +1873618458945135180 +1732546121801543390 +6980137832320729335 +2625039577295429644 +15292499508566435115 +5354604906990627403 +11650514343538028283 +831245572506871087 +9145669343140272907 +11276479179859633975 +13501982462987226389 +2592168024777625815 +15148356472588744637 +2836911491174855554 +15256632220155390142 +13515333949333511654 +2560875148782685018 +5512098587345621692 +9813006656186420513 +6206321673574816873 +9870724568937410 +7874396428657308354 +15291089430851770758 +8087249190780558413 +7086637716736377286 +32150372909468595 +11294267013763900092 +7405633711446564457 +4352898200719795265 +30458235800727039 +14263644161166821395 +12986607308441393374 +15289397345333373909 +14320651656585758824 +3793440948435043824 +8270229298440050556 +14088243476560361305 +9950583114428780378 +1623790200744655581 +883085452046259252 +2543638519074807994 +5551357435004660222 +5991347927496330581 +13669152211453949580 +4528046089863841077 +17203579194278691129 +9292264724512182709 +4130498619197494571 +14101052290065525 +12947857451207430852 +6098975787240791177 +12887467213767254921 +492722805206298598 +2688678228647703169 +6152225714402365369 +17627886543243384787 +2275024116832819028 +460011036984 +7247797563036468000 +8139456321376432808 +5569296739846327901 +31022281504524265 +5299098870103476905 +4144790818200563273 +17142855811503907363 +8268575981438914234 +9870725107643772 +417019209420 +7354957325221915891 +9870724611470359 +5302200977449316298 +490014165 +15292217543753358506 +18224921198423071022 +5194855125508563456 +17790217346286906621 +8042494165704209243 +15060910181503410436 +6513444962178640971 +9744509175952983562 +2598586633860047466 +2624757569490538724 +15290243355849079598 +10913644883259311134 +7085791641733693858 +5792160745190266771 +5597087998421641871 +10377426660276899620 +1413892590848337112 +1788898272383867842 +2927048573586383866 +9870724634670135 +14882607364446952599 +7034797845794324878 +787888266804867732 +14016709054171524328 +1733111134147780784 +15293909573384493675 +9448371426434101969 +10757169849186201532 +1873618467542484819 +9870725146310077 +17416860949419749064 +672085941807878658 +263935036116185397 +15155437899791418214 +4917774994491315402 +5942135328794819490 +4692548874065224740 +15724358126852782695 +13907846462630617239 +15291089482440907711 +1873618446048497330 +245051954401 +1840738121830785629 +30176206501847782 +9870724661736558 +6349026413187508705 +2625321572202517881 +12120084196327706340 +6262673781165344867 +2928740603217526424 +13819044485155061 +15294191589786726750 +1144540847697310852 +1522366577184631890 +6881347154396136421 +13061371164344390102 +9870726169589415 +17372488073645144702 +15511138602086793 +11129193771543195892 +16320309976276422947 +6812788339241394089 +1996539665077072292 +7353451372449432523 +3229648972764834134 +30458222904100957 +816494382388946158 +7222331970380258941 +5152482613269515785 +10159392401199679258 +7929424722382385600 +2354096622141136799 +6979291808907198687 +1004761907965659899 +63440026 +5245848973037090413 +28766137385700753 +18411981927470333990 +13982868562968267156 +11130875047727013518 +6326017893707885992 +8690969664785376126 +1783065579255056149 +16881094854354025428 +11358358344107513206 +71173289 +468608355027 +4189674835569746602 +15838740426298123660 +17128487303121803 +1623790144856208776 +17385354358594481369 +7732551331406168758 +6482778696402483816 +13073654500703212426 +14690304989675342358 +5734824761360408358 +10159956468397445146 +7534510929476463438 +578946634 +9870726208255661 +11508394745027383333 +9870726212122289 +12974006819746363933 +6043037543708437386 +7140451655207289401 +1873618231093313375 +6649204666000755801 +90506439 +3405452480879357908 +566133513427696956 +1841584140945023301 +5725098270196000188 +13362760202069289972 +98239716 +9398797425561717791 +9870724723602624 +6097847756023542748 +847832260415146659 +7421688445623022923 +15290243342952455067 +14665063599393487 +29330140097680195 +13634697161079806235 +32714319733007236 +7352605297446749095 +1873618519131638350 +8926943740404585490 +15287141244205141606 +1145668896113116239 +1774358550929620647 +15292217487864895526 +13711909581953332035 +384951972763350639 +880547270030015727 +16798699451900971397 +11571768707434769594 +15282055699228796139 +1887022474723945178 +14585410861575638928 +1873618497637651226 +6811085217409085729 +10050354110762801274 +15292499547258958717 +6103488066881070947 +4900524407327827827 +15290807410150219618 +6023722319315090624 +12099535478267075074 +14554031644319297861 +2625039572996138498 +3944001801548279185 +1873618454645853150 +13945565613351058731 +15290525359354700866 +3867791655634362575 +10087306384122128297 +10757572321232110128 +7578758163354380550 +6473712386164548065 +2209547647594931253 +16799516451087472736 +1791852177081380122 +17365692549803942177 +16913966567458031863 +4716039948972735020 +15679547749024342380 +10000136790365002280 +15987018463982739394 +3832207697714364468 +14971929132800683699 +12347890125828476007 +1144540834800691649 +11968457278982935387 +644679259 +9550801365983181850 +9870728774186799 +10812503129128530772 +6364338479060430445 +9009022494401702289 +5246976935469266676 +828143404974500534 +152372515 +3010009923556564668 +520197517340 +1337484202857800093 +15892618421880444481 +12020808312486432048 +13005486289543189948 +11912360761286546193 +1371414905848474564 +8942580853430826150 +10906583445476543032 +82346342766483590 +1572796400506002445 +16880857162092796565 +830399609281002726 +6843808561223972092 +7246105464620253924 +14101047990764409 +5779476297359830654 +2945165107721163980 +5408600003519976355 +1945545886333558301 +530870814980331130 +2624475548789009436 +15858252145423245602 +9083528074243820101 +13516453065300717996 +2679637951 +15289961386737884752 +8261102338984846696 +10756726246229415442 +12757875013931258885 +12454143207178723189 +5779476232874036608 +13831923478662567588 +7626256666910811605 +9933890694532381448 +4491233093706277004 +584837489526188566 +15754944874062424585 +15292217539454058755 +1200046880285157167 +12272177195838351803 +8148390399974337754 +9870724820268303 +7761643699571157511 +1613275870368917332 +17951898403046309205 +13519566251951086169 +1873618549226808200 +3838791148952228543 +5148680802215160731 +532291916112268025 +10370417960631554345 +4051155539321377549 +10697899350700788931 +5335841636136544244 +17686830652820842089 +7333058067708650999 +5996988199661296981 +1706624839 +933515197985210163 +5405598728725859989 +1873618506235011255 +15292217474968265095 +1092700963858627603 +16870411548972836872 +11655702103329238168 +933797278873241015 +14672693143383258428 +6817582678275743189 +7291911964063055240 +6835555811876477697 +9055090582039434103 +9818927232125460323 +8578095579050963734 +8135278117562163735 +9483351736751297925 +15292499534362342282 +2388013311603665040 +14191466951143942150 +6940421857790289090 +2973669628754930334 +28202057290097143 +1873618441749212327 +15206769993710133412 +15341055891648374775 +9870724855067963 +15287141166822740763 +1789180284486836816 +15292499491370509930 +240752662829 +1585834870661386171 +922131805602142346 +237438347 +7942172172552528585 +6156738011238526497 +15574411472782781708 +13819040185854606 +396563964949045762 +5510538284996194641 +8818689480678384648 +7351759274033218447 +2625039848141689721 +5372831073987541891 +9948707386545294453 +9870726378387156 +4509708205616483548 +9821971278804768516 +507297021322 +6209987895408281197 +13916323858583016670 +3062110519275838672 +507300877635 +12127599223991119140 +14220833965521913010 +11441349876022982396 +5195983199717569968 +15500170349394151960 +12509049980725892523 +15425352553807503796 +936203879074374753 +3884265283043795315 +3919367422827579296 +15344331928744697770 +13269495773572065902 +677143756835082740 +5779476284463188545 +1360642680884123435 +28766090094592898 +6366353548844142795 +12306053747120808597 +6152225697206438675 +6274113245358682900 +2677443433752388116 +5112676103981310573 +6368045642961064918 +27356012379917413 +1685722535145181014 +16913787429901308554 +291571134 +15482838224616111771 +14383051496387455 +772613581792629612 +14202605824724062513 +8991012638537700811 +31022221316800788 +27638041681481537 +2159673587504537364 +18150947892572875184 +11570076609018542594 +10908286541515597152 +5995296092647745635 +2624757552294620521 +6050815110615226668 +8784323283773890907 +17990638739726996625 +9822511720162534996 +16881421151908154604 +15287141218411891348 +8603663293492645861 +5298292471613911387 +1314850518 +9324833269344776743 +15070875736396270580 +17218506732960042022 +4442788352416570236 +18323667541285735318 +12103760585755660899 +11447448449287874771 +2625039568696847033 +1873618450346547951 +17206111748366406294 +15290807384356955327 +6105318176154920925 +15086465342110128064 +2246696221146224321 +13240164578637013155 +6428369877210061739 +16771372229407696194 +12802594135359561400 +18413110001679335504 +5131291355496659550 +15141370283934619968 +10517531034610199214 +1845823343 +4179551994794953125 +1640646057150473411 +5356296971014965715 +16303678952904015697 +17938230234724784388 +6004915412369542806 +6364097396126801311 +9300257224644838546 +16903329689834499640 +14592595666132472684 +15895039187340976555 +15511121406154285 +2907036167260758719 +103179355165315395 +861073031813342546 +11092808190891527745 +828707510864793969 +17628048184874527650 +30458205708159220 +1776768899207748536 +12508782032563754628 +16151845835603726834 +1982143551242845407 +1148771106636063902 +17783567720317063838 +14101043691477348 +17742276506148688814 +5726226344404978537 +2146416213203698125 +17009624892007848268 +451412439749 +1576180554348061154 +10908004533710699825 +14853648843308031077 +18128267682609835223 +2624475544489717941 +3495413321014200461 +27356063969060241 +11984338399046034470 +18392867878323229954 +1508896043149319812 +3736855779376066341 +12786169222001350063 +8871893827936851323 +2442674926856315949 +27356042475106075 +3565993066884127123 +16436648502584676496 +7621298384226502474 +5995296144236888629 +6979573808113516773 +18412263926676652076 +9305145756033820116 +9609420679802334498 +15291935484359238130 +6366353492955695620 +329741218043814708 +10905737430660379524 +15521539403193336292 +7563081637033019523 +6166763183203698130 +1158133133511514615 +15541564850397917782 +14857096493510909106 +5248105074164044423 +2292565810626387729 +1873618501935704272 +6101796028652529705 +9426314278648045492 +6041909456601574739 +13260682755440323224 +1091290924836478733 +14424533014481868224 +12221091663414373371 +15248610667087229461 +8591167223970352327 +7140733654413607487 +15500086339882345132 +115810785595254294 +1385906966876415634 +18216462472613335899 +10221970843398334415 +7254147993173760586 +10372392109843225483 +2576363808540158922 +10757572347027997852 +9202545930662201115 +15290807392954297957 +441307967382696244 +1517290337825611241 +9870725056132445 +6663236911621806857 +13227285597803933958 +3647927653858682866 +13438424846118233160 +9870725059999071 +4800458776006628862 +9068531509278238916 +5783988521111665420 +3469826915326311262 +5516892801706430830 +13328025877317116446 +2716451012107581663 +15291089452348358778 +18106375593589289737 +7737418730439132423 +6972767454878184987 +7247233538829255438 +2886556384174222529 +2623347749725476660 +4197549521920348754 +15292781546465291435 +846986211208348807 +2446395308 +9870724575425505 +3595902834776287643 +9939360910722088685 +1895398083715157437 +10904891355657690058 +5831974351218220578 +18327605836941319924 +11185827869741496816 +5833854255738588155 +10264533437829362354 +503001581559 +5678022819635678962 +2612783635761216749 +5070156033137335104 +5353476867174765072 +6362646376346100904 +9056383152274754485 +8617040449022806103 +27356094064249954 +1148489064437866066 +1411918553412231119 +14819383329427895050 +460009788029 +10422182547935945710 +2440135173153504126 +103461380164897687 +12555384483651588274 +16476905347347190153 +6736044081455244279 +6470597267645819414 +9870724602491483 +3721851243619437713 +5728050182998343070 +6725186916720843891 +6366353544544853142 +7034233821587112316 +422517309556465121 +18423314355843966118 +6960923349447430692 +13288034279163567646 +6087616309246443484 +2908260051937333224 +2134311698689694346 +12071665527435578110 +6245273293474001090 +14383047197089196 +16268427231397307534 +7246387463826572010 +10429504229059409851 +14695260031721094500 +9870724625678129 +9873023131110170021 +18000874969471337383 +4334546295205081229 +4904801948068822084 +2624757547995325491 +18437616482560188726 +4195334 +15273604164533438645 +8061991 +5847102809459352987 +6204347623242078887 +9870724633424941 +11742286205020959265 +1135234542250047556 +11928638 +17781311662180680858 +4014568304163825866 +1873618489039065869 +937181441312640423 +14512071994580943457 +14308207063108377877 +10143656813373309300 +2908722406567731838 +14947114394870370 +15728759896146254913 +4308404763427228599 +7352887348242219961 +13512484172692724185 +1873618446047277676 +11989016433339551377 +11129919313518543987 +5831598103021247414 +5722409915131452329 +30176206500620669 +18411417903263121428 +988739282955820315 +15287705281310375121 +9870724660491356 +16136701123297043514 +16491624797135848078 +17219576355390296082 +1774512733593744790 +14477731067643038873 +1839046036311138516 +7463649505804564242 +539035127 +14530790741782000309 +5354604872598757473 +223556735629 +15292499474174584822 +28484120982204133 +12039042285074526345 +11738987982233683322 +9870724668210731 +42861679 +6364338513453673068 +546768414 +5835546371352188694 +14139999246989864597 +13819022989933197 +8156698152010079251 +7318691048206376682 +15846834187141327071 +2429880031182917416 +15658053239326534314 +1241710799806291171 +2484671181473781295 +8649229879590725433 +9870725183731134 +511598935548 +18250137403942924890 +11501073705457431139 +7139887631000076839 +15292781490576826963 +62194823 +3244265877950901968 +14107289561242165935 +10997765866085822896 +9441526972670218583 +8981039721073617084 +6936665252445696276 +11019740593729785511 +14101039392173608 +7352041273239536533 +15288269284022358685 +3527355901684307394 +18036023682941999204 +16874641730526447801 +631055877915629674 +29048123694203566 +447113154367 +16229996624980420533 +5183103457040544839 +10106891472917385806 +12580737018025682723 +13131763618881758874 +5567604641430063746 +9896616181508083215 +12162857263470885757 +7301047477300167553 +17183667254703836515 +959780012944284474 +1854737581649050874 +13861735479632947325 +5516046735301086261 +6756927452269012955 +14934625691113441818 +7728888387664095201 +2021521861582724271 +15290243385943027183 +6913372420397101499 +3358948051098355923 +9523554809025137087 +3249068390006197006 +6763975686177957941 +10164018653274588948 +14552740110971659477 +923613462875828982 +6103488109871633769 +9733674716123448091 +31304285008890022 +16886028145707392327 +560100214914823532 +1092418947456324260 +15291935458565962594 +17431203975445940996 +108594453 +9386257309954025787 +8648101753792500400 +1788898259486005236 +7364698481609486260 +7139041555997393411 +4409898123206685596 +5349649358596680387 +15663328293832243725 +6153071763610555770 +2777626705483686393 +2625321602296450221 +16524840699079570805 +15290807388655009497 +12748394282201795567 +6583596463113582615 +9413007474485433707 +7245541440413041362 +13744323260253016073 +10280579090808379299 +7450089126982398031 +9467143020924185017 +3401658344257578668 +1573642389527687607 +15291089448049066775 +4011069751666429100 +13729734811843194414 +3363347686781761414 +13072460983143919149 +15691697526685702934 +7194547644473672382 +5668141196331063858 +1522648593588306876 +4728670078173253395 +5183427648261268039 +32150347114945270 +11982867488766958532 +16011761122456966641 +4607713632915254706 +10409585135452887446 +6152225753093640700 +1623790174950156233 +18060636885296631206 +15150908633513417321 +985919114629824582 +3081390430307705487 +4844421939110428745 +32432333424700156 +17470703091213692580 +7087611701083902959 +13710641743571010144 +2508331031789728229 +18087544963265088150 +10862662106437851458 +16075171407991579 +3825368684874516898 +10557850242565042585 +13150190137466829501 +1029093624509176134 +5707546965160437129 +17865928047256223392 +5674203447686604247 +15118925171898136296 +1254988914461712688 +5299098844308982462 +4664582489863642643 +32996400622480259 +2118540506775118888 +30740204914488531 +8523001264174548737 +15290243373046394269 +10755598270899380617 +15292217517958849362 +14383042897792532 +9730290545085467243 +1576462553554379768 +2624757543696035628 +2529329257057896024 +935489342896432817 +17849763801575200010 +8328636978065707187 +5669269296333337160 +5458848655886211317 +15287141209813296689 +3661754374202683148 +5831598141713746800 +9870724846089507 +7300201453886636905 +13069424254661314980 +5408993951251721313 +1873618441747962017 +1728579408 +2228853753820309529 +17346604615511386675 +15290807375758372225 +15289115311733959543 +1736312664 +12362570276035969015 +12640696470018460836 +15654701398943032933 +10377197364816078747 +17945855683816794922 +9116328312170877972 +14840831597640627906 +219257442237 +1005889973576099329 +7002851749355538799 +11132577968375805943 +16426766960960540076 +2106141729923090871 +5194009097795683614 +6045857664744769837 +13819018690638948 +17376818440481363112 +9870725373195745 +17377223576551890927 +5774046330214625593 +9870725377062401 +2879332597155388200 +10660677160479318892 +15028685559993536823 +9870725380929052 +16105414762617984473 +5168538779687134691 +9199725758036923864 +4430163376001410652 +2528483182055202822 +9870725384795705 +1768765007373625147 +9350227582874428878 +6361518396716835499 +13891052450257444900 +11406774769981528263 +5886953915273594580 +10168266130999690997 +12826221819349918065 +16857290923428304030 +1837917940606917647 +9622294935236000072 +9992483954124287284 +7106947262726433027 +1626046314769702884 +9784150154114772801 +1576180545749461345 +15290243424635542199 +8238066788924738190 +5357143089008220959 +4279044038 +8544119418517538971 +282592677 +6877309693745253589 +9232147921011154314 +9233288855970072009 +7840461267741977389 +17937314701596961129 +16953477402172604759 +2529047257851498332 +9870726923581199 +2360543918672728769 +4557764151812825288 +6044741531890490119 +13851950469100497252 +793433411454660257 +15290243360149736427 +11407540588200595534 +497934079908655793 +12216752035925875313 +6461237536894510023 +132588445788164449 +7717191120555615877 +18102427402643392996 +13519566239053198757 +7162255028547449052 +1410790444811382816 +6048234162139500781 +805832293 +27920101074281158 +1836789879294488186 +7034515820793430402 +10956724774926814154 +11823326492945630827 +882239381344246916 +1873618493337120938 +145053302949630444 +10861816083024321581 +18166080023065484468 +12152601924635484903 +813565581 +6204347606046150766 +8309452077083610058 +7526907737779615864 +15327427559924910039 +817432235 +15290525376551981977 +1359514598076471278 +16281405738549593060 +2061938983703023847 +11029100936605750010 +3018542230307092180 +2625321597997157851 +16922140512298292736 +2592039302460042022 +8630800058614766602 +18026193457867997861 +7807458439837934205 +14830675783481322500 +9181810600696500824 +15680750867527450139 +15194513144169578629 +9465450922507976906 +5356297014005543301 +1884114785540515131 +6741512458587944749 +13207638922979919705 +7088020785212496847 +1007582046197861350 +4585539075103465223 +161798587300079877 +14265910390642661088 +13726068525522685218 +10534537747099102213 +5354604855402836206 +5464488983939599880 +7862072121565344349 +15292781537866694131 +1197790757661719980 +8937544163598016967 +2147544210029093023 +6573042730174135562 +4407364903255493027 +12848973762671484277 +215388418859675971 +16101444997614822609 +2104167529122197932 +6979009783906304211 +30458205706923947 +18411699902469439514 +18174909438187803042 +4196139435607082310 +15293063524176448566 +1146796961722356108 +2108115818947109673 +16874641777816331487 +18264369284370941758 +9743002498923376069 +13571622731730200913 +6050251095005360133 +386244926957115914 +5943738324090304811 +16577617590022188789 +11974910906087651447 +6928015987966935231 +931541156249824062 +2676879684690720360 +14107087915136329532 +7434303290952146673 +17782439714894534579 +13864301289782339487 +174343700774852954 +429917235294 +10590197142244706246 +7140169630206394925 +1873624795910719567 +2572415553107266174 +11725966036807151308 +1410790496400535008 +8977564960575134059 +14586538862699090833 +11912642751894270125 +987893190757201816 +9870726020167284 +9313711631703437246 +1574770455138167075 +8225358392072808683 +2605266760616185985 +6097847738826366902 +9870726527940324 +793559802510134446 +1732546186288721662 +1873618523432294009 +6474545484386361631 +8859398409387646423 +29330122900515230 +16429283220471815204 +11287131011864545356 +9870726039500411 +7871853587673405944 +15809921903326491400 +1786924097377611000 +17740842001525334929 +10766331021481433182 +15361003727878574325 +11875513367515317813 +13149062071855114240 +1873618480440500351 +5412367062201998336 +2574671692928008602 +8204095468854005891 +3672957698611031036 +10855928786112762849 +15287423213317735078 +3884829281456430869 +6927169912964251803 +10758665574621394613 +9096696820917623794 +9870725054887255 +17389570317006622347 +4360896125378321810 +5461950758932737826 +9870726058833537 +17092164746526861190 +9391897676699932149 +18252590646744736288 +1294244387081043880 +8881333644924829315 +16751454519855641485 +17296410893175637249 +18101581379229872423 +9870724566420037 +214958148139 +5832739136815455768 +5876985300140514456 +9870724570286393 +10766835278948551742 +15003786722837343230 +9870724574180310 +13819014391343982 +13361048879788722837 +7033669797379899754 +6093428138655376255 +8240010392079832247 +14113999535266355892 +11274326504304700259 +5910191034109938845 +2452883373 +10116412599675863145 +15292781524970072460 +9870724578046947 +5461104791407651898 +9753238143016835069 +7719325777356067360 +6487950977650946012 +17785259814435441839 +6314795724398268109 +13077428511576118068 +11950663969479278118 +7799373095277306274 +7245823439619359448 +481506375210 +16874641764919700835 +10862662132233736950 +2795970204732182279 +3238291700450481806 +9870725101286758 +2146416200305807009 +5471876976429522030 +2103039519398899622 +1884960856243914477 +7070680818924341999 +1059784666551826989 +9870724605113344 +9870724608979985 +15291935514453166400 +2052045723459538076 +14262516099855751171 +29330174489674356 +13292359389385480901 +1251604696132640300 +7852905038841139515 +6368045617166553694 +6455038313397838485 +16940444442725141021 +2248733617239043378 +10599796667465347269 +4297286032912180288 +10862220627729658625 +7032823722377216326 +13428924723387527217 +14304396158180348426 +2950131 +6209141837602893387 +6816788 +14478830953308499276 +10683437 +9870725136086451 +860990237396722278 +18197008888875925689 +29894241687463848 +13135711835622305779 +9870724636046404 +17893685359943244248 +15288833278135767534 +5198521321547510196 +9870725139953079 +17931569688178341357 +5132701450408634191 +15289115359023815021 +903809884198760368 +2135400849061259718 +3007978487467757379 +7397691566188876703 +8716400959763851314 +7139323606792864277 +2903370040006962139 +1873618798573999532 +10145345834749019381 +6209423854005142728 +9870724655379545 +2625321593697865684 +15290807380056437021 +12259619675260533866 +12869851401096098546 +5197393324720875036 +14095582753139470273 +5831598081526007841 +5941200129174748385 +14426789132806217910 +16355799367779829842 +1986666418823776317 +16862372109329386477 +13537015184977962 +987047124351871536 +9870724666979456 +15291089439450475149 +2002437706943181944 +6267888095869162572 +223559378744 +1197790796354242126 +5149529981778795275 +16636332186328898119 +1146232890225278159 +1068175354461234451 +2676315656185453798 +545523215 +5835546371350948037 +9870724674712721 +9178064822587365821 +14539682590822639424 +5212269942938872153 +12679191595953432225 +32432389311913494 +7300483453092954991 +9622122612430025557 +828425425676233325 +11129193728552741913 +2741377379264190629 +2708976476004038704 +6062336577243727349 +2561148857 +15289397310940256452 +72513270612256943 +5835546306865148550 +7194332268386590245 +2000487911911545073 +1012105271870309481 +5887104170002302912 +17447017228855569852 +8681213026300816616 +15288269284021116925 +9825337995373995464 +9126788102794799088 +32714405714147358 +1873618252584806752 +15396852522496058334 +1201738978701554016 +580322893 +4196139366822013367 +34124418943040776 +1890885821270996592 +989585271976321362 +5353476789791099898 +9870726209631918 +8681629277261085660 +31022247111443943 +8874567810005297696 +13332403892305619782 +9870724717245614 +11847668836417545649 +233127573203782818 +91882705 +15291935501556522168 +13940760354079115373 +1411918476028562189 +7516530610330084437 +2624757578089248271 +27638024484315867 +9870724724978894 +8256339902060774691 +4759048207614420256 +9386257352944601872 +103482618 +5918999274156338196 +8973743820060373488 +11911785394654826290 +1873618519133022344 +628865590885028224 +15287141244206534677 +9450798976826150093 +6050238139720879109 +7879092499898973074 +10694515140971663106 +7647579114300337834 +5248105048369552806 +7193983620266459820 +10639573055207386686 +9950019055828535846 +2692344368798195549 +1041425151515706537 +28202091682081195 +2625039594491484543 +1873618476141211394 +8053906304528296951 +17052639408429621132 +27920040886558833 +1779306978045861870 +18218154583927577937 +13237708552781955079 +2684476030834137221 +14224398204307795363 +8653997017376379094 +15290525359356079327 +10198717195139561894 +5622828606025261729 +15287423209018447999 +4215769150679506948 +15894193095142300999 +11399552128607744304 +15430743436301066142 +5880738612678822007 +6972429452752394512 +3141472507348276522 +210658855048 +1731136039788963980 +5195701174715493458 +15291089426553841478 +14947368045187809 +6151661664400651546 +16485429049836457847 +1746466903045257318 +6524633343773861660 +5991347944692402919 +6208295844281859452 +153748784 +3404560976776948177 +15288269335610290144 +3312649398294623331 +157615425 +294416195335097139 +15291371485947905691 +16874641803612205346 +13458674279737615408 +1043963299140158782 +5462796881225256345 +11398792770463145273 +12532441830052090769 +6205434751084601402 +15288269314116309372 +6429651162555183080 +1720270693428499511 +7193137545263776392 +1491033538627705963 +1585891583597423191 +6973128267158348817 +1795508866302886168 +5085143808375860162 +6306366688314267754 +12169115817464382111 +3259027566151937444 +434215260032 +294690573631233658 +10527536402680458225 +10355646851287436060 +282995442491213532 +5573268192801862890 +6154199812025104356 +8980873008553095023 +15293345523382771417 +196281713 +1413892608044380051 +6928297987173253317 +8521743544544944523 +5410392964579397924 +7617951678880702972 +1873618527730358793 +28202143271231951 +7032320227206441873 +13515324995391143363 +15292138696292915036 +1518418338949056358 +5352348780067826695 +13442938475988133562 +15849654381261969963 +5778348236048765109 +7893354151480669477 +17093856879335129768 +15293909590580552915 +109958699162103632 +15290525410945223103 +16675888760268286060 +15185626904467170028 +10223260478367338630 +1997667752184073410 +14513764105895174907 +7425311559839922713 +13979993538309941972 +15287423239113613878 +18301217040866807619 +1873618463244556343 +1575334505140022040 +17069215829953620499 +5458848634390974967 +5675796533980439299 +2359415891753522107 +5884848068874103704 +5139071900894897255 +10497202079288863902 +1604222041517217863 +29894172902374459 +4009970402599071642 +3531693765072872325 +15291089478142987752 +9147860258549471531 +1997667709192268356 +15287423196121817109 +15390154327944024168 +15218444595734067458 +2625321589398572838 +1413046597527497244 +234947969 +14951634866440833798 +5780604324279180074 +13749498212348802918 +6153353810106719017 +5516892784509268930 +12982659022915899257 +1996539682273107428 +9870726372030160 +7298791354676740915 +7446990745058560329 +15289397349632793159 +267514312376396504 +9870726375896785 +6206603737268306546 +11092237411069663456 +15287705212524047884 +6766829744481972556 +27016514402205811 +13957562954616998207 +9870725383550513 +15292781507774149424 +3534543727343112494 +258147739 +15289397306640965964 +14323674081407545810 +2522267832170517408 +11630837546755494449 +12349602882120019606 +12137706698326295296 +13410410909734818299 +7761375828471794871 +6208295788393419616 +5941482119783727360 +2616099190762852969 +17957750408840482394 +32432320526830938 +30740256502403613 +5779476262966741056 +7033951796586217840 +1873618248285510881 +4966825486733761635 +5987138895810614017 +7084316931154455250 +421318648101 +10159956442601695579 +285214127 +2983946824112226239 +15946833183140178394 +15290243403140311283 +1849351318087877501 +31022242812138464 +11997456070329201087 +1945545830446490953 +1200046888883867703 +18298960888149446295 +11074967956772513974 +5876226315842624359 +16600612505957046161 +14493959574212133583 +9236389134579425478 +3698312210412673627 +5249797172580479013 +15528861593223262207 +2624757573789959196 +14252852324458050299 +29330157293734558 +1783539973629499604 +7194608100424498187 +11847668810624276602 +6056233025889246251 +10946559189980500606 +10300063737849731560 +12065444175797711364 +3166103635620358791 +6367324841362000975 +648227025681215100 +14723542022432577028 +1873618514833708251 +2665864799369770223 +1682680408669906467 +4841824174435612153 +2189469973429055809 +812320388 +1251886738330775081 +12361766690509310534 +18154203277000777340 +17374562309260603414 +14701580385335130205 +5831598171807692879 +816187040 +3533594415734468362 +619616864826373462 +14337731624749976388 +5566476545724582058 +12595141854107538109 +8073943833384933414 +820053694 +10197025096723354474 +1873618471841915923 +5728764461935646596 +311384784962460751 +9409295226591130134 +451192258981599522 +16699033851728449632 +9870725953189474 +17608597374236057269 +1122152576032331770 +17618500289837358853 +12975428192621632794 +3618907721383964095 +6269101774808165012 +2206072426945343761 +3766287938926107234 +13819048784580131 +5880738608379542510 +6927451963759722669 +1581464476454431422 +15289115277342089191 +2371362618986213714 +14290466123268183822 +11767708186632801602 +6114892994815861703 +12221319909375954957 +17279977953043891147 +17952462371365198137 +1063774598040740198 +6206603745865658338 +16218721571350540354 +17988024594579796386 +14558912370271995488 +14507005124917810072 +15293063567167014269 +879419204419675937 +7139605605999182363 +9870726480295649 +5303893161848086432 +12386475528824246542 +13489474181814298399 +934361247192139485 +10759828478248904454 +6047549745963804743 +18209008298942679321 +14608322165703010213 +32150321320433193 +4553078764151066820 +2206727487867667430 +14101065186830885 +2789363538679106450 +5541699227146796196 +5168538745295285577 +1586876298849185584 +10210718089712004073 +14164087045804009214 +15291371438656804186 +15317767946604917055 +12419459226181968505 +11167448872936565833 +15652036179915460080 +31022294401306830 +13675269681075400654 +6104304253326538488 +15739206202722094975 +9982186832352131010 +5299098861506279496 +429915968222 +29330208882897178 +29048106497035738 +3383183387167705463 +10304645852458196326 +2103039510800330697 +7300765452299273077 +17628330201278143392 +37526264285632346 +15289961360942116178 +13041267227335340379 +4067675983485950742 +13122408247373412810 +13940760358377172545 +17291878089005947457 +27356020978641405 +14525018628252979177 +6235265633879353371 +2322483400137925107 +6926605888757039241 +15450328516402286313 +31304310803540576 +5921809431117051943 +3066137066939757334 +16061937549871423110 +32714324032451472 +7787493313992266844 +14665067898821365 +1836789909388406755 +15292217492164324581 +15291935441368783148 +10049924856077428857 +10105066009559985634 +7704716089291665503 +12598756429622288229 +9808823583215273093 +7033105773172687192 +16585285965675242176 +8271075308957084963 +2592192606712975061 +620798968570319423 +18163607758736271427 +14424532992985402178 +2625039577295560677 +10225919154718575226 +28202074486152963 +31586254121482301 +11250318056004007213 +5831598115919239694 +800235608040629554 +7579286955532686363 +8697392509581488479 +9870726057588351 +3329897576220474159 +9870726561494767 +8445260906325949719 +12107173747800485904 +986765107949560864 +8259742654006243667 +2835783133221827781 +9870724565201837 +14095300693745345127 +16736599118256956581 +7194265619472777906 +9870724569068484 +6153353805807436638 +15350120448097660125 +6269686111207181187 +5782296414096809551 +9835909453397771638 +3058726378330547618 +10046052103206805974 +13231662550575437204 +9525028417658891301 +7719447182992692921 +9223297463438161496 +16854801861929749420 +16876908876567293853 +16485733270290645723 +1574206439528280264 +6119257085165846887 +481505122803 +6098975787240927608 +29048158086189493 +4813834798410783907 +7210486241685480558 +7032259698170003764 +17938512259725745285 +8072815716184044678 +15291371425760159878 +27356072567784968 +31022281504666604 +15471768358264640159 +13516453069600153967 +1735366328820188505 +16936580133559290265 +931541121857972242 +5386207979076524268 +11288528377158119731 +9870725107774846 +1873618243986208574 +6981265902230634784 +18157949162008874652 +4684722623887011096 +17945290522297710728 +417019348272 +13327056763044456581 +1357540556341067958 +27638058877520802 +7244428084583338852 +5245848878456252560 +15292217543753485585 +14692072255160853631 +13453688972047963602 +4980727526481163154 +9420100824911398140 +7372527701866397699 +2624757569490669004 +3934896155511186311 +17414886868993188345 +15292217500761661585 +3008657884777496373 +8001430470098103451 +3289946664811041103 +15288833321126354509 +18093345093699203783 +1884960770262907665 +15287141235607937277 +9870724634801209 +6098129755230067743 +4574167560718540795 +11235855143633243511 +16676907976779845471 +10648946949805656873 +10315193625862813232 +16978039413016712722 +3878613910076611797 +5992475997406251127 +10785955983509166361 +14433457477706017652 +283574504688200133 +7941288312863335404 +7299919428885742429 +15640168430212822476 +1785514049756873746 +11712144679816673927 +796273196117071383 +10912234784050782701 +11626061267575709936 +15289115337528588442 +10773378550019942440 +9870724654134350 +8474708894183613093 +1884114802737819556 +2057875046416338717 +6925759865343508593 +245052086117 +17357265447970292917 +17792674612993275571 +5835256735436791622 +5357989073729442331 +15287423178925875245 +1536624413 +2625321572202648984 +15610464942188539116 +9870724661867632 +99231104030432435 +2975658901174625011 +15763708237742430198 +12039042285075919030 +416346978214687277 +5356296988211044117 +13819044485282832 +2147544248720385405 +5197393303225646905 +15294191589786855615 +40371294 +10394544377110607702 +544278017 +7562235613620868635 +548144678 +693733783114044376 +14882162462681150396 +17206681374707765433 +4674314144236910124 +4921480752668419075 +811970500388809202 +5133265453119379560 +555877932 +6616724738935120063 +4094847790544664345 +12057284352529140498 +4813046607040035108 +7086919711643599307 +6155327894831460379 +13503845743733794663 +8975785994331305539 +8805896130373762358 +468608495723 +6314795690006432021 +16408909217851576368 +71304363 +4715193929858632973 +27638110466672613 +18323280603412001452 +7299073353883059001 +5347531447742447288 +32432303330888019 +9181763921242373553 +15287987211730368873 +8734911291959945660 +8185733170122812948 +34406448243358863 +1258091056199517405 +9399925452480997530 +8005428069413246655 +10229733804179524838 +9870724716000416 +10443830452258754972 +9076188914171585258 +5567604619933598978 +18105608778974250783 +17791471938283200892 +13079455229790660194 +17619294726059352300 +398329050703599495 +2431279132085931340 +2086674669879181274 +98370790 +9870724723733697 +27920126868928164 +2676033360337134674 +14665063599531281 +5141736951422062068 +5686137334704577013 +15290243342952572966 +1825711576300654246 +5249797155384544149 +32714319733140328 +1679296233332624712 +1873618519131766550 +528050650953761911 +6097847713031850615 +15290807453142179072 +13421658540802141426 +5848025033160740521 +14931660597672487739 +1682680391473965813 +15290807410150368174 +11796710131367092040 +5671243411151990390 +8231778572019507687 +9305464313463517979 +2625039572996269084 +9194029999668671954 +4020063595197763571 +4673918491003940956 +16965951797418331519 +9870724758533346 +5516892818902507786 +6593959610733503510 +13555232407343617416 +5782296452789312511 +18005850164249189898 +8031770806727110774 +7192573521056563830 +15065485224116566616 +14832684879553852005 +1306283359721428494 +13702113181256920782 +13975448000602715051 +11505327415511048861 +6362646458027963149 +17577217573156435408 +9442785336940063058 +644810332 +5893456428412249996 +2848264804414726514 +10971700108384147519 +18108263961901344099 +9411879477660177860 +3503689018008802686 +152503589 +11723458350825627186 +16360064261253045129 +4522983015860210846 +5835546336959098225 +17227551313365508707 +2481036767169564562 +15793133509306411 +6879170609542490242 +336639206865309680 +12370327100086626806 +3582979331527563827 +7353733367356654544 +5423641518300091571 +14101047990902606 +32150304124509081 +15293063506979280295 +9870724793332981 +14561759081156599648 +2000487899013647990 +1201739008795502611 +1221335371036829575 +2624475548789140475 +3452050468582222438 +455711868910 +11752945235704179160 +12303655060422873402 +14999347619306893319 +1730290007776836366 +16255450210874697668 +7242735986167124917 +931541117558679396 +5948794375045855470 +1336269162631814465 +11791289438853537784 +11498027848715870901 +5801361178389723883 +17327501990412644346 +4160843276758430656 +14383064393150266 +14925834994211833814 +7872981588796838040 +5385089937729350317 +15289961343746190777 +9821125259690653591 +5245848874156961065 +102051298152290631 +16907996377422320263 +9870724820399376 +1518136331144094968 +10710209930604466917 +12448664064563047092 +2624757565191375512 +12431659849778810216 +4548309582615691454 +15288833316827066772 +9823071880509083684 +5458807696621841176 +14295234308424287175 +10166171770991094434 +8883657793294524946 +15885176260770017277 +15412359869797111792 +1096085143494089477 +3137288237381257938 +16882226380627137722 +8598210553860005139 +1873618463243311971 +1150013996534805629 +85348920764667293 +5248105013977698547 +3629296517428307345 +1732546104605762517 +1729955666 +7089264523636127137 +1873618441749340496 +240752793847 +7979014859286666522 +17089062600489904187 +15292499491370637696 +5884848047378860155 +17382811654317368607 +1043681321430378616 +13819040185993037 +17204989276291535796 +4676558653293213585 +296262548690657571 +15718229139452929116 +13769985909662624903 +3539164965556153690 +2623911490188693676 +967221069681212263 +9870726378518229 +11380495470737893039 +11231612236763042235 +9096229466658723123 +2849956885635025222 +507301027992 +6591652942651792747 +5740521841471548686 +689774581647501576 +9870725890078289 +5461104731218646609 +7813606462904494920 +15288269301218421120 +18302063029887330527 +3298420552527603751 +15118667592044649082 +6313103621682701521 +9673023095609181795 +16473811014429005591 +5245848925746127435 +1256398957783307406 +16842861853167067705 +9678450631152967917 +5144036663261073458 +16880857106204482493 +821235676275956647 +15839816073792874777 +1534553945562302461 +27356012380034853 +11453734735851959306 +31022221316934196 +2108397805255551040 +6156456046425560416 +16857332490755264001 +3969295736342006053 +1764253805009662661 +15291935475762018746 +691477690583163748 +3194916317052427351 +2786543353157203865 +1873618514832460255 +17996165771162441606 +10458762454155091582 +9297719077020524975 +1873618493338507720 +1533425875651333005 +16910582448009327347 +814941851 +818808501 +5831598150312482569 +2243411901919870590 +2918992974646548221 +14795036413642345937 +7137202551526747274 +9147082425503342715 +13674659639697223995 +1873618450346675728 +6206453538425544876 +5885976061401368907 +2625039568696978208 +18186215503936110660 +3216310690166285201 +7088047785852600821 +9465450922509358240 +1573642406723733933 +5881866613803453485 +9427840011978686180 +17343946872044874091 +12990014909322050755 +17712533555446622792 +15275860588097266748 +5568582435113410756 +5195419141117265281 +5624772853784390822 +3003004122219833524 +13957376916945775244 +2328755418060627175 +2843337439187722884 +15289397336734909371 +33560377539911319 +6926041864549826679 +30458205708311310 +5885261859847867929 +11202456151687630231 +1738375436161147399 +12083278685454866723 +7571152303947213790 +14130439219841809618 +14269577460254784132 +14101043691606541 +13885685190531757929 +7871408416806293499 +14313388855583264063 +2522267797778667319 +2601600586073992380 +1201739004496200188 +16099379342465255783 +5150516383306173631 +17091318705916151868 +656973675340125448 +12299112098695824099 +451412578692 +2624475544489847605 +29330208881662488 +5782830601337191989 +2341393804929298327 +14265336182199486964 +8046854805629641412 +5172487013624983646 +18283577878854455783 +12648272961983368018 +3580814869236945065 +15291935527351178870 +7087201710849917393 +15812753403582837206 +2151088368899408644 +13081897811169140240 +15288551304724050526 +6209141871994875857 +10454316937470028876 +2236321161226774702 +4856234466303485287 +1873618544927654779 +9500100639957455919 +15293909629271818219 +4074212617886460455 +6043037483520839015 +6151097687483293073 +102051250861185514 +16434110397951002600 +7193701595265565344 +1873618501935831455 +18159864630190434335 +9429532903146078924 +6100103891543934960 +15292499551557151206 +6020728396863594233 +11394591756349157041 +14219872676477210012 +5109952608322936580 +455853151859513523 +845012130781799944 +11906000439075812935 +6949933240597836067 +13572413676971634303 +17143196299881427818 +2158545577781383942 +12121182403200368964 +9870725052396874 +5258027276811446544 +15290807392954427376 +7029736316216042611 +9722527200174754976 +10757572304036304049 +236453501174 +1995983910444996794 +17106594781879035192 +33560429129050038 +15291089452348490550 +16567583007047439586 +14642008192357651755 +2675797793070456605 +15505670362359532050 +12914077461652124087 +13766575418632722210 +5783988478119988681 +8507715533846353312 +17245750799710423869 +14264772166590879200 +6136932998238969117 +6980701878023422222 +12753199588762470433 +1870291157349243485 +630191086828544941 +17627766185668262150 +18413391996586557525 +15347737330245915660 +16106595315836918553 +17575525470442103245 +18381188604507416053 +2524528695444850315 +1001775587800345559 +15745933174792335770 +10963670558428910860 +17651274525270635061 +503001735063 +5833854255738728021 +7192855520262881916 +17691343464115563722 +12266760703957145221 +12004437043652013392 +499479982088482217 +4975041129375143582 +10111491154734439774 +4537131845709490081 +460009915694 +303886330487976214 +4732726661406204891 +11340219378265033056 +13658843412666391335 +11193857334526482187 +878291173201179100 +6658118310651258573 +8910110154531694478 +1781574188572489967 +2011949215506762619 +7299355404678529867 +8299267801830735185 +9226789570667638208 +14407778410492546211 +16666629307844418022 +4653849442198963915 +15290243377345805861 +7765640443113514282 +13008029367849010820 +16954752487389141424 +13733412026998943591 +3680303762217118225 +15289961326550267284 +4641275353467399956 +15232722856302622024 +14860172859809149326 +1518418364743707276 +14383047197223291 +2949113337358463548 +10409465511298014337 +16979167461432442721 +17191616767536098668 +9870724625822754 +5463642917535614941 +17069211613896188405 +10878955617237472068 +7561389530019612896 +1092418960353090518 +2624757547995456262 +10707291011112327796 +16543161086522502266 +8193065 +15287141235606689048 +16873513703608634297 +17706351504289447453 +9870724633541562 +5347675226580983838 +15610783897974420472 +7406761759861256019 +5511666307614985998 +1873618489039199694 +12479923255123448864 +38835430638301095 +1464040419261489545 +18166079997269726386 +3490530964383296863 +5140326865108822859 +6379330619301388182 +4295737825745517883 +2464914675083708888 +15290807401551771119 +16267405032391596958 +11662991811784164517 +5808170534249969773 +7086355687436386745 +13610909435744172090 +16061104127948897196 +1413046623322134779 +9035266097591446279 +8854886168440080381 +15287141171120906732 +1873618446047403162 +2625039564397685598 +5862342343483935883 +17455868238103916555 +9870727160821547 +3333630059011856112 +9870724660622430 +8882845388820582143 +39126105 +1539245858 +3005355743189616183 +3076236680870117754 +28484120982342195 +5884848030182946254 +9870724668355724 +7298509329675846439 +15289397375427421924 +42992752 +1543112483 +17917411801369626593 +10913804840997838652 +15287705238318697885 +5281980738344153319 +13819022990065901 +546899488 +1401410983910722346 +9870724676088980 +16499980877748905663 +2308422057123009326 +2907319229924012146 +7247515533736477459 +14584282791664749953 +9672123823199435517 +9870725183862207 +5727273437520538373 +511599052809 +15287987297712762559 +15293063541372511132 +9563139044454776025 +12496230539818707753 +30458201409012955 +15292781490576963108 +62325897 +5213027855012616252 +13860120041666006450 +15594797272825219440 +5250643165900199394 +6337342946991349787 +4489783865834694442 +17783567716017906431 +14101039392313530 +7406197765746599681 +14323396186667511917 +32432303329646965 +29048123694337816 +7354015418152125410 +2624475540190553190 +11231170297014398614 +447113272722 +12499150962668686058 +7791525081614201879 +7085509612433703317 +6154199846417077062 +5046395256634742560 +14778492616152997762 +2034209115294482253 +12369348434015892694 +2131214311901511895 +4796324079630690381 +16881139139804084620 +16880857089008561243 +5516381136337189518 +10007938695021417056 +11707740264368708676 +3633318251436977968 +9393060547051672417 +13468120611617596271 +5995296139937713612 +9991882262282462548 +1362616838693283795 +1779024983138978772 +13730298762966163445 +6604811737535946648 +9870724722488506 +9627981336640185936 +10376351324205303659 +15290525445337213451 +7192009496849351268 +9230455796800362258 +16121927194312981507 +104858890 +5513226622863691592 +7193198048504455987 +7588042873039185299 +5566476571519223942 +2782368556671330352 +13766378452168960939 +5793634336567611876 +17283531675898624463 +15292217466369811603 +1873618497636557535 +7141015700909982288 +4568920266596168500 +18046194195403127565 +2802801844172628896 +1895116084507729462 +6101795981361547751 +15229109302086914 +17781311606292353095 +11091955386067607674 +16870411475888587246 +11615458675145708893 +18153204036691772226 +9108333459130049938 +7353169343149441982 +9870724757288158 +6206321690772244459 +15292499482772056473 +17944163581102665505 +12014771125630345953 +6375092980139239022 +987047132950589969 +9339504757676797391 +14808495226400950321 +1916252573728324930 +6119741675792636303 +16262666550068063012 +15685038007044305188 +9870726269007540 +13366180180094502902 +787559629852784021 +5623392673224403877 +13244896955905353501 +12826571567483983416 +8261835725067338805 +7883991333603001937 +4859408499100434953 +5345419168444603396 +15287705225422055089 +2635993685957433749 +155125053 +14191903130603296041 +6206603707174493579 +303200417326180811 +15292781499174307508 +498702419920 +32150304123285499 +28766124487944298 +6205434751085981084 +2624193540984172150 +7730649748351184473 +4908932779541600283 +5623674689626655888 +18157608516165590899 +11621189233770303060 +9870724799821054 +11331431558187003476 +15288458206618594304 +828707450677189502 +6205069665626697592 +2835998111019581061 +5198239343835298696 +17619527108083517905 +17615560726830735633 +8922919625642751651 +16874702537456225796 +17304882408674390332 +16707599021772399746 +6380959902088641861 +16038494049632259182 +1416293088687839553 +7188036157125574720 +6926323863756144765 +2339592797069064790 +10863226173635768950 +10491886701037104030 +3383183348476570027 +6313103548598342361 +7246669510322946811 +1873618549225712914 +14383042897924021 +14233803619080030671 +197657975 +7276444594547990117 +15782158779298289020 +2624757543696163481 +2842895443551784429 +982297290675328495 +17760632509877998585 +7787509824606654162 +15965980033127356582 +933515197984105795 +12931142192505313917 +15541758641581539563 +7722174334322828737 +9106532716476517463 +14647867937879430121 +17781311657881523605 +11079046024812126544 +5677488692584515610 +1873618484739921030 +9870724846220581 +5354604932785383025 +11330369207596701357 +7237963623580390239 +1133620917580467623 +1873618441748093463 +14427726838325063799 +11980175439545978705 +17941158134117856046 +10668984860718407081 +6374254328350532906 +8342619791447244277 +9183609363595210176 +2631305834116835556 +2520707475493367971 +219257573509 +10913522755810504699 +17685097326481139865 +6940253590455860911 +10786597878172761701 +454753775530945229 +13819018690770618 +9870725373326818 +16389071709237225749 +14206340269106670909 +18411800108726837553 +3055188874828712840 +16073122470972829116 +13597373566494532577 +7675110305344067925 +5453780099371386035 +16254308020470768479 +9870725377193474 +10556309309024581927 +28766176077091289 +5996142146155323536 +9870725381060125 +17892452776038969262 +9870726381139671 +12865485395353360524 +15287705212525438162 +5250643204592725978 +3599324741218667794 +9870726388872923 +2207492642904017263 +2807316339059477967 +12805148733676215666 +11977104894337367623 +7822735708193298518 +16780170146917326510 +13735950114436817869 +7352323319735911334 +14264783237298013753 +7595953279436986166 +8901578402287862460 +10159442889421511267 +3092190201103793472 +4279175112 +8477811147697120855 +6980983877229740308 +439584340623254602 +9218778931772201395 +9536696265469022272 +6313103600187489271 +18413673995792875611 +15287987228927659999 +15925946803693424298 +4960208600480556191 +16208047182051814358 +6157301992455423380 +282723751 +1847659202474480046 +5509410202188648025 +3686437022462642397 +5570988816766211064 +6097847794714952102 +2704320663850339227 +6511526238378275817 +13727996608218222964 +4838981879200509620 +6053028419489656267 +15524263781940137526 +4827035056158557762 +7938745925635888615 +15288833346920995138 +5058464965140771235 +16801251341757859708 +12909565160516631067 +17730076016406646640 +15291935475760763144 +6311975551774361752 +2524806001290316342 +13031916015265340762 +883931539947069270 +6211116008308753742 +17117595085339303854 +7087483761645388259 +1873618536329065248 +9338110272346349345 +805963367 +6151097678884705256 +12611037637091988578 +27920101074412858 +6097847730229176042 +18371639724269573276 +4477183586178255176 +1003633820858869554 +6079047173567163171 +9870725939099229 +17462940091740212269 +1873618493337243720 +813696655 +12221373705611451799 +10704030219077566456 +2388013341697730438 +3875511764039656272 +817563308 +16396392956868845370 +17621268802185464945 +1754516873519393781 +4415158918712488000 +16872103630191991721 +14926165161459650490 +15290525376552119400 +10914208954757900945 +3338719511592135331 +12411268721178536624 +2625321597997288756 +15290807384355844488 +5471618925383926178 +7465899552900996648 +7397691527496478637 +15294191615581516106 +4128778066778595061 +804039605316228215 +11741612511968187021 +6153353818705443996 +7988310113853327291 +16534817646768379151 +13517299071517211792 +13513914891881875965 +5512098557251946656 +9199443758830668349 +1731418116379058287 +1467988627404702934 +2558626521587867940 +2147544210029227335 +12217235256243064457 +8455366527925178886 +15291089400758100147 +9619947050333453610 +10372036704073636537 +14571562060511909695 +1572232307513843060 +7086637686642704831 +934361247193526783 +12524334287879490893 +6584302816815090702 +7941786779679006650 +494403148137 +2202768282103260965 +14839617598515407482 +11251231278828767872 +2562857395266064983 +30740265101124183 +936908871539055054 +6032423098437345866 +15287987237525007914 +17955470565775510984 +16506080346347743382 +5940354101463306391 +15089863198376018864 +7852905094729715185 +12318929752413839212 +7377660924429166354 +6779138548877442196 +5569296709752664397 +15421731514577598453 +5299098840009811578 +14295903598136877032 +16881139122608152272 +13944144538013873603 +6151097730473877865 +13516735047310052126 +1873618544926398992 +9692124098164367064 +8857706315270875980 +18200912098503827093 +17990964592601681947 +2624757539396871627 +16872103681781158562 +3652070829616480012 +6493133948225859324 +6331026113891225139 +9005074264764869567 +5352348775769916286 +7303449673501138479 +1083960774566888958 +3671173590192572260 +15350594853131537656 +2571784726158399820 +6101796007157446605 +2109936527316572997 +6980137853816209660 +5707981891830967240 +1873618480440612278 +18412827972379344963 +5354604928486099216 +8507715619828735150 +879419277504168750 +7192291496055669354 +9870726058964611 +6153071746414747689 +10149141700878167212 +8599440168485008928 +9221885810061176963 +18425890913426347969 +4379417499401732680 +14010751333566006854 +9870724566551061 +214958279031 +3489492654997254635 +7141297700116300374 +8642974666848424664 +9870724570417203 +15289397366828842359 +16311155481387553360 +13819014391476040 +1996547999139367752 +17846664389777101282 +6208295848581274450 +1905200778358570853 +14607325535293226939 +16320309946182739013 +4630504023418151101 +494159375524774761 +1696391410189493918 +207215350385547032 +15464046373880873760 +15511108508391632 +7570985824906513159 +7401639761432943634 +2950001785237819212 +1885806823769141227 +9592459637008580971 +8445260820343703338 +16315146954143063474 +7516607870825793730 +3594826737063038497 +315050925112969260 +15289397302343047582 +97657756776028676 +481506518605 +27356094063131764 +7403693845200445637 +6979291778813526232 +32150286927343276 +5245848942943410995 +10331634811009779754 +17298949083792036942 +5462796842532881910 +18411981897376661535 +11769801357615514407 +9870725101417831 +18441542378572182329 +12076011538210559789 +13177769289477603868 +5671848377426519086 +30740252204482463 +4679476691255440809 +763691780069944318 +8486084864959800168 +5569296718349996227 +438514690690 +10173515246672616438 +14646490796529699433 +9451201269122101163 +9870725109151112 +1465168459078700632 +3009785933191985097 +5885543833259752787 +5194855147004049441 +9112408582863789992 +6261827792145091100 +17157280723945799702 +17150040092702491554 +2781470259931788244 +7053081520504379114 +14828871009175423266 +12648554978387048879 +15290243377344551400 +5622264594716051582 +14835085571082555460 +11498071362476911238 +15858116883009441126 +882239441530857512 +7085791663229174183 +12665415608367389467 +5352348827359054196 +9444197008647265239 +14148602877601471939 +7200898066013776217 +1873618532029766255 +995750785910265061 +7695726709112192844 +3081205 +13944415416121167301 +1491560754794279272 +7034797867289805203 +968618140133124499 +10280015058003956247 +6947862 +2326422845866790003 +1192315333980327001 +16706843991765104056 +9460680749727830239 +15292499581651081790 +5022854245794334366 +933515180788172966 +10814511 +6447496643360079456 +9004852395341597654 +17077757103034277577 +1873618489037967730 +13510929043443359288 +1092700946661587996 +15292217457771232712 +15288833278135912166 +15287141214111479546 +338513833735101543 +6156455977639241035 +5808346981246590779 +5754917510345274322 +2375065621518179469 +1873618467543980180 +7246951509529264897 +9870726147896991 +7040689090636689611 +9821766011289417465 +8681369105557632712 +28484163972897198 +1041707150722210323 +2365498129463188044 +2095607110066199040 +9870724655510618 +5944302301006475208 +2625321593697996686 +1139622044438576541 +13534666698246611446 +3167709047998131115 +10378889506222979116 +537921001 +15328620197620903756 +12538144815240128289 +15289115294538166722 +6047549806151682732 +828143439366610532 +8898527545369704571 +5093209217354639096 +11567256427794818600 +9870724667110530 +987047124351987116 +1368965173581922664 +28484099487118083 +545654289 +9534788295078401941 +45614200 +13913275829828992614 +2290569701109022484 +3260260216671256678 +10156853965084756303 +2707637655416952524 +7513097048729865926 +15289397353932204527 +17863674033092632694 +413763726066545523 +7421457429828542649 +8537256878047896352 +5462796894122029255 +3481693870735430809 +15257142807793776102 +5746409865259278040 +1102836675776172634 +16685069423980191887 +1561200426 +5197675268038942739 +12462325618876574746 +490103848120 +8634458684264365973 +3158171969379765157 +828707485070418761 +9870725194216896 +3999491556140986397 +4561962166721268964 +2008324218353228762 +15293345579271345899 +34124418943176640 +15943731058599815481 +1873618252584938662 +5353476789791232574 +7140451676702769726 +15287987211731740691 +3720158282630972733 +9615343272732857451 +425618067092 +8910392170935355679 +881957369240187596 +15784330828301818201 +6623379183202363094 +3275515734983456789 +15291935501556668382 +32996392024042624 +16860434645389679001 +1357832397609392639 +14665085094871923 +10139438201185111788 +3584013211340658323 +1334707079751930229 +7352605318942229420 +16711006881204344067 +11704575149127332765 +9981815882220007138 +9870724725109967 +27638024484447577 +2372569397844255469 +103613692 +2931000267850396859 +6436612627583878747 +4154062299902865224 +986483108743372515 +1873618519133133164 +15173190517968431066 +2749379654336266707 +8095744058472820314 +6503203029796458636 +5728764487729037787 +15290807431645701991 +14457806711540493709 +2625039594491615627 +1873618476141318062 +13962979271623785281 +17462940074544288921 +6817582648182053066 +13822303497870464426 +10700535707996342737 +2849674903624771365 +17600442256884848769 +7197578335120273029 +2990354750709063442 +5788558028420828229 +15292499504268657177 +9715519715632306718 +6993947170709595444 +11523323135897785215 +7696539488583693410 +848678344016672241 +16264927447734165880 +210658986196 +15861066529396107198 +2332858860486222866 +14801512750649720454 +13819010092173795 +2363364129989404095 +153879857 +6284197438711230437 +6208295844281991309 +6860868852447995082 +5512098540056037520 +15851194491678169133 +31243219716159178 +12050109233578647327 +11183009616132063611 +1454412279531855603 +10325967164613337522 +5890488379732935024 +16273447528372711619 +477207209552 +5259661516572013648 +15291371442956214171 +2791055637095467856 +17088205480574656636 +1360360664480702080 +12225574620834962895 +14643390096582848470 +1211499472176433182 +13768831554152898127 +4097002672420505140 +4365240356366345966 +827297415953070481 +1626046306171250851 +7144510393883312671 +2691365739792453435 +1419747374885133605 +30740204913366993 +15288551330518688776 +18056758355458723202 +17624265259507127198 +574051279841470831 +17881795351005317028 +10744889200825601940 +4149668843845129538 +32714349825841418 +8481290603310484203 +6368045612867395663 +196412786 +17160166614835088376 +700755884230 +5410392964579537982 +8664755185414837843 +1618048457524008065 +6770804041312782963 +1873618527730472129 +5885976138785184600 +5304739206755723164 +10167863886603357875 +3017170401495030594 +3965453611361855772 +6375653898722412963 +7245259411113050821 +15292499555857808377 +2108679834555796687 +9697782034300612595 +9180319043391261258 +9870726345094858 +15290807418749075179 +8381221261987290436 +5992475971610495953 +9870724848842030 +5315648421643709214 +5246977008553902291 +2625321589398703790 +1467424551608335810 +14027755776169895775 +16848105630658613198 +5492108395234016091 +6101795946969713693 +5512098591645198234 +1522648623682375830 +17486135465507508713 +15287705255515992962 +3668163402567412316 +16976911390398168779 +5517220880466527887 +953645941585617320 +18413109971585663049 +6980419853022527746 +9870726376027858 +4197341102689691102 +1183641060959079981 +1038604983189859315 +9870725375948280 +5983691128602448835 +17954262002415201960 +1628866448703965161 +17465760333151942103 +9870725383681587 +4916851323092804668 +1784676356106227918 +8326488984410732043 +7315825991476928884 +5679882735784102776 +3452050498674904779 +1575898537944633078 +5693180783976143568 +4654977494912737571 +32432320526956470 +5192881006389627415 +10164197699163144546 +27638084670918520 +30740235008552085 +2606617908549080678 +1873618248285638137 +6313103578692265681 +14044077120902337225 +421318771835 +15290243403140455615 +285345200 +8217475251387769065 +17091318675822375039 +17946608694533885853 +8477529075406363752 +13963210206037041390 +12881851757641419011 +10093801186435163270 +2624757573790088454 +29330157293872732 +5572809636518235014 +16572875086188982375 +15580423463670796840 +5878200460755211149 +31304302206344209 +1635660363048898170 +8771384587603175234 +15291935454265566155 +14108728405997534063 +2375344146902424216 +2574671748815342959 +16357059045845961537 +15290525419542683658 +1682680408670023911 +1308624588 +9574821109815792297 +14481165621045244910 +12736880509618375215 +3232458045602340341 +16095291319491517764 +2719347730017304343 +1312491219 +1880166538706292734 +812451462 +2344650909498760077 +816318114 +1730854092171866446 +820184768 +2625039590192323421 +5409103959576811975 +1873618471842025424 +15287141196915552470 +7086073662435492269 +5246977017151234103 +13410742767630947929 +4954996470008200552 +11212924885651437835 +12120495559683883252 +12192372740841489150 +7179138111753108806 +15292781580857399677 +6368891653478311009 +17284165344327054733 +8879858573939446939 +15711638341870511759 +15289115277342224803 +102615266471185595 +12057002297434514360 +7247233508735582983 +2151210492049175649 +15595862136028537564 +2528483212149269367 +17956915698262953818 +315050959506197133 +15041066182058449417 +5464488962444504762 +7014174784590994814 +12269921124804136549 +12538866302731362209 +9729444457185022903 +1146796983219084799 +9870726984333075 +7730859263082784452 +15289679344540006706 +2572415639089800237 +7107056472984350362 +5252617336607294901 +8840823347568123086 +14101065186961737 +15289397293744480787 +848960356119635095 +9894737813480885853 +7099572391504727171 +18432990119880120151 +5345413081680732992 +27356085464548250 +130269940204124527 +11231170322809037556 +472907935009 +16577617590021068620 +5303893075864602273 +11319615737161865653 +1784958381105832108 +9164999891234408560 +429916100351 +2621960197726354447 +18412263948172132401 +948019863933692493 +18306137256393927354 +14258567801432380221 +6979573829608997098 +9786693399294579407 +2021803895181227948 +12270002014675477093 +8571826506993716065 +17335214638657647063 +31304310803669717 +8279029446643571677 +5832726134239993618 +5081540983697005204 +7111971448967937343 +13455211355597322620 +18029523497279431586 +15169360783856786455 +1873618523431177919 +12923090951297776713 +734638279455874636 +9149649826071522392 +2375980338408593312 +10981511187954474869 +1714117073097154076 +15291935441368933443 +15290807457441608413 +1584155116203032541 +230045241759915008 +6360390301012675830 +5723537903358382534 +7140733675909087812 +9612968081410774703 +8150830429996001520 +5357989129618016230 +9352943157693274323 +11824914510820756143 +11867544312546280747 +15862817677379702816 +14311736903207232590 +5951403195973181057 +3169119117114234736 +14947084301192347 +1873618458945390773 +11230324247806368955 +16385520563032962260 +617111751978134127 +12171433882329507697 +7352887318148547506 +9735614383619787099 +1531754272364055817 +1587560748646297180 +17885450446378508188 +684134257893510341 +9388513497063498645 +17013423603597332073 +13154624256008000883 +15377963507662672475 +15044168332394903079 +5458848587099998387 +6768765572031804023 +2785415300443495771 +6928358494714596981 +16321209561971495642 +15292781567960770594 +5961646480599500073 +7908136693532398089 +9390205591180421003 +10530167746413139041 +18411417873169448973 +9870724565332911 +8025650434097164434 +6471725307461908459 +15077663958368327270 +10788853316520461068 +9870724569199558 +7696539471387781816 +7107056524573498521 +15289679396129164624 +13555232347157252120 +8925364450174790669 +6927733958666944690 +15512884641524686603 +1735084312418086837 +4890558848511061886 +28766150282605251 +1459422983 +15292781503474978553 +9870724584666089 +2120987217453058359 +4496794805165715492 +1574206439528411204 +18178458048974643666 +481505254705 +15555403619471411202 +17786951908551234943 +1945545890633113992 +3599324715424174356 +14584230921965028969 +9089484691973612983 +9870726096385671 +1438028811229214165 +28766107290776378 +492722805206555528 +1309203743886743365 +12276488396237581405 +29048136592355722 +17620704816670781804 +10591607185567660461 +9870724603999225 +5953855926417305520 +1873618243986342207 +9870725107905919 +417015617449 +12869109390749677051 +417019464204 +933515266770550594 +13074608377643495593 +1087507565178194280 +6280436218988869250 +7515799761807543267 +5357143063213838770 +7246387485322052335 +8854892867934437677 +16990917691867676463 +13977959430917731593 +17620986833073015413 +15290243355849344512 +8690606654492194760 +2624757569490794436 +10166171796784487508 +1788616212990087906 +8852291706359849598 +13044533461223477399 +15500000815678378760 +16631171720946086237 +2519447650948039630 +15288833321126468886 +2012795333501470777 +4511323711897082696 +17686830657120392424 +3569974137420062168 +900303647357298530 +11943657631361676337 +15088171056967914114 +9707340264918357305 +7105928398775274636 +691195635489708310 +11173315229430148141 +6002914946032280618 +9870724634932283 +17504292085427627453 +1788898272384146689 +9870725134972334 +907439166692673974 +17154997177014700139 +17217602274965138935 +2623065440980588112 +15733389794966901253 +5568018385111685539 +5303047104041389449 +7031146359537606955 +9205930118896379907 +1873618467542754412 +15724243752769318826 +1785514049756997042 +17908989790600913507 +6100103857150845160 +5831598124516729207 +15289115337528730876 +1413046623323512981 +7033387768079909213 +15291089482441184570 +1842148156553913714 +15410667745586336183 +17753736439300382022 +245052216785 +18438369764282079054 +17089062604789337922 +9870724661998706 +29894155706570338 +15287423178926012559 +2625321572202780084 +11272445595878696212 +13840919426802991193 +5780604328577362318 +1144540847697573036 +13819044485417974 +9870726165984932 +40502367 +6158568077520878753 +12808641794728790652 +5565348523104798703 +1544488741 +7245541410319368907 +11849924903154044884 +59765756015892967 +6287464079413750955 +15291089417955399996 +7660382775690220758 +16870693505188843829 +3488901065241816897 +7515235746198921209 +5514354727165430219 +18388527066533475846 +7194547614379999927 +15287705195328270391 +16365628939579236043 +12065959035826690047 +1482883811291912565 +11972361444213865127 +2306865600868672525 +28766137385947915 +16872949657905018904 +13947573534378315081 +14101060887655539 +15425352558107048436 +7352041294735016858 +15288269305517838595 +468604773301 +16964592658668656125 +71435437 +14429530094515856193 +2410249729355443094 +468608617861 +4660356463396415763 +17307494337504229296 +11370043909508046628 +7404505628639245389 +32432303331019064 +579208779 +14106274658387564163 +450713825271438107 +825323262442041711 +4624146031334142473 +7301047498795647878 +8392856976783591959 +3216053926126186647 +2933987295449668061 +5946179046742825004 +14264208172476402077 +8062485076261233493 +11774326933274845565 +15043322265989569812 +16075141318198097 +2156289433662736589 +16219273337878950886 +9385515070197612107 +374705279866847751 +90768584 +8382800723529834937 +13516735064507357978 +9870724716131489 +12976673671053271079 +4392112055940232155 +17840725094276677090 +3252495661062498692 +12626898838135063762 +16797867144925377232 +9870724723864771 +98501864 +5132137370313113611 +32714319733277273 +15287141244205410514 +18019610867533693563 +5193163005595955248 +15275014538889160074 +4896553002078769972 +12517749605344219389 +5761348878962154705 +7139041577492873736 +1880166564502188203 +1873618519131904219 +17465852006774542502 +18116142943679221529 +12654580528992554315 +8335349732817189727 +7026070094382700083 +9386798933431492125 +2364851878346971530 +7166251869025477906 +13146357072728951925 +9995148043625503715 +1974347269812613679 +5258533425167019911 +12426955395954659075 +5780604380166508567 +589295532646343908 +2219137191900107160 +1732546117502516501 +2625039572996398905 +15290525359354963031 +12817829052282051992 +1873618454646114799 +1731136082779663888 +4018433204563629226 +10766942018603203302 +15291089469544549057 +7300201423792964450 +9870724758664420 +879419251709662265 +2825613095624582560 +2412665810316626107 +16944123511402949251 +1467988653199354943 +5572365141172364927 +12430143129524453801 +11532532808651189391 +3838174829573529003 +1245834158110096022 +5950902662560623811 +12655253118821348101 +10288890627884265888 +12249869020278044289 +13646305097358861198 +985637076731250533 +15124988490770308951 +5246976935469519314 +474241401544512263 +6883252547457533242 +16223350642495801207 +5083563949734904948 +5991347923197298752 +336639206865465891 +160367943 +14332904734139159046 +12425827261557926880 +10392598637072183638 +18001524900627295195 +1675756474409618331 +32150304124643239 +17990863195821007808 +5506500834030544235 +9870724793464054 +17626356103655664611 +3418035913429949663 +103179316473039800 +15289359211524088045 +15740733274947784381 +6157302026847397528 +450064107389078176 +3960279058364838092 +5141454943617292780 +8748870389615379821 +5709455775385986211 +12786169226300891234 +2671293203349912153 +9474789777278181823 +2282846157843677617 +1730290007776973486 +2879244178074777688 +923947781409434731 +1572796336020472510 +6050815166503935751 +17619012653768772305 +15051938955371697687 +15289961343746317664 +1254706842169851934 +11403208935359256821 +16223084743938306026 +5570988786672406553 +8841050052890532134 +8908700072519080608 +11830742842443701946 +88972188345594760 +17620986828773728064 +10908286554412506983 +2624757565191508315 +109958742152791274 +9637464119082772041 +1715809214503940595 +5301072946231121189 +4226024969853483200 +6441960298881695355 +27920113972417806 +997442897224486619 +1991460714865167998 +739107654424663349 +3137008809703922008 +1873618506235258037 +18161641425241525430 +13603584720093926748 +7603297089728960364 +17489156252860356823 +4160546838840675132 +6929959687306431224 +5677488671088052414 +13885455422226639405 +16178578976118237272 +16924762704442702243 +13105552693218594007 +13277132823644162777 +1873618463243447361 +18319050357371464235 +9870724855330109 +453534040887276173 +933797214387708955 +1873618441749473976 +9550801417572585708 +9870724859196740 +240752925092 +14581169549126145355 +11107018595182597412 +6156738011238781019 +11462706732688296233 +1517290299133357428 +13819040186125348 +12338805997140857438 +1166485774173871941 +16311679952720382833 +5913331872810342175 +16942700513759680112 +16418446140666488992 +18153075207089903635 +17219552458212009219 +17883481473701259606 +16780170211404507817 +5835546345556559722 +9870725382436391 +8795062046652779096 +5623392638831300750 +5408781293408960458 +12127599223991395013 +15447642462950919315 +9811079684342379092 +2198408244591746157 +16482746120876606131 +32432363517523649 +16337104745239483803 +12057284348229989994 +16205457369852164700 +12535429296310016929 +1244961421057412177 +16874641747722658748 +9414753872044514477 +28766090094863968 +5245848925746243092 +10864636259949179115 +5517738889606009145 +17352530741077946611 +1269789428801815816 +1304290611983698291 +14395835602564421067 +7715066999728056002 +32714379919764972 +11932618065435324615 +5301072997820289523 +14362448674145783141 +11466923009239095725 +11548493110908750276 +3722189998311691791 +291833280 +10325774452947296234 +27356012380174863 +10184983752152594091 +7143406886591548965 +2150364451439709603 +4505983507584935667 +6119791393893989862 +17774138996614450804 +10583981689183288558 +11678995252015348720 +13058184471635839412 +18114450845263010289 +2676033356037949622 +11539950865550042994 +7034515842288910727 +847550205320581725 +14665059300366457 +1836789900789967339 +14860123017743199018 +10206308959848712978 +2783379539012707475 +1873618514832600690 +14153679155654378220 +10223260508461420509 +29612143602376351 +1961076136461299457 +5410392930187702100 +12919095011105331776 +8698802578697686352 +1043399313625599602 +3202253521892417972 +5331013002655575023 +12258258924229636662 +31304237719295972 +932105128868144483 +3805996753169487452 +10555140267988682961 +1734238250311970546 +16872103630193380772 +16286732516091630018 +17088877222950945719 +5885976061401513308 +1873618450346830687 +2625039568697108390 +2879565311197059779 +11563580929413356783 +16624435837585013922 +17513221492263040680 +12598756356538047392 +18068492228830379629 +6365225423046183597 +8722835432433806539 +3874225267140665443 +311384720475557313 +5727354362725871428 +14720147820535624980 +18191072227770244864 +1144540830501663499 +6280132041793235131 +11876748939325816807 +2363364147186716024 +1893423951699593826 +1413046563135768556 +16524660023964223241 +787559604057019991 +9558026018081288131 +3671829598606419238 +7033669767286227299 +6466459645184779343 +15291371481647508971 +6152225770289850102 +5514354709969504819 +1271298201944985758 +30458205708436316 +11615938700888521101 +8886499618132999999 +13590834881984403547 +18289406748226373239 +14101043691739988 +13218864784511934798 +4935588326251711604 +451412690905 +2624475544489979666 +5693447338652889643 +6379267803673812662 +7140169651701875250 +5267721725906267493 +4783916140296554602 +2146416170212136889 +1384711921 +14493959604306211124 +15288269245330108257 +15831049634807226603 +9434489230345442975 +5779476228575004811 +929703093156799954 +5456833590402029135 +8857706336766199976 +15806549249001663025 +17619294730357523764 +14335351448779893726 +372126913394980519 +14383060093976221 +1396311798 +6477342099968564189 +6209141871995001834 +16105232738814408420 +29612195191528881 +6097847760321853670 +14262516069762077310 +15724675377899249532 +3092834649864430702 +6516889468507339951 +16954752457294096421 +7798245046863033206 +4928375806344711334 +4987909742416571193 +29612152199724768 +16859441599982166204 +8536128778044337574 +16696307577298039232 +5129588233664614276 +6039352994558864452 +5359117135041944518 +9124001485831165950 +6569863671793086173 +15287141227009503658 +6809547709360978052 +1873618501935961326 +2712368608621181562 +3204772326039889813 +6051786176702917357 +6927169934459732128 +4329752029258000050 +9453218279371719930 +1464040410664294217 +12997102390997569152 +365262179507572696 +16105011288268555480 +7454232953603774276 +2158545577781500534 +31868356506233453 +6814198451349565048 +7927937241877598081 +15379755310675158311 +16576177485964994396 +15289115328930142124 +9870725052527947 +10889818644871523683 +5044274253921797280 +7397691536095209418 +2841081295069014434 +4947378311988385290 +1789180280187804665 +7139323576699191822 +6487230022497298250 +236453632277 +4733572671923240194 +12804866734470011201 +17387144877877771900 +829764558740660946 +9394728855544226620 +13819035886830549 +11738510348735311619 +9878041314104865619 +13806870097308702174 +17636993876762776340 +2754754882639053549 +8824922350743548034 +7258869010750857897 +13179590365210028967 +16292456432774225062 +11915163526657089626 +15287705229721495171 +14320651656584763808 +15913312808875748655 +14808173258166135817 +8024571194552110044 +1538784131415363209 +7245823461114839773 +704478739862008292 +5833854255738854395 +503001862847 +15291371468750872667 +7409502855497715849 +8515376925833327414 +10498048128495981157 +8379481146896039069 +2848264744227113441 +9519529920006072839 +17626893465516529041 +12881745582896534642 +460010033761 +12162817633214230973 +15287987246123734684 +5706434882290257816 +5569296739845362474 +13375995718174465421 +6479135721715547408 +9181481831755876692 +15233850904715862153 +2782815510507445929 +312230834170764827 +10809976220681122600 +12062924654788222398 +15288269253927465395 +6471833751608638650 +686182618244267404 +11573418911012687820 +17128524481992544865 +10694569605171403947 +2118540511074652615 +16773264628484355792 +524384476410220130 +17369213304636858064 +13365777358560850578 +29612203788885971 +17782439637509742252 +17306856514894446629 +9870725122127262 +496764391 +7032823743872696651 +12646299732263517464 +9870726626113275 +27920118270482078 +9870724625953828 +1500710679 +14888335476747694295 +7512533067513227590 +2624757547995590433 +5993604024324272534 +16690611997592210609 +9870724633687088 +9870725133727145 +8190612609173183852 +12190785 +15289115380519290363 +16065051800701782561 +17865975268837428671 +7406761759861377982 +4908788612025362458 +9064401497118292300 +1732546151895752842 +31586284215547137 +1092700946662973377 +16434346325777267598 +15293909573383508309 +16111114664945533487 +684134309481422888 +4147422693257785265 +937181441312903913 +5619162409986518616 +27920053784688644 +7193983590172787365 +3433336989174353953 +14335814102546143625 +2625039564397817875 +13854560992155290635 +14752094554945246978 +5778348154365964742 +15287705281310634386 +4200651629265236390 +5992475932919346977 +9870724660752840 +2928740603216536331 +12920438568781093684 +5803642696037577323 +9774827789264376775 +16485991221836261632 +5357989052234341245 +2039416710 +28484120982471981 +5139344024722486367 +7562235613619754607 +9870724668471458 +14464988267023835218 +5727354358426570924 +43123826 +7300483474588435316 +15394822466617413589 +547030562 +5195701144621832653 +11293068859454066942 +5464488979641802671 +3159951381903919733 +4407364920451685011 +12716168343248660335 +18349504802666320011 +14305386864687476259 +18034169515038816483 +16101055838018476266 +2202486248503797833 +62456971 +8496256795987178209 +15291371455854237254 +15288269305516611503 +4509067580676322466 +17428161912920482631 +14101039392445954 +5411520995798164604 +15083982075123155320 +4672572315785571800 +17615346479225135203 +17074939079306392107 +1934590641132221703 +2624475540190684094 +2204460350424443196 +1459544300034011296 +447113412484 +9870725207193033 +855827826974282078 +16881139139804207363 +7198684663705640717 +15291935523052016353 +1786642098171564142 +7146505736374849406 +10958353389774721303 +542887929096452372 +15950055708248059929 +17992717636234404738 +7533382902556348133 +10758700382543550861 +29330183088506961 +5725098270194999576 +10809573709942637574 +6097847756022560547 +2044349384238507615 +9231865831523355137 +10598104538955471871 +5526593477500427755 +9870724726486235 +7299637399585751888 +15288833308228592778 +1880166564500949542 +104989964 +12479536636615268559 +2910516191757153153 +10585955816899812450 +10191933884664648784 +15413769895921530257 +9244670024026102218 +5728764487730399297 +10154597833862757294 +5778348205955099260 +15858614579628623542 +15897908900500867829 +16627166760254318458 +15661490539250872371 +3944001801547296907 +16707035010462005019 +1283692271244348278 +6259289631624209392 +1787488181771581149 +3968071944726995910 +10904609334956415243 +1133620887485418280 +8988344939515882997 +1174393252567468929 +232154336622 +1168177851093704822 +13731144846566318108 +2999903426787757987 +15291089448049317388 +8821289896600019677 +8047947494936889133 +6365225405850260289 +16860718369869670191 +2857298572705729780 +13737767823308043172 +15087583807095519637 +15292781542166257325 +1254424911749991283 +151389472 +9944700266958239061 +9870724776752370 +8173849284561302383 +15007091455370803738 +5565348488712952667 +2973047420892221494 +5234100733262917257 +513768284874087374 +15234599434631465584 +16107267423789993088 +7562235557731319105 +5991347923196062954 +4672226656941319819 +15289397319539121373 +162989407 +7193137566759256717 +498702577808 +9743002503222923413 +5625648877531054395 +14508227471145197739 +8267357353585631629 +10155047267998776091 +30740269396679506 +9654948979479690029 +15289961429728713252 +4490474650665444194 +667486419041269710 +11109614543288091663 +16872949623513166141 +1919627395655995581 +455710762603 +2103039536595089204 +5035010048587224338 +2150012508394499105 +17530637808014602305 +6879842043259087710 +12626916662629440022 +6155298010574883988 +15641901585737787219 +5230986364061245560 +5991347858710271164 +5181507648172747729 +5245848917147669451 +89657146100419796 +30740226408737057 +17498716255300422171 +8695136395555508219 +330734230968555697 +6915221776078629420 +34406435345613145 +6502708495632058375 +11078764008409997732 +30740204914741250 +15288269228134180831 +10519988750157764084 +13615807181988252621 +6928298008668733642 +5095261602624057681 +5249797185478600558 +7406275616552079384 +14383042898059247 +8965990732324548050 +1998795749008366465 +6819884512675111258 +13498697150467018898 +2524805992693113933 +2624757543696297516 +1576462553554624160 +16254918518287392851 +13942734464598631413 +1781574119787552239 +17706466419109550121 +7952683120371518788 +15292217474967280396 +6222397402118508377 +1709508424 +15288833295331962003 +13514637760944295660 +14412651613346993100 +15288551244536429351 +4347361800310691348 +102051233665390445 +7553735952381138865 +15441339033448026323 +1873618484740055973 +1788898246589641504 +5515988910840373094 +13405078033661575645 +18067928153034001854 +1575334526635501239 +1168177902682841618 +9870726850377480 +12591112773288008661 +2625321610894052181 +10416759013972843843 +11061974007659262709 +1873618441748226346 +28202057289109019 +10918763254075386641 +5783988525409981796 +968319660173248214 +245619828089971892 +1466296546184554597 +1991460628884177269 +4770844606942765987 +7298791376172221240 +8206767194354379870 +5831598077228241330 +11132577968376078919 +9074699943834555525 +15518650097086176637 +5836123320750336386 +18017107455346107488 +1136619602727214767 +15668928978732333002 +7604559487852231935 +9870725373457891 +13314312620076373775 +6927451933666050214 +13819018690899579 +9870725377324548 +14094186447716373384 +6153917898799988942 +1414738648654094022 +3807232769024090873 +8847415897280753520 +17627766168472469328 +33560368941434833 +17764324346977458335 +6487950981950481422 +10379171518327310969 +1839045967526312206 +14002799093840958288 +11284401197926521606 +944005402247045417 +10896998570137840004 +15502606039934852388 +7033951818081698165 +14101035093150858 +5185145744050041358 +9229891716704907651 +10856473307675892765 +9398677063687423082 +5177513308798003396 +5528062368493082555 +15290243424635802713 +2624475535891390882 +905701329305354740 +282854825 +27638084672297628 +14108981608068226475 +10102479914047137977 +15288269236731526721 +10909696619229288611 +1195868721826576159 +12179516664601930102 +13513229138993239631 +7621890105505615476 +17683444776638837546 +5791336289220390708 +31304323701672144 +9144224424511693442 +15291935475760897133 +11060132106814300583 +7835758378552550344 +12170437818322790738 +5081553090054681255 +13105026261602753139 +17610426109080265577 +1042835224932605771 +2755882956846860782 +17007720368053359731 +1873618536329209909 +10798247691786412142 +27920101074543272 +10161648493728304478 +15475002871350891620 +806094441 +3489683241489686049 +1873618493337395422 +7350766314471580198 +813827729 +9762862652461309392 +14458654042895550534 +7402940406922555545 +1317734103 +13456106549468218921 +1785514032559831444 +5124793967716020123 +7119681633317576152 +7033105743079014737 +775817183132217907 +9809105634009619465 +4654233706028225975 +1943289763710386744 +10170797497109460245 +9144363919119757818 +4069792389134697003 +17015590480626129273 +17900666026387520054 +5992475915723433432 +15291089443750044449 +11741165539085598282 +12207475163967735811 +11485756211052242557 +593494716095881771 +5510538272098552868 +6994666403407274991 +1893705980999919690 +7139605627494662688 +15458688062229861547 +10275863795921803159 +2147544210029353939 +1254142856655153398 +1197790757661994342 +16167876637800096422 +15228101296501035018 +10192709334864587944 +7806125477758378248 +30458205707177277 +10862662145130640754 +8308743801508346373 +5462796855429638575 +12165677358712778103 +5250643148704407881 +7300765473794753402 +5123595923779442451 +6225729497787012353 +451411467976 +14264208198271044335 +2284519691097413848 +16436648502583691582 +6926605910252519566 +5725098295990896078 +1200046897482714457 +5688428875584724114 +1625764251077799185 +31304332299022581 +5379748283708220646 +984791040419829250 +1254706859367147866 +3187423081934234267 +13887941373343179232 +14665089394306645 +4495142108700873768 +18199185222634703048 +1574770455138428222 +1200046854490907846 +18037510894118003198 +10452652741081261606 +7138759552491979260 +5513226627161854818 +10769860432633934291 +2624757539397005006 +16713466648373324957 +836087973174996117 +17950507425543513910 +1841866183142171704 +12143085451635856412 +7087765756552610280 +13960390059206388417 +1464040410663054913 +16886908734816455950 +11849360870348231806 +5147552749501749763 +16833730410848475369 +8267188650453593014 +11601522788719082004 +31586254122993415 +13814786362066953451 +5516892844697260918 +11464312353041295931 +16260410401650074350 +11217171949775506656 +9870725055149400 +8614935460695514266 +7449674879408295947 +6153071746414889317 +1007582054795451171 +15893139640936114272 +12698591854931288732 +1464040346177268033 +6365225410148313771 +9870724566682235 +6925759835249836138 +16101078595707163364 +214958410356 +14170810794691998423 +10196949444845310257 +11663374049455332268 +9870724570548278 +5246976961264184263 +1971464534717633742 +2023481506700553067 +13819014391605638 +11991029848286045658 +1413046550237897358 +12045128095674875830 +16035655232454139647 +15287705229720231149 +704594474033106776 +10594427319500549146 +5997942644981785749 +11444047968489452322 +1456932613 +8220694992145759686 +5520804745657785011 +503000621903 +3735453693364144662 +7032259719665484089 +4749747017966365817 +16874641764919940993 +18094160539292144306 +18332373195682890873 +18064302014949692608 +32432337723020718 +6640705649442567052 +1517763483834530898 +28766107292141781 +15345296219882462972 +17628330231370957110 +6981265923726115109 +1873618265481692666 +9870727101708069 +9870726101628559 +9870725101548905 +17818300676912068698 +2448987358039198314 +1357540577836544781 +2175836266859144622 +15240688955519415392 +438514825232 +17298949040800340778 +9260690873320293372 +15289961369540974490 +9870725109282185 +5601007295916617615 +10333839787251272434 +14490647810018078627 +1987905403 +3674085725529248549 +5736798876179328127 +3324580952041271708 +15290243377344686255 +7193419565965574803 +10505832651350293834 +2134311698688717736 +10916060929228305224 +11889216042803471125 +1578847602777598897 +29612182293668473 +825605291742283974 +901973780138899584 +16916423072427626836 +3212279 +16911052854443793658 +1621783695816221835 +17592510880283254855 +31586327206127133 +5681860762241802012 +7078936 +9177782870671168177 +9991863360696360464 +6584171493541156997 +11234565534460362095 +933515180788300296 +10945585 +1198918814675132386 +17434969792771857848 +1873618489038084344 +17612253793079284224 +7706831487936632848 +12973423928010041056 +17988623715793909114 +5303047082544935795 +5884848073173641570 +6148990677153951830 +1108021039571082400 +17995655171867630416 +7990307559300470808 +1814401564637751273 +2625321593698127666 +11453444980597415278 +9870726659667708 +10441350570743960815 +16598074354033633501 +1538131744 +12911947907506780583 +538052075 +15132890527805484066 +5354604872597768495 +11127785578452640205 +15292499474173609265 +13625726347719300414 +5250643251882708416 +9870724667241604 +13541690364288507184 +9325309112749469961 +1817732079526155103 +7084442118849121803 +9788151191380839819 +2837193507577557395 +9870726167361189 +16887297360196694004 +16436195824824426869 +8907854023311054807 +830117584279202409 +545785363 +5835546371351185422 +2931882945675402225 +32432389312159232 +7086919733139079632 +14081868407518536575 +11013863376993409123 +15893065016634257090 +1468270630909270832 +689774607442275409 +6045168024915103970 +1776768894907475853 +10371546086428711649 +11242784033690500554 +471134570744058163 +828707506564524210 +11346717579767847815 +16847259624441142227 +51409397999492240 +5245848951540882462 +10114786526421937235 +7299073375378539326 +17085103321639836334 +17305802221890839670 +27356081166643921 +5884243119797134841 +5943456268995742163 +16385508504220484963 +15288269284021379505 +12163644973383641230 +9749929699511592634 +6929726202219228805 +2469864005807850379 +10178192978388138148 +1257299789485714665 +4816595532269378480 +13226626061117033227 +34124418943289960 +10341335524252471494 +16992843892644409093 +14426668629872876431 +425618190779 +4082933432107482250 +9870726713800447 +2300274332096877219 +11285429530688580047 +15291935501556787484 +18214648635594907606 +17419818910382755497 +9870724717507760 +7610943862500247547 +92144851 +14375674833933518812 +2907600217262808864 +234824926652082278 +8964955323223988141 +936899412012774394 +7065794724387506409 +7257145821827573405 +8191639813112407933 +9870724725241040 +16414819240624853985 +103744766 +2345279645596404145 +825605278845653873 +17236419517966919456 +17572194368664520948 +15290525423842124570 +14570716054294390325 +7753172856361937043 +15777882018325688701 +648227029980762803 +11847668771932040020 +5304739198158524035 +15627349887169483984 +1392560304711995915 +17093856870738045186 +5683634570943606785 +1836789862098810706 +3878613918675452222 +2625039594491746466 +17305728453583458641 +10814735609921474337 +5515200746281050572 +10576074684958974318 +1873618476141447498 +16879729049192853322 +5410957023180117175 +5461950776127678575 +6206321733762956151 +1032570665458284902 +10608171886705513941 +2020701792127226889 +17173735689874511422 +2440981222361939970 +1976971540241660817 +28484151076414189 +16409823259361302726 +1359796661768830464 +9870724760040684 +12293559540496671931 +6945390077869178449 +18085288875033705344 +7867731145761114084 +15854517778466098361 +17089062570396234550 +7142560837383494667 +210659117411 +8423108281783225310 +2846721623123827944 +6151661664400911324 +1522648593587321202 +13819010092311738 +5512098540056155130 +13735950170324146939 +154010931 +266042250213533042 +15419324667599398832 +15793155004788928 +7353733388852134869 +5332958112102954286 +161744210 +2789363542978673012 +1735084286622324363 +15132199491175256891 +16123410282815184273 +29365482965786881 +12451287859908144770 +30458188511269732 +6074624751477803752 +13172383304428306285 +10746351303661081272 +477207345884 +669517405 +6747465434077729718 +8185733200215615630 +3416792166407883006 +1851043416503163228 +6313103591589043488 +12605821677220424263 +14262234036162687553 +4757044588448409970 +434215533709 +17595247252772900940 +8039763375030275799 +10652362119075606358 +2188969875 +30740204913503498 +6097847786116484470 +29612220986186533 +6309545861193421814 +4070254453074501538 +5995296127039983955 +738827357167965050 +623200902201560216 +18019354998902238377 +12875308616153829165 +10093801156340109473 +1413892608044640836 +700756028950 +17256118064413634749 +1873618527730602497 +6205475624366966872 +13326330175687431367 +6538234364472141256 +1042835216334014734 +5352348780068092137 +7159469842264442639 +6151742360362429760 +3251422733617619498 +211480374592104257 +1873618484738788192 +15287141209812322930 +14317912644329024107 +7243300010374620622 +6926887909458837652 +9870724845106455 +6050238105326667062 +1782138208481918484 +9870724848973104 +10003958229285166953 +1575334505140278007 +10803158541742986381 +8856014169564844253 +11722969585197589525 +5303047078245652815 +15290807375757402925 +285938472240948677 +16106595406117497945 +2625321589398834750 +943441378039833018 +11043988872620371482 +454753818521654404 +2158545539090371628 +16743861907557780535 +2785415304742906975 +9870726364559053 +239076751 +17975145418526561367 +405888403808595006 +9870725368346065 +3511510786883335310 +9870725872252476 +13577317620364747645 +879419217316573271 +1358668621953051835 +8457723779546819226 +3397138837805751716 +9232993931527090594 +11522322727784813996 +9870725876119106 +13705876817113268870 +2477934625430792024 +12375384733446267569 +15411231786988352704 +16530489490799743677 +9768391667994817265 +13451263186146777983 +9870067407650117745 +9870725383812661 +9870725883852363 +1305418630305697926 +17464068196043337813 +2420599844130600271 +15289397306641224762 +9302231339463752949 +13946693756345591172 +17016498717541028597 +882742211615939414 +2861086850443976156 +8275768855680273043 +15287987271918359712 +9203109967767620439 +5245848947241585510 +5941482119783986056 +15801863628634597243 +14491088305759139751 +32432320527075555 +8093487987437223277 +16518567576671371784 +16150373108310960954 +15441701681699888751 +17441243845162724485 +5618598359984853771 +12555384466454680178 +14755685565243411693 +7356835239289712419 +6056466444888987528 +6043037560904755564 +1873618248285771858 +9249568750854359109 +16644906232966620578 +421318893363 +15290243403140571205 +12704210928514573066 +14289589277711880857 +17998986804592202540 +14918917774726740920 +1945545830446735752 +7032541718871802175 +5352348831657259254 +6151097721875427006 +15942320976585953285 +10592171257064861011 +1944417803527601130 +18418331097296629649 +2148672314332360954 +1873618536327942261 +6981547922932433195 +1410790444810395465 +13732264254399588246 +1575334556729431230 +16113243540925199732 +812582536 +12802363114501780857 +2057911839619746536 +2842209283295817129 +816449187 +16881421130411947804 +14952345875861151773 +453534070979970548 +820315841 +12105365978396311154 +2625039590192454745 +15287141196915679153 +7193701565171892889 +12803790934151422227 +11040735009915081871 +1324222177 +9626026310975778926 +18276979675029778345 +16632567774389485666 +5863303970506825882 +2592039302459052861 +15865913240105800752 +1338485821429345017 +845012100688123638 +17063888741996959484 +15333420168733738931 +1920098384191843898 +7270258020499872359 +9870725961184871 +15287423183225435899 +16548325572102217139 +8854886129749067765 +16042367680760927329 +12116505348047923706 +12982659031513510261 +14282592246431764165 +3660444556051220552 +206359828226 +3244917214335741039 +2165193900450859300 +2631305799725115551 +1416994874456044135 +1680441898321850740 +15289397358230387809 +9870725972784750 +6425213859614952281 +2614962469219757385 +9433084718019669779 +5695777959819620403 +8634458731554364423 +15293063567167273174 +8487494977067839337 +2625321864544390780 +14757391685456711640 +7562235574928625080 +6926041886045307004 +1214077033067777437 +12687678863684407616 +1466296468800885180 +2359101344 +15648355766261540365 +14101065187087535 +5490451758066190184 +1837917970701113015 +14428481166735651529 +16427701888690905163 +15288269309817285389 +11468328372673850805 +472908055356 +892741896583008559 +6816736568880228820 +128577803095511698 +8058131735589238080 +2322094241237638991 +14142460462794626901 +5184055445716344208 +15880411694932303330 +987893233748044154 +4261220598231282522 +2834720242980697835 +13145510950436552032 +7087201732345397718 +4187198287186905499 +9416081289824921846 +429916227675 +8533768817076498866 +94733363965660395 +1846710025921848441 +6004033488508295201 +265196235397338744 +177074633169446117 +12562581932888704483 +12484855343804124802 +11228068159576085725 +278216257523103965 +15331258472004071231 +336260399042863454 +15982084501791860714 +8768448353528396165 +1041143117917808757 +7299355374584857412 +17204143209887718458 +5832726134240119548 +9870726026917497 +12807983216407613632 +15292217492164604713 +1198918849068363603 +7243068524281019172 +10335352415540634371 +6100103913039400755 +5888466934314576875 +1361488794577103604 +5981968545310976748 +2786543318764245987 +7106783947908863032 +7892429594987485301 +4414130199843979460 +882239368446619335 +15287141205513023105 +9730290476299404698 +744727634942123750 +16373475007148602381 +13727478633331583422 +5566476532828217367 +2026931224512118639 +4424614817609379159 +28202074486411483 +1873618458945533381 +9870725053904208 +5638559339224459000 +2015038418678128426 +28484155374464211 +12220200977334605291 +1785796048963516705 +2625321585099543171 +15291089473843968181 +6648744653342782406 +2560875148783072651 +13880529192106527950 +15971920874548505578 +16114328775591672411 +8255493874348204240 +9870724565463985 +9870724569303042 +7946632537211284976 +18413392018082037850 +16253215886084282993 +13641009728609805264 +32150372909865381 +1575616517243231983 +9870724577060546 +9888271701197484448 +1414738665851394387 +15289397345333755859 +4844858461531359594 +15292781524969083672 +1005889904790015880 +7192855541758362241 +8356702227516364016 +17016262517490988985 +7882017128501693644 +2414921975930751972 +481505400181 +10164317815380518776 +324535754122684213 +28766107290901685 +3805712294748828861 +17532367729421990364 +30740252203362965 +5135521648828821024 +9870726100383373 +6152225714402760487 +7926206413824877171 +9870724604130298 +12568193962150077115 +1256116924183966220 +5726358067385216701 +1627738426084183478 +6329175104747750528 +828707433480133115 +1873618243986478598 +16075154211107503 +417019612822 +7354015388058452955 +3559710984224970153 +15292217543753754210 +8259442065294044348 +9238115968646658788 +16270401397805369503 +1788616212990212176 +6979855824516219119 +18412545943079354422 +13263909077631911310 +7867619042724896643 +10918615408108782387 +2624757569490927376 +15292217500761932532 +10168145941697075930 +747201041967833095 +16557244502443900795 +15287141257102174798 +14128504392603817662 +14478830953307512920 +17122229925258209906 +7730580451687490193 +9870725135103407 +1873618510534701324 +9870724635057342 +2199921451254364408 +900613183349464722 +7192009466755678813 +10372392139936176108 +5301355009924597815 +14161425405569669325 +830963573300875839 +15195129902213830725 +11779159910643427946 +9891829215153252116 +12579547732752152949 +17639717819159158615 +8396161047500239797 +7293621131330262180 +13437531425391055829 +1873618467542865379 +13915739326545159548 +5419723348147842908 +4737459464942990059 +2625039585893161756 +2517386234133556844 +8211561456005050806 +7141015670816309833 +13472254491101634739 +15335585288494084129 +6206453534127766646 +809714369166862126 +9567595420478685549 +10375505326586554578 +3876075848434848976 +86851854170222176 +9870726158382753 +3186488476490140849 +11974217323296926510 +29894155706701788 +10939233345785958245 +7298509351171326764 +1349355141337064840 +9870724662129780 +13185656046397123071 +13819044485550100 +15294191589787113618 +540673533 +783806437914459929 +40633441 +544540163 +1040297124596765494 +533209674703201778 +10066835850599877655 +7310380000262572928 +48366720 +15848937849825401368 +7247515555231957784 +1721872961788860161 +9941335085727488243 +12318365723907460577 +1575616504346602313 +6155327937823510394 +16547637318785656185 +5991347936094063247 +2180717673216301815 +16876908885164894748 +5197393238740130895 +2060126091 +11076095979391444264 +15287705195328393544 +12909001140607609527 +12916838918575844092 +3729679701517145192 +14101060887799451 +4272690297183482084 +527486648242027505 +1517854327638746603 +468608755059 +5724666033455971249 +71566511 +23074330386847099 +2108115793152856544 +571606589 +9870725200836035 +16613314593632180679 +7085509633929183642 +9387385422854561590 +18062611000115542576 +10044825009624989640 +204346183240994675 +1873621029804205900 +11076650717431286428 +30740239306742921 +5729892527546387031 +5214737420442796133 +15610206458805968887 +8170500022628586562 +5724665990464151016 +15287987211730634737 +425616950188 +15043322265989681047 +7584167588911214879 +11202772131483698915 +9210776495463544308 +5310072653704533472 +9870724716262562 +15291935501555545903 +5513111116680029772 +90899657 +6795216411028441645 +605155997307592299 +13911758099601515080 +9538288095937837891 +13510714938033383957 +8710197087773595730 +11451188849376648818 +5622264581818291040 +98632938 +7246669480229274356 +1022233086848161753 +1783539956433835845 +17719087608558077588 +1829144644315722151 +15292217487865304791 +1873618519132016639 +883931522750048897 +2790611964829325117 +15273886180936150700 +7679094872898478438 +11839796029187966421 +7452710325133122767 +8302145608908743576 +15229130797575586 +33278386931190682 +3374073543078646092 +15290807410150613038 +681411650367476301 +1873618454646240570 +7353169364644922307 +5274658567287693905 +1251886678143287887 +5250413499738689729 +4948502330299609588 +9294757478662489476 +5412649095801821699 +5357989060833073869 +4029075847290503284 +15292781563661596623 +2373415502940997885 +15789620042418447438 +33560403333439317 +15291089426552857698 +12714353604997498470 +6972140976449871559 +4985063574640934274 +5461104787107352349 +4844858457232050803 +10807720106654986167 +5246976935469649610 +15524056368343437120 +15289397341034455439 +1418275848750644008 +15569445779728576708 +280569158667935685 +13525196865559989745 +10264533455025674978 +6098975825933706302 +16998920198152598663 +520197909170 +6022410655933540631 +5462796881224288745 +15350609964076971115 +1305418621707119655 +16760371235082414086 +15265703632663230636 +512927934363034889 +14512892195233090240 +15293063506979530687 +477206113517 +15383811409788483214 +5445039747279380524 +1254424825767741513 +3454339727910328259 +3411546352286965107 +8484110737244756946 +28766102991619137 +10157982332082726212 +10265882208408841605 +13350256624432264488 +15804734059994287650 +7352323289642238879 +6926323885251625090 +3738605320847120869 +1873618239687181369 +15229746926250508266 +14202477166402816524 +13068860251950947703 +2787671392973232277 +14383064393410207 +15397078572045061171 +15292217539454451361 +16876615841046071920 +4290392761421622375 +3103508017812937759 +9142532373385266656 +195298665 +2530739313276357869 +29612199490961404 +3313969587429457161 +1998795749009740651 +4718813938835745177 +3686719073257024460 +6244211011463030259 +2624757565191640048 +10142017334126539401 +7425392019208218255 +5301072946231255938 +17531069790818611926 +72834194634599895 +3452614492788441376 +7047658367535355575 +13304992831046310781 +15291935445667114819 +6073354836911402486 +1873618506235397810 +1777332863227606161 +829271474884669808 +9827020170334252234 +15292217474968657680 +17119958815989321573 +7087483731551715804 +17943317493202186433 +2487491354099451938 +1231566539725152778 +1467424594599043017 +9701915376305133202 +10223260478366373909 +5992475993107222787 +684134305183501488 +1597536137780991349 +5677488671088193058 +12481510747134635666 +15287141188317103684 +28202078784483550 +2161929761716263352 +1873618463243575063 +12595705955698832291 +85348920764927966 +18319050357371595223 +2123790068807115544 +6817300584488774003 +9870724855461183 +15291089478142020376 +1464040371971904405 +28202057290483818 +17003208088413291990 +15292499491370896646 +16639527471249449393 +240753055670 +15292781572258935706 +1737951065 +3530088522862455156 +237831565 +13001682132658844143 +10256539891197956478 +7826763666385419313 +13819040186255489 +10906513600515678967 +5941200103380504610 +6156737968247081019 +9870725374834158 +12708454043691198304 +6206603737267320586 +7340769052744553614 +28484073692729788 +11888218815509961896 +17528419486886932570 +13298200086887015703 +932669144476898919 +257164694 +5291992296855454460 +6438771465219696037 +32432363517643069 +8419202917483239035 +11740202404159819269 +8794768896894249125 +9870725886473806 +2107042492840544462 +11704293171416475637 +17939922298746914454 +343894602810274234 +5461104731218923577 +1218373267405481448 +15288269301218675185 +14584406983734023062 +9236423921819601827 +6980983898725220633 +464309455022 +32432320525830808 +29048140890518313 +18413674017288355936 +2333422893292263311 +16900509547302170113 +904009213691961172 +12477568711375600094 +16825842199654130542 +27356055372116136 +4433594776408690938 +6368045642961455203 +17165264165777323224 +2235484279291472450 +4319853510795795157 +7612623855345102265 +12505494035987835424 +291964354 +12368976542711364355 +15291935497256251893 +31022221317191429 +7884264785446971346 +5299098809916147895 +15291935475762283794 +11730882721800406972 +16086914584828582611 +2676033356038080726 +3787277807956750136 +13518427154325117247 +5181568479621180262 +9870725929006682 +14665059300503083 +1592459872626102798 +15287141239906250287 +2307590044 +1873618514832722762 +18319050408960745173 +5251489245202422703 +4910402882675690302 +5675796564074649610 +2315323293 +5522822691400468689 +31586288514966543 +1839892008135913722 +3023824601817764850 +13480327489607838624 +819070647 +4333912697331658601 +12766279949545134633 +8899289012997605676 +12737110686819630954 +1788898212196528533 +6980137823722537205 +9499007335791276921 +2625039568697239025 +1873618450346937869 +500321887171590967 +16968560352284787657 +5083610059568008282 +10381991660857548347 +3671829663092317954 +15291089465245378011 +17741148982223462791 +16947058063559829853 +5782296448490277255 +3082518495917122501 +13725680859840136457 +4908086700238446757 +9498972570047941864 +7562235617919179665 +9270530919791023078 +18272579812900629920 +7086637708138185156 +6208295861479424733 +17086513425149157911 +12379727685094366931 +14526911150648746957 +12986607299843201436 +10697549361579045970 +10800972690247275299 +1580350686246410457 +7493017085503547255 +5461104782808058351 +3875793737451598411 +15289397336735171647 +16952214309669774203 +515898634280 +7510134793301600303 +8099428861213887120 +848307201366768403 +1776768899208141864 +9763237054719266847 +985919131826140223 +12432294066686542879 +17620422748678285811 +11988195862648470010 +3225820544776563250 +6155327877635776807 +12477385120395893332 +14101043691871308 +15287987259020486778 +12160601063464061843 +2436256590267684100 +6714357502576838275 +11134421182023758190 +11293126244330058414 +6616883720368167294 +6231494632610358031 +2624475544490111248 +27356063969460916 +15291935548845416047 +7247797554438275870 +1763267035865825489 +451412824889 +4534407021717706700 +16315149754281704661 +5299098861505286928 +29330208881922207 +7892758634479563225 +4995920145560194956 +18445690135630398097 +3056501639559780839 +14253319426033740681 +15547163175475571686 +1010977206260283964 +15326223367111451853 +15050501593181466994 +8753420868852802775 +10585603916845118167 +31586340104136216 +2624757560892350328 +4500072201846789315 +7085791633135501728 +5778348231748498817 +8421573517916592728 +15001411161533992394 +1873618501936096581 +8084188025159564600 +5675796572671985760 +6587273635278964951 +18214366463527052110 +9206566035253170441 +14635636828980931452 +1992870723794917213 +7596208623840214071 +7034797837196132748 +16624412216295756032 +1734238258909440164 +1001275971615526891 +6446727831346951404 +1873618458944290310 +3818332295662291220 +15290807392954682974 +37425365820534149 +9870725052659020 +7192291517551149679 +16332192295665293361 +15291089473842725767 +17089062596190870201 +17618315173833491268 +236453761221 +15547936041265488639 +1490523035965615790 +5459371768119118177 +12060386507163899458 +7141297721611780699 +14497144097732312669 +13819035886962123 +14740971020980805303 +17062770692051184781 +9049684100898775970 +17132313306116997586 +15672814220248828086 +33560386137508589 +1036600671087302875 +9388513432576593803 +15511130003875283 +14054554693766094791 +6443383230379418258 +16795611039498001510 +8250235334236778128 +7353451363851240393 +2857620483057345761 +16362713292935870919 +1148207005044198169 +7780639371487303093 +7719447182991700697 +8404471673931509112 +503001995804 +1873622689318653337 +3050905687236563498 +8894776707562893713 +1966081911 +18411981918872141860 +1275246500367385799 +6979291800309006557 +1586548794960076829 +10935036893209178716 +9289441360304164999 +15917416551048097374 +5739422628532467591 +460010171510 +15287987246123864201 +9870726599177971 +15291371425759172133 +17377565341394230067 +3304165682888796509 +6176793342054590957 +9870724602885106 +5608434580886744304 +716962818556633689 +10754901039937762996 +10588505013734949462 +18158855396760107600 +17467452358482671721 +805679481430156077 +11985907604016014139 +16645272733671120041 +14105372412283335326 +13398747230802290291 +5894178554473765536 +208389488011651239 +7140451646609097271 +493028836 +11785584461689546834 +6617165672283454388 +6523529902727317410 +612172374669203008 +9870725126124960 +10028063380012217857 +4320397392167458716 +9870724626084901 +3745929326945069525 +18164427008748513351 +9870725129991590 +9870725133858219 +5301072929035342615 +15287141235606957861 +13513662561522422906 +14103022503158179746 +5996988182465764398 +5463642874544068429 +18878876897068648 +6641851290728750885 +9870726137804442 +12321859 +1410790419015879441 +6230907945780005775 +16188491 +7246951531024745222 +1873618489039456343 +5831598146013445189 +2203332280514793276 +988457223562161505 +2576363817137868468 +15386425677266498633 +4591871055511556643 +2524121012 +15290807401552034921 +10079827122923640285 +12452415912620738102 +15287141171121182876 +1873618446047658158 +2625039564397948257 +8439263316645794980 +9835753483105036068 +5780604350074063662 +5246976991356854895 +9870724660884577 +9167533155582350669 +12922148029686173160 +6663710090192704045 +5199085367249093514 +39388250 +1665063707592122525 +43254899 +15289397375427686874 +2200794175880977610 +1937047112788290305 +12495352915243135137 +9236391087988612135 +15287705238318958169 +1413046558836600527 +9075264058323595053 +619982431487934542 +6439903805786562544 +16149105318148966830 +5837815419166667108 +13337610262836755829 +18332566496608469021 +554894889 +10204651273221335639 +511599328432 +15293063541372759141 +15648117512054992613 +3459957968470035902 +4926665174423137255 +62588045 +4109277956412565349 +12165677375908817786 +566494773 +70321309 +9314220518757250670 +7406197765746855724 +7246105456022061794 +14101039392578601 +7475600315276536678 +386372167260644559 +18181287661796399861 +14694978023916591945 +16125497538611985069 +15290243428935230012 +18241684855292456051 +447113553532 +2624475540190815713 +16991151777031025476 +4029511590809123829 +550243203354865085 +1837917901914782367 +15293345557775020962 +5623170421104780631 +1847659206774034661 +12322808742938299982 +1674429355684161082 +3188833133853149825 +5875369286209378897 +12440766651167042482 +15122676476569914237 +8911564062348428920 +11286125290818718833 +13252643833684964574 +5725098270195138249 +1841584140944158844 +9870724718884023 +11134642932340831463 +5178673268998813820 +5509410163496391237 +9870724722750652 +1873618540628625013 +6749561538592207161 +1601374005 +11224396434830550654 +14448472746991231769 +2749504859761682264 +16447956571742297230 +105121038 +27920105373975512 +12560054189261408930 +13569277581708578531 +15290807453141184549 +16904751357243768697 +98667066926837095 +11636885203347448746 +112854298 +1873618497636814922 +1732546160493211156 +13940397499392470553 +9457728271880906132 +11244959727155953357 +4551751037217697704 +7721599186180258890 +14409153078548392620 +2743611323352304882 +15290807388655402106 +11666939698674012885 +11091955386067869733 +9231301871802144287 +9031918278946141998 +17785259896117529357 +232154470042 +14428481257016073724 +14430173321040515288 +8031770806726111471 +3213959497729525330 +11549993211552158601 +10364366638615367834 +15485431947535007791 +15293063592961928044 +3663640078016191456 +7626335208599998855 +12895157156263578670 +18003328951017806414 +553502027104594854 +13819031587656602 +643827287 +9390205565386056631 +2018407872864076421 +7351759265435026317 +2558626525887402556 +3813668295775109829 +1693374133281705499 +15287705225422325397 +32150347115350256 +13906216870607917862 +2481036767168570402 +8556101387803651131 +13728042631743037361 +16269555288410840275 +5991347923196210513 +15292781499174570348 +3452050511573052082 +163120481 +498702704593 +15287987284816384710 +10587083886809725258 +6815044530650421374 +28766124488217650 +32150304123538699 +12427060397753706368 +13665655858125169539 +1148489060138959500 +2821110094405057628 +4312401969277266362 +9870726296336068 +9870724800083200 +178874563616858302 +15282365751401334008 +985747851051421101 +27638097569077673 +2327459513223287707 +2401528341966757588 +88972231336285220 +9403591670014227476 +4892541419319157802 +11075028963510864300 +6366071489450431616 +1844130888301291595 +5299098844309359199 +11949535968354966748 +16368207330985013963 +14577821744833698866 +8880986669644015495 +15111216714117705562 +15292217517959234215 +14383042898190808 +9870726323402440 +9282455518003534907 +4683674441593985075 +3963119007343271330 +2624757543696427379 +15292217474967424650 +7245259432608531146 +2745876376848262974 +17315773073098301905 +13812352317947270478 +1589600004498921129 +5838366543976606117 +11970763333294630569 +15300323962344988564 +10787147896205679143 +12426510468243544797 +2574671718721660685 +2884597244731287910 +12716362136789393059 +15287141209813700894 +4202723174088591293 +2203332276215482464 +9232711936620172033 +145335375240699794 +6050238105328046648 +1041707167918411121 +6996745855548787776 +17781311614889964660 +3629296517427308452 +2625321610894183178 +2320966141234073651 +1873618441748353814 +1198918767385405376 +2625039560098657054 +11065487246536018498 +9870725358122448 +15290807375758770533 +11157193194708541005 +14913891692408483907 +8065904824868760183 +816023356270660579 +15287705277011476745 +6980419874518008071 +1068175371657552542 +6098975877521630931 +7087544213298504375 +18413109993081143374 +17195659149563682097 +6055621791407682778 +2475960502013673758 +5888796315708838982 +13938987365789352112 +9870725373588964 +17600557245052437062 +9870725377455622 +33842419737116227 +15229384447890663 +28766176077355383 +6208295852880835556 +12076020769722998858 +9870725881361992 +11002202554770598947 +15291371473049040504 +8972557000702889675 +619982405694662126 +15524056333951578124 +7988194205078460173 +5784270520318385414 +6056466509376148177 +12139398813938826675 +3298420552526600487 +2844065907833717781 +5726226335806789470 +14101035093283138 +9652506971552833381 +2312694796414818441 +442814248870 +15287987228927942924 +27356055370880358 +2624475535891525176 +29048119395301270 +5448958679877828275 +2528765198457842949 +27638084672424767 +8752346611157835188 +3205882223899445966 +7671164144648523067 +5661738460217414139 +1103892879740988112 +6979573799515324643 +9949477605624325531 +31304323701803001 +9471996129532404924 +15468982935876622310 +27638041680628617 +18412263918078459946 +11415541602622651346 +8354308154123883698 +3425382256696103772 +2235941633512195645 +6366353484357503826 +5996988229755611112 +15291935475761028301 +16039179938593978732 +16096830904992345581 +3441885666829742011 +2150364429944621468 +8779161831851707255 +677101367501416405 +806225515 +15821297191989566308 +1783548273297467731 +14644601523182252436 +13670711392863139304 +14857096484912708533 +15294191680067548641 +813958802 +7341897174243438152 +1873618493337506024 +14377170520674936900 +16148339639238671399 +817825453 +1775922815606867089 +7086073683930972594 +10380299588237216415 +16573157102592731942 +15293909556187707908 +4424614830507368143 +11027859546261964057 +9986779853778668663 +13460904719155880714 +7676326031729299171 +10583135700163108466 +11840792373305960177 +6751981162579317842 +9870726958774033 +1575334470747179418 +7355013769965755629 +15586729198849175730 +7587858966670027794 +30176189305067734 +1508049959548431111 +11358818864338921009 +1789180271589353392 +5681866892062124791 +5526461232746157735 +3684117662718239116 +7247233530231063308 +30458248699120411 +8864982516290625642 +1348798184 +15292781537867090333 +1197790757662115411 +17897281803760513173 +1309570156344593972 +13885403225718877270 +2946293100247654623 +8432231016341464157 +10282260953326430914 +30458205707309150 +10908004576701655740 +15293063524176848404 +494403399259 +1146796961722733174 +17682574712751996314 +5833854247140396502 +16473820935308059908 +9549673313269920737 +30740265101364718 +7802741255131389398 +14472011330252579336 +1150181119864101303 +451411599366 +3836386649570419860 +5938379956551105646 +4732726652807888168 +14119902126930661784 +10920637407696346049 +1883865396301220653 +9870727009040152 +6366353535946667083 +12799904564807233365 +7034233812988920186 +2845029447323881135 +17619012649468385869 +15293345540579084048 +5731866655261662688 +11662233534562005548 +851940374707974036 +6548876554420688857 +8777571881436928780 +10583981719277359569 +1882949436288866285 +15943731019907534309 +7280202453529741234 +18359396230774930939 +1873618544926664603 +17437524563557031291 +1042835233530075890 +12369348373828423615 +1402930939 +5695587421751371924 +18352325013983027459 +1894834050909813300 +4945303718080620372 +29330122900899830 +16038806134117975004 +11510172448171494696 +2624757539397137038 +5515200772074463894 +1803181542485674012 +2148672279939257894 +5867051617488676817 +4989607797509272454 +1873618480440891442 +17464276530231450725 +1098632785037192428 +14947105796677958 +7352887339644027831 +1117188795805150255 +11063795148119806195 +29894190098681718 +14845134934735728443 +9870726551533291 +5303047073947722646 +6844496701510132606 +9870725055280474 +2548691343429360076 +18411417894664929298 +17092164746527251867 +8343160331046252977 +9552920144579621196 +214958541508 +7886367719221110858 +1095239150174746480 +14968685226597307762 +9870724566840252 +15505670362358569290 +6206603754464618503 +14011056227768486379 +10384702422751793912 +6927733980162425015 +5780604298483670866 +13536879421002441907 +16958320889095786569 +1736494368636431061 +9870724570679863 +7731987298600758848 +5734260728554981574 +9870724574573529 +16167901364859059098 +13819014391738647 +17435475042717342283 +4835285760052785305 +15287705229720373869 +1721745878105145196 +985637059534212160 +31243224015703638 +9870724582306792 +3250255263384229374 +15349429445859677389 +9300539241048921153 +13440677118037214137 +13674941621707869716 +14487876837933724413 +503000742936 +7139887622401884709 +13686216125481177806 +1519546477645486344 +5510538216210263220 +8361225737402281569 +11456836916282606627 +8435418801500417904 +3844815958071602676 +5887104182899319993 +13143536835616789825 +3311818028219507709 +32150286927596215 +28766107292294456 +8832806942534941988 +15882855708138487332 +14101030793982539 +15289679310147045261 +17608376027316034713 +15288269275424181834 +2146416200306207900 +9870725101679978 +6153917830015028248 +6762177167581392037 +7352041264641344403 +1413892676829860205 +438514946670 +16841258024844542245 +11571456653042409426 +9870724605506561 +9870725109413259 +1998795796298345309 +7301047468701975423 +15811084091959546488 +5522619770470673014 +15291935514453559797 +1627738404587729737 +15290243377344815663 +8821966780582858031 +29330174490057780 +14425661019905002089 +6366071472254486523 +491783646 +12424343659824770038 +2115587870190170861 +1495729938 +16322655732121355290 +6503203085685177568 +5725098261596563041 +2148672331528408789 +9088972881470517504 +5164964909743173506 +31586327206235717 +16973266762351988143 +3343353 +1873618532030036720 +785983290288972811 +14478577078159091168 +7210010 +10265590453588287567 +6097847725930140466 +11076659 +12522861250800476322 +2783661564013864745 +943759021439519815 +14796221729307647581 +5458848660184635828 +15292217457771500599 +1873618489038219294 +15287141214111738247 +9534594302153664806 +6011633796843771287 +7033387789575389538 +1693059477266126749 +5003353256727048933 +18219329924430326787 +4831153976752021519 +5303047082545080174 +9628263322950132001 +6476237522615217125 +2625321593698258699 +5780604350072822675 +1363756665915190674 +829835524885261028 +3427681545059503381 +13884327378110450362 +7245541431814849232 +538183149 +14095582753139875290 +17616192489740897152 +42009704 +15291089439450870370 +4292955585394667085 +8286625167626748047 +641508468596165460 +9870724667372678 +11749368754253817184 +545916437 +17786951981635888656 +45876346 +3671829615803835064 +1007581998907144969 +15504660649007059341 +7447967604292926417 +7194547635875480252 +1467988623105671347 +9870724675105938 +2147544205730211215 +14506997104484029614 +16225721859232117107 +13200215017988576405 +12849690445662015404 +5565348480114508593 +5782296379703966301 +3106048699458136301 +5541399129527887490 +5197675268039193690 +2061502348 +2561635767687590544 +15118667617839551493 +14694907354799759013 +490104123269 +288673066745536059 +8486084916549195142 +5903201844931996508 +32150295524946271 +11040187364284702066 +72942783 +15288269284021515111 +2009975100688523522 +572982850 +5299098878702592678 +12955191540402382985 +80676034 +18204249488608201631 +9548014972138054994 +7404435491582844799 +5353476789791496251 +425618328416 +1584662320 +4091925291074089870 +1777050838225547678 +1087419898823589522 +3846923558190191247 +10841245920951874071 +1122107760232845628 +7623514941079318176 +15291935501556921270 +92275925 +9870724717638834 +10059824231573429586 +1041143135113857401 +1092418990447277825 +17693599612532637624 +10389574223842917716 +27638024484702797 +16216077255096692795 +5844165784399330898 +9870724725372114 +103875840 +15291935458565111994 +17147223874170866027 +15472099520086567168 +13787094227570270335 +17627202200153840754 +1893141982586099371 +5831548780687668826 +5461950819119624103 +2719347734316852894 +11352367946032894295 +1836789862098945865 +15290807431645977548 +7561780846186994462 +990431398568550044 +28202091682475481 +1873618476141587706 +6158999882278773463 +2625039594491877300 +18156084122812831014 +5134393553123291654 +6103488045385003446 +27920040886937610 +6153071763609698914 +17817804522273651820 +13088295555764994521 +11484609632517964810 +7300201445288444775 +1891731883377444965 +18058417591402761288 +12617306300617355592 +1785514015364043282 +12718336251609299208 +1007582050496295671 +13205377739591856984 +10732766005730172150 +601478743459631119 +9870724760171757 +17147561355486042820 +7694474574468618609 +17372488103738221728 +987047132949602326 +210659248465 +848678344016929407 +14284004833163944818 +6199257289102551900 +828143426470229591 +6288036249833395619 +2525934096996266724 +6864771691154856436 +7042686759039813603 +13819010092443053 +1209011269534884853 +1601401898984883478 +2001615947428407400 +154142005 +17089062527404543413 +7448422111885663403 +13414556888631496262 +7895847238519382046 +3449759276497070376 +161875284 +9944982326351193034 +18094944514036012688 +16100173195167024906 +17085967139697554191 +30458188511397051 +390583673060411609 +5955265978336369118 +15620129963623655333 +5141454965112776222 +477207489481 +1360360664480963825 +878291211892712838 +6648467691684451165 +414687161382302343 +2248112069177511242 +1626046306171505473 +5141941687247598168 +1923122809628669324 +15422169371038721687 +4615085980062260883 +18318407404392095924 +16038494049631275832 +15677962722463394831 +7269976081480177903 +2113895771773936963 +1730289986280648542 +15288269228133070287 +6366353518750730289 +30740204913646888 +18116298252507769435 +13514134753094552413 +5415128062743029295 +375428782799131023 +574051279841749936 +32714349826082764 +2196834197 +1773948726581614066 +12373318798695950573 +4385540065350325016 +3207856338719366486 +700756159653 +6209141854797958464 +1413892608044783680 +2325785816592100005 +6258725573022652935 +15287141252804277105 +13515324995391537141 +3278044478431511765 +4276502127891209629 +1873618527730735239 +791527792311675237 +4195011284014798258 +9627456835212554657 +11084138468834957275 +14666204015190028932 +15720554645710198671 +13964897540691468383 +2428928023963905298 +1836789870696296188 +230045246059464559 +9870728841688881 +6783922830284048811 +16758489801500073373 +3323445275731759684 +7513916585351132616 +9180319043391531039 +9870724845237529 +9870724849104177 +7677136701370927959 +997592477111182417 +12171433886629047194 +3189379975306501079 +8809880404702740648 +14087010258140927971 +5304739142270212959 +12962168919906467380 +104307364886491156 +5677488628097763979 +2625321589398966094 +29894172902759148 +1587560752945838358 +14003328469234435010 +1943289755111940036 +235341186 +1735460695 +7410231591516644825 +15343340529201341323 +4029075855889210307 +5831598077227130836 +12266254898671666031 +219260460469 +1466296524689462034 +17461812064821268857 +8376968584539296092 +9673288774166338958 +14235290684968748791 +5248951110474808944 +1337484232950882164 +15289397349633181711 +15585096757891251992 +18028677426576297200 +15291371494545626303 +17084539250142884308 +1197790749063531595 +7651462989145532337 +16473811078916430558 +5782296375404680521 +9870725383943734 +18004909088861483199 +18411699893871247384 +14087076183407159595 +6979009775308112081 +8780225706573314901 +17702475088433795186 +9098220215894286966 +11977104894336375640 +7595953279436000407 +12821325162865587014 +9183456002463114717 +16264553306258760745 +9870726399489756 +931541147651620760 +6928015979368743101 +8474548068670575727 +15667276471880592654 +5126204079822885027 +15289961373839156710 +1873618248285906544 +3070298320040768799 +285607347 +27356033875642607 +14936952776143106296 +421319034859 +11225812687234998577 +696271947934806008 +7140169621608202795 +9546853192233794788 +4051155569414464096 +2146416140118467071 +14982869490875585212 +6768811986572177428 +1410790487802341854 +10946994120486500418 +5092637850270003384 +297207247 +14665080795852289 +4028507886459108326 +5437205686656571964 +1873618536328085646 +17625510101737609951 +17804304315225161629 +5420640272110397940 +29612165097865102 +15291935454265819832 +8777599967579352176 +12361695702868838663 +12024734172668586404 +14262516039668415881 +304119565331407505 +1873618514834111506 +2622783716920072097 +7835949018194850338 +9944240879247756823 +1900503837079185526 +8153612483832521178 +4959080487580685070 +820446914 +2161929770314984914 +1873618471842297747 +825887260856249735 +435661068832889484 +2150364365457593437 +2625039590192585131 +5151922516166918766 +10635548174517745471 +2534438137508885047 +6156455960443572461 +17051410629291497196 +16484767916133650836 +3880870067092470378 +1551701861793939340 +16608774884222594583 +17061252311616073370 +4128778066777618963 +10354646633646138215 +9840703129105362544 +11077353883404275889 +1843840254970393450 +12748069930671214950 +5197393307525344825 +206359959429 +6364097417622529186 +17477017067182824116 +3614268539832458910 +5782296426993821915 +2844023565049751495 +33560399035500835 +4520162228544748674 +7033669788781707624 +8898160943088018425 +5696907885818833273 +15293063567167412690 +8973926108277322805 +12743235258114134694 +11799732535023920894 +1254424885955617491 +2848264778619238242 +13913370016116444060 +8426014024744132063 +2169081811070840845 +17632680791996576733 +14101065187224430 +18142877345697172093 +450064124585260027 +7245823431021167318 +5745384143842644180 +16874641756321488690 +10469697154609595612 +472908193177 +1374799038194462012 +17793797185333051358 +1625764294068490606 +12388067938964350163 +4203593881757379418 +2146416191707615474 +5569296709751673656 +6779138548876448839 +11530680413558889237 +29048106497427225 +3614281497899393026 +3246774908542345022 +12887467162178638024 +16489629866924987057 +7198059761996361658 +14270141548948171169 +1386219251 +14383081589460536 +12656879248358729533 +29612216687005075 +5875369269012203874 +12270002014675742514 +16881139122607163585 +17620704765081893413 +5484303510948557153 +16892159328283355024 +15270402497188410884 +27638028782735299 +14242931805982318929 +13650504529854073222 +52208545578830120 +6988505136286147535 +15197950006054182468 +9944378727775497346 +4837165038385719256 +5675796594167321040 +11949535899568648414 +1873618523431457534 +15292217492164734336 +11228068116584419612 +2150364417046744176 +5622546645511781972 +1096085160690412335 +305854498940611076 +15291935441369178100 +10798321639179161922 +9005074264763868857 +2964529530791004782 +1626624515282660636 +9942444152932297602 +2364851882646507962 +4009970462785949858 +5723537903358643282 +6014764310326504473 +10819031677130068394 +2786543318764361076 +14313146937930356134 +2203332293412793035 +4062309504826288194 +14377452537078620067 +2219137196199645895 +15289115350425613492 +6589396841525218554 +1873618458945658662 +28202074486558250 +14036209199681588774 +15290525363654505504 +1789180301683290072 +5303047073946483622 +7139323598194672147 +28484155374571809 +755605599842666754 +9459967530639190840 +2625321585099674041 +6153071746413764306 +2501167382413400494 +9852708033352910628 +2529611247666012037 +1842430228844861211 +18266077987870755805 +9870724565595059 +5572365145471913145 +1476216695435703044 +15292781567961023934 +5967789407322381666 +2544766567488425129 +14426789124208021261 +10632388183210081825 +6655536885515703018 +11095870789673563135 +8646973718275106371 +214961183601 +9870724569434342 +12044853605470466521 +14261670016254878876 +1839046006217731769 +13816341447826089860 +9135420176086364525 +15741799161227324560 +15788821327926679641 +2845029541903604476 +7300483444494762861 +494159375523778658 +14607325535292233005 +5565348471515934222 +1775730757008118527 +2598817832672259206 +8331624998514805880 +10166657031755154988 +13840750600836694918 +9714279527212397473 +481505528096 +2573543610120745013 +6098975787241324094 +17186904211624647120 +15598524413580768170 +2728587511316095950 +5991347884505042103 +5245848942942443751 +10975725499142134604 +15288269275422927189 +9553747506685025491 +10569185367028016324 +18441542378571183306 +6882480182072270262 +16871539593087250693 +7718319186166434698 +9870725104301430 +1873618243986609267 +9870725108168064 +10803922177017063961 +13264318614614864021 +9627993464492075095 +9363571204402405078 +14951499744970160601 +27356029576364557 +9087257516001801352 +31022238513243173 +17083693235326683953 +6205475671656958329 +604787429546206876 +4246373952440904578 +9444197008646280465 +6201941198599169450 +3773070280961371026 +5993604045819748827 +14690331310683350236 +8722320941849469911 +2624757569491059920 +14319322726341873518 +12004541073935919741 +10210667886360026497 +3455445740420289105 +3240858195386586982 +9870725127501220 +7418687625812579499 +95187572621070731 +15288833321126743839 +9764083146918022044 +9184152415375661669 +14193702923027245777 +13888074485517134534 +3852143464667698899 +5964807 +9870724635194429 +13325621179313899350 +1788898272384414497 +16912274529230088855 +27920075280174823 +7603297094028501146 +15292499560156114323 +5958086159560417204 +6184760857354129489 +15288833278134929348 +17689646148640055320 +5463642874545458788 +7193983611668267690 +649387783418440986 +5564352154681100991 +2625039585893293460 +6101795994259823565 +3382055312959026933 +5831598124516989455 +7941089080061617743 +1842148156554161967 +18322828492489300357 +13237708544183762949 +9870724654527569 +6527875269586333982 +5668141230723447987 +10812111870465240028 +5780604328577599680 +6153353814405179537 +15311868345861617173 +3168546442372859713 +948517604503788459 +6364097413323243419 +11405246090117385159 +10377197347619278175 +544671237 +48497794 +1731418112078798340 +12318365723907597442 +11505609487802130152 +1910933862240560756 +2107398388291154603 +30458222904615327 +16874641795014006554 +1454512157356009773 +3069894919890218196 +7404223642329751080 +1837917966401936963 +1386146084913761249 +2440135203246593354 +14101060887931127 +8699826802061690004 +13728324704035097366 +1376839428053151949 +9277666686438550059 +5681866801781810714 +7193137536665584262 +71697585 +1629430520200057580 +619366483213242513 +1483455222068823460 +17306856587979067478 +5514354662679925185 +27356059671534288 +6366353553143980889 +5623674659533098087 +4493450053275367665 +15291935544547500225 +11691287555752344696 +30740239306858421 +425617067665 +17228001359505286862 +10019409906898119609 +583337550 +10910702634774575606 +10690761425984450102 +16639546000569156313 +6339566160181546318 +957876230617127819 +8910392170934392617 +5885543820362146241 +7514310611403492085 +5808959654350710740 +15130493023850934776 +1042835272221356209 +15448636417986469729 +528050715439948266 +6313103561496612094 +1750012465928094697 +15530553734630410353 +9870724716393636 +2012231231909479708 +1841584140945551872 +7299637421081232213 +9870724724126917 +8502004638977105186 +17774139000913996907 +98764012 +11704575149126332147 +10490476657714671848 +8632659985729535750 +10447833913966011082 +10110062484662004037 +2372569397843279929 +6928297978575061187 +17617320538155468897 +5141736951422460748 +17439216674871260333 +1142770603949055523 +15290243342952964427 +6535299316379312284 +13515324986792950592 +1606616889 +7264899764736054865 +5831598176106134247 +16873513690709783166 +6097847713032255665 +9306539558694625731 +8211279456798779063 +9870727239792428 +15287423252009396008 +18416812361757383337 +708172349707927594 +15749634229646803737 +12664287547056663603 +11065179658016984404 +33278386931324122 +10339165646853184896 +9108506831295435276 +15290525359355208555 +10369289955208080771 +1873618454646369943 +14579477519496464268 +5577041317152445694 +10302941354694948239 +9870724758926565 +15291089469544807158 +2625321580800381276 +17943881551802757455 +13248148442001002282 +4546096343168740527 +10375505313690039904 +5724391431735027967 +1309180120182509521 +6279040750572943755 +470965687004974547 +6280132046092781480 +33560403333562552 +7459974813222132382 +1645283135 +17618448651057046930 +15235418116004407616 +11883993473603421495 +4123042299099240149 +10427987387505838774 +1649149763 +5923010239074949154 +18108263961901750546 +7298791346078548785 +13061838410030869016 +16472192147589713473 +6624057940542777203 +12164227728125071672 +6284197438710222979 +12904310825997050576 +13499371927381948358 +9935300836733373146 +6361018468021521682 +14353564991132292700 +10586524174966665292 +3490460290412003488 +17255422109221869336 +9870726282245819 +160630088 +12370327100087021681 +5669547748294805814 +15964860133879201872 +7869373097834928397 +5837238431076407878 +15289397298042783722 +12060668519268235393 +4952762403310489173 +328478099747850271 +826733327260333667 +1737017163845168853 +708913316474285731 +5980491615535060026 +15293063506979657796 +15250684691170801565 +3822346788481749843 +7033951787988025710 +16518849648960935145 +1278770520813612919 +16445524565657924809 +11966722661120888839 +1873618239687316902 +2691365739791455227 +1776768817523933321 +17940389225635867513 +2146416174511690250 +13944144563808774735 +6367733725105377475 +15404667579268681910 +1413892651035350691 +10329316755526126314 +8617826180017097732 +15289961343746577772 +5276927975692379694 +14383064393541239 +2244972557975622271 +12426035771138980274 +12228105279427201578 +1962768234876574295 +14518062923925496084 +2158263565678814783 +2624757565191771042 +405128873075753889 +1370208480239562233 +16051417139579343008 +15198232039653779181 +1571386258306059655 +15288833316827457657 +15857885791961706522 +15290807461739907812 +13705852420633668133 +1873618506235524660 +12663211720943410556 +5193162992699592456 +4211214273 +18063697714824955308 +6100103895843613853 +12959839509293383493 +31304250616208872 +13401227900635008578 +29894215893325965 +693451783906863571 +17564433085802826258 +15906738506193987039 +1186099885218360112 +2792885536610787496 +14462545435106427289 +8088377191905781585 +9086129450390083899 +2478171390190773745 +13729170731746681189 +1340781295652596934 +16575900413863751326 +15507970477422816200 +9671314672244446054 +1464040371972038318 +17114220222375349415 +1895398152500764094 +15292499491371046897 +6285543329431959369 +1223976979390990584 +5780604324278320059 +6927451955161530539 +2803649555476918572 +17899548289174300733 +10823606657006068439 +8572897639257885897 +932669187468833493 +13819040186387289 +9870725374965231 +2784845713136570641 +15289397349631922061 +11743586626787086620 +13112992413209136964 +15894028465201178897 +6257879519516576481 +28484073692860841 +9870725378831882 +257295767 +7139605597400990233 +9870726386644697 +13715393363143716902 +7395042519545568020 +8515376930132869000 +9413571558880854605 +11738792369437095932 +2789363530080921672 +14101056588636687 +6155298040667703557 +1665673126098857610 +4654977494911761892 +1441182034339119188 +29048140890654641 +32432320525969987 +2624475557386870829 +16031695996595885850 +5245848925746498412 +10021823291859211026 +421317779934 +14044077120901365202 +17270577646685276262 +1756442695560209432 +14859771242809469358 +5793852929589407727 +6368045642961599613 +7535534626755205824 +1201533247087796849 +4753256839399350686 +292095427 +4408861808311732655 +3101815889301671318 +7770005733242068965 +6926605880158847111 +1042835246428074257 +1185817877413441219 +5572809636517251467 +15471768298077297205 +15291935475762419069 +2676033356038211833 +15665866372670697454 +460070945943400703 +8334363776853885934 +10505850878104849728 +948956379585130684 +11244005124248652809 +14665059300629940 +15819605076376167491 +5993604028623832013 +16424510829738933515 +14291312133784234611 +16095291319490520568 +1873618514832861567 +2137449994706697074 +13899132915531980343 +7540139263596785368 +9229327787077539218 +1815414630 +31586288515116699 +11056615713204276877 +13247733904366117268 +15755410569558958654 +11614883459769840980 +15288833260938995164 +7033105764574495062 +12722344974410257499 +5347608075563256826 +3847505084988745097 +15287141175420602663 +8140646021471144391 +10757169831990812463 +6508490313918594253 +9282299543755380664 +2625039568697370395 +14982682455071025008 +6041909405012944348 +15289397401221092183 +7231170880984722845 +1413046584630010701 +15293063610157980607 +16844726366016706429 +11263594107856907565 +4069792367638351644 +15289115277341254349 +17515242666411574330 +2599235317101563013 +7194265610874585776 +16306038205786625992 +5565348505909147913 +5510538250602233370 +4605111747388197892 +3527355970469895323 +5353476880071931954 +29048192479792338 +12275924320441484736 +11101562706524464016 +10399694839059647253 +32150321319594947 +1574206430930102004 +15288269309816154903 +4149205691847685268 +42646132887018775 +1222848896583407945 +12772761507599693363 +17783567720317593208 +472906930615 +1996547926054038717 +3628529271274153067 +7032259689571811634 +4694804975192714009 +14080227011338462023 +451412962854 +2361671975684946288 +3884265248649861225 +17621561863500597804 +1810817901519512853 +29330208882041189 +5245848912849879463 +1519546404559860966 +9194993331203433465 +7410173966093389656 +6981265893632442654 +1873618235388013094 +15288269245330369782 +11848796824645952756 +14383060094251722 +5570988782373393205 +7138759573987459585 +4399223229716322165 +14372290637101152488 +31586340104267933 +6769611582547697180 +2624757560892480770 +15292217492163469584 +5162541817113620510 +10161648502327150844 +9309587720955720030 +4750593114464544884 +7087765778048090605 +28202117477107787 +17619294665872010416 +7717191086162907893 +13787119239363120646 +10354526296759282284 +9788517128793253127 +8677060819645319398 +17072206346125144494 +4543926375081584276 +11824914510819761991 +7727798225650862674 +28202074485319765 +5885976069999103204 +7299919420287550299 +2509567599504268733 +5034923912583332789 +31868356506506600 +12748394307995591241 +1873618458944407602 +15290807392954817527 +14424532971490583318 +7341897118356350165 +17885450446377522161 +12982659061607580938 +684134257892528978 +17363034096977459184 +236453894255 +11135267201138124077 +6925759856745316463 +8501508386016339928 +12818875419963887318 +1252168741835518555 +688626691814920557 +9128498766157726856 +14879787200419552909 +13819035887089241 +437798135292389877 +1040015035110285396 +5501482065124005657 +1005889947780731511 +5783988478120368719 +32150372908742868 +6366030620467747797 +12213481117926952798 +1996539656478999266 +16522603986657956815 +12137496780435628979 +5996142163351639351 +15448753689159680117 +524496100364 +13059312550143204768 +4638051745953439756 +11844539297855390085 +9870727087748899 +7086919703045407177 +7174625849309226967 +3230891007074313728 +10125537471628393135 +16790279815116313684 +8064147145284596863 +10935693860259700977 +7716251883856473172 +2943693361899528708 +7843398867123005108 +5450820461064635035 +7443582215714384592 +7872981636087095908 +13239681086913735592 +14265336190797232581 +5932495662953883481 +9870724603016179 +15298716422213619186 +17791686135667584947 +10913362918446674662 +2149273943172058360 +12384683746431162013 +15288269253927723178 +2686125770937233144 +5995296152834758683 +5812584653494167509 +7193419587461055128 +1733674170216626355 +16615248462758566057 +7744402555858600749 +5938662003046035426 +1574770485231250253 +27638058876668358 +8562440839455130426 +1782984201801777392 +8388259092415013390 +6020446389059070760 +2887862114674809816 +15930987942864186422 +9870725118522779 +493159910 +14437962537598526539 +10226754407489222887 +11131449859774040199 +12192434948939334226 +497026536 +13044533461222492618 +10864636191164351907 +12750379368847708023 +900303647356304913 +9870724626215975 +2676033351738919405 +4441552753714222081 +9870725126256034 +15293909616375591577 +1413892590847608999 +16653698845341399242 +12428365391986694264 +1041707215209638835 +9572548400915114140 +9870724633948924 +15185362616787929891 +12452933 +2306165990386975596 +1204131931776304087 +1730572006983553017 +15619686604870599371 +15961467973966326886 +15293909573383775305 +11140563429835694580 +15290525393748442382 +2519381704729442078 +10592171188278674541 +6117474854535782414 +13039730140157139067 +16204150621577035389 +1785804421715751130 +15800517529231567199 +6228389264664442156 +9932185568725977241 +1785796079057594607 +6755995712349152397 +10066048840209604339 +17603806066300961028 +14490988199065491942 +12219047056026966016 +2625039564398079643 +1043399266334752914 +15294191632777817421 +9870724653282375 +1873618446047797372 +844100032176793339 +12943066728187447197 +4343368849768076350 +16432418256544553135 +9870724661015651 +6156738015537077122 +5884848030183348221 +8958290849640573474 +7192573512458371700 +39519323 +8223265189353624140 +1667319903300235658 +6636564352376793257 +17424331172825998805 +188186542276165017 +11346153491073744014 +12064293017781873147 +14099248970672773396 +7203140932802195055 +16365628939578248464 +1145939178431530660 +1482883811290919130 +6220141318186488468 +2789363555876800930 +15793124911093001 +109394730842459075 +62719119 +15288269305516858010 +3722579929450429010 +9832674736745753092 +5409828931773997544 +70452383 +1809125803103311117 +18362962200511339488 +7195229034885375675 +14101039392708110 +4131316231599362936 +1818913878670141121 +27638110465830453 +15662744619552024266 +1076049988386843883 +8487813929601029554 +12169253260185967280 +447113674244 +5511645657542432500 +3450350384745373130 +16910942470763255938 +6995388155836000009 +15293345557775132537 +11311918831493920192 +5726226297114414226 +9568441482583609548 +5288140009902852667 +15288269241031091610 +4978071700066683978 +9477584242102184471 +6509730691945355457 +5516046735301620979 +9067166288262814901 +14383055794957197 +3531133647988093762 +7944541974714216120 +9112466973607217103 +4392112055939238832 +97518809 +13779705592650618193 +29330140096976231 +2624757556593186045 +15290525445337587126 +15288833308228870962 +9268584837868511877 +3546638778076971558 +105252112 +770842253709622398 +8773225958283941074 +1873618497636936135 +1497235361463876804 +15292217466370224273 +5831598154610929558 +11962278756907897375 +31586271319191951 +16913966610449133709 +6536459277275960546 +8180059292076355729 +620758607 +5357989103823764773 +5461950776129183119 +5457397661899319766 +9800721942016444885 +1873618454645115682 +6100103844253215989 +13811103675450410276 +6153353844499089969 +5880992462816827537 +13665911791399744577 +17089062591891708228 +232154599513 +6158568107615067258 +28484129580058779 +6179874998342211302 +17944163581103067372 +5783988516812903664 +10187268591481790765 +8957859492011247812 +6364338522051513116 +12751507490346635560 +13726068529822508447 +12640301435078714584 +13819031587797673 +8910270478416763148 +11723476463758241017 +4588984415399316953 +13829667360338960553 +6152225796085980908 +14861581765101308138 +15287705225422459160 +5407854838450711569 +5382568464931106256 +15289679370334916057 +10192709339164136147 +4944392473183547633 +15942884970699436942 +14312300901618945184 +5461104765612270679 +11076225817794002686 +9179644158858849710 +12913795363565885871 +4523828471874809329 +14490684999144665179 +498702821858 +1576180601638432646 +13273748593945892359 +11694336983993944947 +32150304123675012 +17972467101245841611 +16798735162291987411 +28766124488332074 +14380274162401758954 +3067643081556507909 +1296001166564737286 +11731683713072444373 +8663192652061357284 +12481583364853491100 +1465168476275032542 +10189090411923910502 +618429790158798256 +15676270606850007202 +5875369294806846752 +11632771835500451864 +9297437052020078113 +17335756693960733129 +11573430772159094741 +825323228050451345 +13524360487806385657 +3727880716634627315 +17411595060376462787 +5993604063017056416 +9106722151497681310 +4444642754702553585 +439094070223905573 +1194007415201076993 +14620461487359796413 +10694515171064745016 +14153225681568016716 +13942734464598875603 +15288833295332230437 +1476542383467293588 +6926887930954317977 +1873618506234270102 +14259131851433266882 +13603584720092934406 +15288551244536691323 +15293909569084475084 +7717191068967003273 +4490127063637512594 +2392267112159645239 +5831598141714275893 +15292499534361594477 +9789486956897256697 +2625321610894314231 +6155045917120858363 +2625039560098787209 +1413046619023226146 +1873618441748484817 +2850570111682618424 +3665614274517954175 +5312096173677044205 +15289115311734475786 +15292499491369806258 +9092497847511114163 +301070953670201325 +8510103668314542131 +1414738713140154074 +7088047777254408691 +11085332710469999446 +3416455939372753910 +14081555637472418341 +14039400952366776757 +1971656187142825190 +12982659001419852095 +3921022040942857000 +9870725373720037 +10528906628815719526 +18255016883768812789 +16591029761564763845 +15291089392161144951 +1093547025963965553 +11970874915199465528 +1219784942757424768 +8484110767338835040 +17287055941801495134 +6926041855951634549 +4525236812567616266 +1711411343571710340 +17062153896009539530 +1411636476822777660 +1408797445364604818 +12573073537992379556 +1256399000774262060 +2558937682620329926 +14101035093408401 +13641210989408116155 +15288269279723612198 +7370542148830050139 +1201738995898017609 +12255950131722011121 +11569794592615592196 +2624475535891656534 +2791055602702619461 +3144768531629103966 +5569296722649705493 +442814390361 +1200046910379612740 +1731982131988092680 +283116971 +2203050311402524655 +14323638577111261622 +6205475697451600568 +7533100890453585079 +13230141004331490774 +15291935518752976704 +29612229585018456 +2731821718866385070 +7032541740367282500 +12151386029709423215 +15288833346921377853 +4800874258336803066 +4643200963322663435 +27638041680744193 +7034040473057910553 +15502578530275318390 +29612186593203745 +1410790466305854514 +6981547944427913520 +14106161495630947577 +15293909620673628591 +2840809200344840372 +13571926670287531800 +2183358971233780781 +18181080380579991675 +8313711534999675596 +27920101074822590 +9942444165830285852 +6282363583087519706 +810223219 +1094393088070004762 +15287141218411162999 +14603779206648127241 +16870411536075476537 +7193701586667373214 +814089875 +15289115363323630974 +2296491989677839331 +817956526 +821823179 +829835572176506991 +1456297742063309016 +12661099723206581616 +7297866959562555662 +7398819554416005194 +13415695143537635126 +1517290350721525296 +5884848077473195871 +15287141175419347199 +5619162392790845063 +5303047086844482098 +16930902619033575544 +5216457162996201227 +5526448520225897609 +4133663603883989766 +1147642972239774437 +9819715104592696369 +1943289763710652139 +12827636231990300078 +2526227059430873708 +6310847490462325157 +227855307524 +11080738063040996782 +11058493467485887895 +533825633792190499 +764904305988688958 +9870725970425451 +16254908014593323890 +5195701170417968610 +1413046563134782613 +2389164936029947891 +17542946382433232050 +17345653805760007303 +8139593855082179815 +8197562920226738941 +1197790757662252053 +18413391987988365395 +6980701869425230092 +2946293100247784798 +13762033578707737503 +11440253185667115779 +1837917992196589345 +689774611741829426 +2360608673 +8471628142875710601 +30458205707462979 +2174304915385900871 +10595566374135345507 +494403523498 +5196265237615754991 +17026879061622344381 +12062360578992139899 +6152225748794871812 +8858552325788144231 +12854894119326865159 +15267897209188330536 +7912204187237043191 +7813562745038847690 +17305802226190388226 +451411735320 +7792373120121047753 +1756099252980684928 +3311802689905833536 +12318929752414249090 +6860750646797675639 +15291935527350331317 +27356042474363350 +9082058141968174755 +9870727009171225 +32996417817702709 +17179861758519955497 +5456833590401050197 +16113243614009844235 +10706103907963048701 +6368045630063709648 +17176154617760334763 +7299355396080337737 +8477811091809060376 +6049123076685257241 +10558807042125275716 +13764610860437629587 +1873618544926801458 +14457971324883192077 +935489381589477951 +17943317531893567249 +6097847738826887406 +5219221325086663265 +8553630178781126266 +5126650846400572017 +16696307577297072131 +6785332882202956006 +2624757539397263813 +6204347614644020753 +15287141227008513588 +460139451494328578 +15290807435945386332 +3221822110943152751 +2150364374056310647 +1873618480441009039 +1464040410663313208 +14024382242062670131 +13727196604031521772 +12997102390996570543 +8856014186761037704 +2827234676919572553 +2419434238374014407 +18360454966651994719 +5354604928486491322 +1899651054595895009 +3875511751143420409 +2625321606595022013 +440801816299387133 +16593745093459386561 +15287423213318256758 +15290807392953587268 +651404411106761432 +6269466149234815575 +6045857724931789943 +7086355678838194615 +879419277504567277 +16112354652174687340 +2625039555799492175 +17017082289435006445 +1996539699469566103 +15273797639737585011 +5883005685635693971 +9870724566971326 +1497397344146445350 +7298509321077654309 +9946392408365293552 +9870724570810915 +15292781546464551350 +15289397366829229551 +9870724574693051 +17344893487108795855 +13819014391870437 +15287705229720509290 +16474939080039805379 +15510256655233005532 +3933266205784894615 +1445774942907271867 +4166190382674178273 +3117425657839695850 +6293435923465316099 +8088808536782935065 +2052891733976961503 +7247515525138285329 +1520956512368487579 +17772450798554325182 +16113944175589220260 +1457194758 +1574206461024028496 +2789363547278219882 +11076225800598086961 +30458192810823902 +7403331855550265024 +8650921965109600118 +1901711630905657482 +1964967798 +3292988330812139226 +31022324494385160 +1919773413537177326 +17783567707419731814 +14101030794118900 +32150286927734224 +2208983649182945748 +17997565656170650816 +11964228788262538169 +6153917830015169782 +16075175706583659 +527486618148358238 +1476527885 +9870724601770988 +11214563466576464662 +9870725101811052 +4067676013579033611 +9870724605637635 +2171887661434813042 +7354015409553933280 +2624475531592362397 +1837917893316327653 +878573202501885576 +6097847790416052560 +6813637092450781307 +3712382134374649064 +13709513699456471502 +18015051914722294706 +15799201061901459588 +9266209255073344586 +491914719 +6979855846011699444 +18059263614816428178 +18412545964574834747 +7359091387708098237 +14888729195982057515 +1495861011 +9870724624970776 +5567604589840173160 +464715404621592578 +13012951802392677383 +8889230321129230667 +14386655907411858886 +3474427 +6120000845640177289 +1873618532030172426 +7192009488251159138 +6949164228240424786 +7645126008776696879 +5885825849662397713 +5301072929034217258 +7341084 +15773142454203924705 +11207733 +2581508047683783763 +16533453944884973962 +1329348703615392235 +8958039704682959175 +1014586120351721887 +15074377 +14023756403079069155 +3794911047491867335 +6156455977639624450 +7141015692311790158 +9195973940073931309 +2790209566392457239 +1386332156641951867 +15229100703898684 +10759084139937147592 +18347035773045004268 +13488970912136115179 +99231125526179780 +7353169334551249852 +502468769495191348 +15930050148574260013 +15887384621096137477 +15289115294538546505 +538314223 +5727354358425608974 +3589943541717746368 +13939914291973594889 +42140778 +6233070486582072448 +5835546371351468497 +8344402900088472804 +46007419 +8300395871739655116 +9870726171489962 +2737848130102108435 +4000515045253450179 +1038604987489545759 +15121881936566707422 +13063530465455447127 +2488365593734231660 +6144105184579819023 +5462796894122412160 +5726226383096780965 +8437076122447000381 +828707506564772508 +692605807783130034 +15663892287946189324 +16440735815110978767 +14420963297769690508 +15289397310940783657 +490104246788 +29048166685305779 +3306859449907502235 +6152225744495578009 +9941598116620816870 +2624193532385980929 +1256116954276781536 +72686780885315055 +747547798969148669 +1775076736305018270 +15288269284021651619 +73073857 +573113924 +2729219867515446316 +2414921941537786676 +6179473259481992603 +12717594353261434417 +5832726215922108788 +576980552 +11131047426419408315 +15497637354033541992 +16505476999257597838 +6157569943016399391 +296253846918014369 +1256398940586526688 +425618462522 +1357540564940187044 +1410790513595734411 +6282081549489367742 +16876615853944224095 +5687765473224963771 +6205475680255681631 +17825755834712735531 +92406998 +1411918476029088162 +9374590145005437135 +459731853831637831 +1139141272353658853 +14273081993167839491 +7246669501724754681 +5832726151436333381 +15292217509360788735 +9870724725503188 +104006914 +15291935458565233885 +777500619329116582 +5326128019379665668 +8421458967022627741 +11375119844675882919 +5460499803637155955 +7174351089234042123 +12679203983491086717 +1732546181989939925 +6503563625825255523 +16075099944501669366 +1694703927601276198 +1198918823272732486 +8863761891274929572 +10547011333208943021 +111740184 +9304847443081238789 +11626061297668792830 +9901350255127967915 +14046051235721190199 +6153071806601630097 +100641190344216494 +6289513698882754344 +2000014403970090206 +1873618476141711577 +2623347457383283192 +4749944566801393083 +5461950776127924558 +14254502550571400998 +27920040887060496 +464997356536862662 +9817186141037272521 +11225379263765231338 +5345137152041496881 +3775007851104332339 +11457498694881201120 +8577815292222139072 +16741887775542226182 +2537448469784833027 +5515200703289500360 +2543037932670441281 +15294191619879957055 +17921030976248489327 +15291089448048344126 +5886540154394203797 +15897859282581860110 +295544243748735580 +18023392872770526082 +9944700309949077521 +13939914300570932630 +13320467611651024990 +2024153456133425106 +5941200116278643713 +210659379476 +4092873675725292838 +15292781542165262296 +10395714275383920334 +17529134218914449614 +1646659392 +13819010092574594 +6098975847429180061 +5888796307110366738 +17109444329883506337 +13716962709319278058 +8058180228213336140 +5565348488711964816 +154273078 +32150347114238798 +8501508317230012425 +6675940112908698646 +3617232734033427108 +16145254715686922874 +1256117005865922193 +7192110592924982726 +15044451706103690011 +1379320450696169053 +15226013478377757549 +5510538211911088930 +498701592371 +162006358 +5516046829881339355 +28766124487101791 +5139480820200462427 +9301857539287303398 +16560332262221094988 +9930548495207062655 +30458188511515529 +194767396286191047 +15291371442956622566 +18387029559061584784 +890886484313127303 +1406049008505270294 +31022298701114628 +7352323311137719204 +90526560418228728 +16960155082630846598 +766564860927631231 +18103555412365951139 +3094958919380966512 +6313103591589306839 +5881020564595829630 +1626046306171621971 +1806610914977984803 +3230523007169801247 +434215783801 +1683466373829698943 +112135203102072432 +8109847361548532686 +30740204913768848 +29612220986427393 +7783748169000905229 +12016354495582787199 +14085001079417612367 +5995296127040236317 +12524340376691679544 +16538192980636351875 +1014643471084428681 +9936910164818682782 +15925978862159217977 +15291935467162595577 +5410392964579928064 +11799666471627027331 +9843081593884529364 +1873618527730863158 +9448933323123941265 +7087483753047196129 +28202143271754413 +10280620561171947609 +5926033321115200796 +17706466419108552277 +5352348780068359234 +16953342405374329841 +13036754982088885392 +11128347662147939654 +5983746311439277835 +15275296555291863922 +11521995055244401171 +18116424960081924134 +1873618484739050913 +10168145894407475860 +5652661830449524503 +5303047121237721892 +5885976095793748430 +1841866165946509512 +11731126047447127746 +17793973764108343078 +16192053395217477139 +6582750332222920225 +9870724845368603 +5992475971610896233 +2338464757253615824 +9870724849235251 +1788388289715652095 +14288862971683828088 +2679326747979506494 +30176223702289522 +15287423196122329481 +16666663056761384150 +2625321589399097130 +5246977008554293236 +1252168767630168837 +15290807375757654952 +11314988902935506642 +6999798970927292729 +9442785367033141902 +15294191606983307402 +10328470753609137373 +10757572286839537735 +9870726364821199 +8193706259984948328 +3241533047597321007 +1523436990160188126 +6174018547463362432 +11844848603606294936 +12358116816724960392 +12350730930533634960 +17972897071863196719 +9870725376341498 +15287705212524589493 +15291371494545770844 +12851509922494416908 +7846695775617885258 +4093218321690206514 +13339207327026394641 +7086637678044512701 +16049231600033673917 +375393205545672491 +13527189724059475890 +15289397306641509901 +14959880358790309204 +17274252063251655797 +1120928004457589508 +2530175276171416110 +2422004670948205519 +3711115253286063153 +15287987271918624559 +6523806312927162161 +27638127663143855 +6340598804230258712 +1737254254678708457 +15691596642307038019 +32432320527338772 +2782962599897735431 +4854750274074012729 +1998795822094367746 +15287987228926830063 +3327297984604743818 +9581494030986391824 +9598712116745956324 +11286969412412727328 +14586538897092845432 +10991209791798073649 +5832726190128836503 +103743392269820710 +5567604637130041991 +13486365294955410013 +1251322692627471220 +15291935518751741805 +12271803412858234732 +6270229857615103858 +4866975958756243700 +15862097501686279318 +1092418986148126540 +6151097721875664628 +17637786995464300106 +1893142021278753292 +6571996857207772207 +15290243360149020250 +1873618536328208737 +5194855086816698563 +7057822699471462021 +13522668389390118151 +17007720368052374435 +8694854310368390269 +4310109704341248346 +27920101073579515 +8059210156514224800 +28202130375119070 +15290525419543087610 +1809057634 +17299513090802457566 +3880305999894815523 +6299438822014266038 +5317424798022594800 +18143793461179469600 +14120746522787387860 +1198918818973445905 +1812924259 +10255261970529932435 +12927106501363777315 +5566476545725107237 +13576236484307218617 +12972952285743189 +527217511716370412 +2625039590192716469 +1873618471842421398 +1543385872366377214 +6980137845218017530 +820577987 +883931475460447884 +15287141196915944399 +12424915693546515156 +18412827963781152833 +18332619636094812530 +15292499521463723078 +332973049518177307 +1084382915397037987 +15291089486740861024 +3581589705084459780 +17082847207615237013 +435824003277930184 +7192291487457477224 +12965462547964574624 +12748983629090480701 +15291089443749045658 +15788257230633833666 +15610850920120676089 +206360090189 +5782296426993944674 +828425472966615631 +4280732348137559803 +5491579806479560946 +12553987782349496202 +9870725973046896 +7141297691518108244 +3517309966015346745 +12012735189037878892 +16780452227807187901 +3698377064121452918 +15735927946891050594 +10864261424787433362 +17236738792057942277 +8114567754226536574 +15802896446603227786 +14101065187353926 +15289679344540404182 +5098070090331469324 +15289397293744856847 +6922632561930432564 +8820971530649884427 +12569695609956274944 +18005251247539030727 +1576180575843931355 +7247797575933756195 +14336389543970287502 +16436379939763522819 +10351342685416286907 +1951690094360810987 +617000559100831105 +3880024065174221517 +1870189643722080649 +14021752200148692358 +10259276900700983980 +2147953276937921962 +7190869723846421676 +5406444713447538949 +429916492167 +16436032042250550521 +10907429537674631381 +5736516859777282852 +15289961360942650002 +7448029710061606536 +1254706859366175520 +1390216948 +12484855343804403370 +15290243368746380527 +10106194057973616887 +5622264586117852320 +14835085562484363313 +1198248652456811368 +8577531529049752977 +9870726023313014 +7085791654630982053 +5162541838608972766 +6204347657634602158 +1561715782769775052 +10452600916550175247 +13011541759071235235 +1200046832995940220 +16111065514934806930 +15287141248505107111 +18175237612192935411 +1873618523431570766 +929718201372793268 +7034797858691613073 +1306063513052072698 +3235340190086490607 +2553424131400421491 +11849360870347249572 +1917323123 +15287141205513287152 +17848383952448021774 +5218390986792845307 +9939811017820627597 +7559355238254854730 +6222624972888756187 +15664532190584380349 +988739317348310546 +14311736903207618733 +12567175869885336038 +13652397968964083810 +9840703180694623122 +7246951500931072767 +31586254122014382 +28202074486685787 +1873618458945785000 +15291089495338207032 +1732546121802209896 +16848105647853671222 +6741138607599781930 +13126058378656032031 +15593018500282740616 +9870725054166353 +2625321585099805013 +10889818623375339686 +16481554245637247717 +6912144703481340012 +5356297001108187554 +9870724565726133 +3028626790437840684 +9870724569565199 +7401639804423909393 +7353451385346720718 +6120385133579475949 +695707940923656887 +11234554554033919094 +9801641767256878980 +6698767362340231265 +5782296371105504258 +3628204411664146003 +8219340492332677260 +1043963281944762347 +16467764576550477180 +8857574718893084313 +481505654703 +10646954815923687157 +14767825444794821064 +7088136458026179767 +9870726596818673 +969464150649171386 +1256398974979749258 +13936167227557433774 +15183292650242141392 +7564209663952896299 +3636571292134086026 +7639277112358170772 +1239173295203827955 +1519546413158579420 +9339868219275807320 +1873618243986740745 +9870724608259084 +9870725108280927 +7571955500715355675 +1357540556341595904 +7140451668104577596 +1711003895044521213 +417019856852 +2643004945252375566 +5459976730094482672 +1494615825 +575239712867628910 +2207573549973072084 +3560777292679875611 +9894329350782083540 +14665076496679950 +1998522241 +1788616212990478020 +9074135966917477889 +10162787617149555042 +901973780137907182 +12714140372012388733 +9297719094216972395 +1873618532028934013 +2229224 +15292217500762183024 +14468890435140207273 +7352605310344037290 +6095881 +15291935449966652292 +2413828615876119350 +14954941094161559961 +6209141837602185923 +9870725135365552 +14934762739409427420 +13679090983033846917 +9552217677991002875 +7218934611157211103 +4265757568819538343 +3270958027814812417 +6764101962615318137 +2625039585893424546 +1873618467543145216 +1178413957016672840 +5419723348148095813 +1454859013759439056 +4938567614984502778 +12744728034573096628 +13544402356149177161 +15483444638967338978 +4223816177647291789 +15289115337529121633 +6148990677152961516 +10920788264813218694 +5406047229552643177 +15690170833083709165 +9921844627374813865 +4583174912438129946 +329624680433338164 +14005469233666615531 +2785415309041208481 +3530088527161999816 +5780604328577745514 +14055047205356786703 +9870724666258552 +3615988824375956579 +6668396212064965547 +13887458236232774832 +16006502782233109260 +1839046014815188426 +544802311 +1522366577185288948 +12432001886180292682 +2992863866405131539 +12753199597361570610 +5461104800004271879 +6745049267550772562 +10077595329594396871 +1780728070579771867 +6044165583523680286 +6205434785478357346 +153954628474770039 +6460543990695867255 +15287705195328650551 +12930806306788743100 +17951052289351758848 +2311596397202514585 +14101060888060249 +4413263568303106525 +7246105477517542119 +9941335021241977154 +3452332532274912768 +2624475561686299092 +11107255586326716308 +6399946479323214635 +5199085482290646157 +71828659 +468609013412 +4262393995373534661 +1224407839832874534 +8253013595490101489 +15676397510313395081 +4618470194090938050 +434695937666202838 +11007456264328845668 +9870725201098181 +8209526949857074610 +3923952264468701755 +904009217991514659 +1784676295918888252 +15288269262526426960 +9953858474553274329 +3576060792758938880 +425617207943 +15287987211730887769 +14404715884976236367 +103743396567865548 +91161803 +9870724716524710 +9299129159035022400 +1254706855066885506 +1410790492100507118 +18112830070108732551 +5459976717197857151 +10143775216852158997 +5412085093090082690 +882239428633371086 +98895086 +13772155712447139983 +8429383870481837171 +2698559761672716409 +7579950199755724911 +32714319733657675 +10863226143542354478 +15290243342953104274 +15287141244205803890 +1873618519132289228 +3675469967328097838 +10511478011790434705 +5304739198157530422 +45631164175750759 +8371959251560450310 +477658896785281985 +7245259402514858691 +10035088838719777943 +15292499547259612025 +2063913154410652060 +8906482608725304574 +1836789840603859320 +10815931410233180567 +9628263353044195361 +15290807410150894622 +11082860798947176425 +15290525359355332946 +10099245128609918052 +14360870697016451167 +15325436600494472791 +2625321580800512702 +15638758361096011537 +9870724759057639 +5281205705011571811 +5409103899389467675 +8597672046546798567 +1774512720695153490 +10645348217269017339 +16298859552331344152 +1144540856295319517 +14179661435648496122 +5813053462769590085 +7351759286930506642 +5349660425003807668 +18413109962987470919 +6980419844424335616 +9097528007512642797 +1104816004688068464 +421049747515264350 +153027880 +1455946274504314235 +17621658575450945445 +13086328473946711467 +10366340740537538759 +15606586177008781528 +17691343481311994100 +17785259810135422539 +3308269493230333705 +160761161 +15515478115209972344 +15288269314115582436 +6203175300535234826 +9870726290110140 +15291371442955373424 +17205553334892506852 +477206349773 +17498716319787861235 +16525030237164545332 +13885685194831573582 +2572415578902433273 +10649664295314066915 +12911315469544935791 +18129074234833845157 +17723661893545515456 +16142517586844799217 +1873618239687443836 +1362989062738957392 +11255875486607293081 +16744553067770292848 +472638123518407025 +15293345523382047787 +15292217539454710309 +502628324813772521 +11613217769128399031 +6322403941467513148 +14335380142360044676 +9870724820923665 +5251489301091146511 +195560810 +10756875137560615397 +11849550648689124232 +12870531944682890434 +15290243351550456494 +2624757565191900497 +1042835216333019842 +2804495565993959837 +4536471466122043354 +17837453566693239557 +1894834033712783588 +1989768577756851664 +15174761220552158665 +1041707189413896013 +988175189962806572 +4195293343407755876 +918014374844309520 +544844666756819408 +7010774963578295537 +5677488671088461407 +2625039581594131151 +12171184641427909626 +1873618463243838121 +2084492846118620829 +8040837036602244035 +5722409932328020430 +2134746484421580418 +7086073653837300139 +13616281538084234602 +9513397450873981392 +12020684574737635745 +230360445 +9870724855723329 +10500701784016182978 +270697233107262319 +5908323231421516865 +16304469904892768182 +6724737021359448198 +15292781572259195061 +6209987959894727011 +9200853806451922646 +5516892784508541507 +13709030295932922217 +5996142189145041924 +4817732052453109853 +11373290136862990345 +5782296418395372321 +17785259861724570974 +3666803035281116020 +4274329553777924069 +5246976944067258400 +9870725375096304 +11995199952005575701 +4094847807739872315 +7872291594684149088 +10331957377801799627 +17015736054586826231 +11160825938585338204 +9204240858826827296 +9870725378962956 +12777501753067135504 +3308118261904711755 +11127961588135186306 +3452050541665856012 +7630443591734790732 +8713495324334053785 +257426840 +9299709572676857818 +13810291222686749615 +9870725882869321 +2465915754674474585 +2010281671118111514 +9870725382829609 +7333338093980689693 +3704978477546427009 +8794768896894507623 +6152225761692894219 +10309053949146060262 +8814740290813637397 +2861086850442988667 +15438242078070690865 +14101056588768027 +10379171496831108185 +7560543480811906720 +3210315123575909791 +32432320526092396 +464309721892 +17089178018187927568 +2624475557387006758 +7650754020486832759 +6888657822347371450 +16231093522553775307 +4436378712987412739 +5198239352434401373 +7263381453087393291 +9476180711086252541 +12664851523972840750 +421317906983 +15290243403139604633 +9120210879817215413 +10145099925993573452 +4697061119311682069 +6979573821010804968 +1169867825687130680 +12956308276644832805 +8516820606556389543 +7276444624641068197 +4947940129341780828 +18412263939573940271 +15291935497256513367 +17345010045701019945 +7406761828646869494 +6971520520943980544 +148751106950916627 +17625228020848465720 +9197666094378802763 +5671848295743957104 +2676033356038342963 +6739699622450777274 +14665059300765965 +14934762765205327654 +14500499194424731090 +846140170598091095 +1695396620182571808 +7201922442027879195 +5312856395495917076 +1873618514832985105 +6218953989384973268 +14717113633060560232 +1576744569957343770 +4390701973926669699 +7140733667310895682 +1815545703 +7576852735584981396 +2055823596659948913 +14427726868418158684 +15288833260939121833 +3650076267004369124 +4962374828093549962 +5780040244184035050 +1327105763 +13345741009825312547 +1178564838795131465 +5356297035501419141 +1732546113203614557 +1873618450347202585 +17011997294973951509 +14947075702983764 +1788898212196792101 +5726925958801597145 +6100103839955298399 +5243108696682925045 +2734678476775113455 +5566326282397760989 +1149335087852052764 +7126692450255120940 +16903238998122978920 +16872103587201970733 +1767766352370613533 +14501935124741187256 +6310847468965878566 +11395725363563555011 +18411417864571256843 +10016146956641988709 +9257080307582838571 +6886175003729486390 +13731641628611980082 +13561076537151153829 +2573543666008069247 +4277713720516615264 +7119681547335582653 +17822531669036766067 +9256796864594464710 +7960221585811380736 +14549761505690989027 +5564423899624573086 +6927733950068752560 +12164227723825921151 +12366136910267637449 +17758414033733371038 +515898894438 +5517449210700520375 +15289679344539166637 +32150321319716060 +17097227825074222003 +472907068420 +17291573824845254345 +14388795674833154724 +7034233834484400511 +878291186098314456 +8531195815641551880 +4029511595108672910 +6749561607377537215 +8535460881099940058 +16991151781330561353 +2576277293132963107 +29330208882181216 +1873618235388145897 +3308058812318626669 +12753961153547881571 +15288269245330504902 +18153025126751559715 +5249797202674912521 +11134642936640389671 +802207752254919167 +7246387476723860205 +16058583609134968902 +29612195191934510 +7288365174792656034 +2519729693145381357 +4858945738627883177 +2624757560892609449 +5791618305623084394 +5972037568399561830 +13521540392564903020 +12748387008397126168 +7583819773710450941 +6151097687483830136 +15292217492163611762 +8670233195164149234 +13837110371323764434 +1873618501936352075 +781570828132956472 +5992475988808178824 +10381023484200688723 +7875397936024466682 +1734238258909696313 +11333596236464339821 +17734759782129668661 +28202074485435831 +5458848630090961276 +2811722441283687253 +1873618458944549455 +15740334315622961236 +12483202836952538908 +5831598115918541063 +4445946672738011719 +14160573243022267031 +12137195938043475352 +12855578479614234993 +7033387759481717083 +15291089473842982808 +2849674886427989387 +8408355694125734191 +11694815825177553930 +236454025607 +903780211257061266 +16918675908887332586 +14428481261315634213 +9408168336948291950 +2755493796602521900 +5780604319979162454 +13819035887223185 +7243867462131130600 +9283301597305789147 +12622923746539432655 +5899052013081871416 +5565348514506609767 +17471009135193445593 +16044698410490726561 +1731136022592317808 +9870727072413471 +15008431550346895182 +131977391029891015 +315442540179234391 +7139887643897365034 +3444172667634534976 +17942471456892274723 +3380927212955659549 +881393336434769749 +16543696378457900688 +14101052289463523 +4384588605700385315 +8608091023428105853 +17620422735781897952 +7352041286136824728 +15287987246124116249 +460010424735 +6152225714401778054 +17088205463377874232 +1697571739709348730 +6275161907603138872 +11341778347310787980 +5624091869456263591 +9870725103187315 +5799298044209992787 +1627738426083201232 +1574488477427657254 +4855564880837354937 +7301047490197455748 +2096094456611947442 +9870725110920597 +489424338 +6908100892140920739 +621508790887722257 +1035372644846413675 +17620704752184146485 +1693170535549583457 +15014118480009386672 +12171312437261113022 +17458259031540849581 +9870726122600087 +8500063484584805828 +7867619042723894311 +14588513046303297568 +14923950229123327768 +5471385918065828240 +361675971418282419 +2676033351739050430 +9870724626347049 +1092418960353617971 +14962073700331449326 +3523125724429372709 +7139041568894681606 +14241281038845960511 +9870724634069507 +5405598733024579427 +5458848681680128811 +15287141235607216422 +2574671723021219941 +4616028941052503377 +1842148199544863858 +2332294827680799996 +9870726141933212 +5459976644113468915 +13915739326544165575 +988739304450448513 +15730244941329884870 +693451766711067587 +2625039564398210301 +9870724653413449 +9989782852368424148 +822839775150352339 +5778348154366332035 +5992475932919734232 +495542969232405683 +15287423178925162190 +9870724661146725 +16690993612902261075 +11824652051194999286 +8724608012048870948 +16794339353835106581 +2218221785259523599 +15519826062116461658 +5722409872140275982 +14273467008585125499 +14045958232268935862 +1197790774858296839 +8162319323412520289 +17600557249351981605 +13407762898220161076 +1575616504345616576 +8107633101451965763 +30458222903504484 +7861659208588340405 +15287987297713276115 +923439785555881210 +62850193 +3547323528789692845 +8487494951273588076 +15793124911242596 +6279040677488698750 +4836670023851984097 +4143061672239511273 +10717677643156842745 +7582565111975524313 +18001524892029104575 +10452048994918150559 +2157417503572844053 +32432346321981056 +70583457 +2727527751902057543 +8207049193562337395 +5196265211819987546 +17163493766823102672 +7242736020560881210 +13532656511522267707 +6516420189942725867 +11040187342788369068 +1776768851917302626 +13626565541770377435 +2624475540191078314 +4995529639851941276 +32432303330180919 +6890349920762347803 +5462796808140178976 +5726226297114536022 +1073131086680893476 +32996413519764546 +13427220419978792191 +5541986391579390293 +14787093348586497530 +6795216411027443006 +14413257117190280298 +692605700306909427 +6092080099993196915 +5193163048586911008 +14383055795081947 +15016451663009504737 +1092418968950955839 +1843558285856880178 +8525985451559230894 +27920126868215267 +6963620007220493431 +97649883 +14312864968818038074 +2597849021 +5509410163496651946 +12891357079079097223 +3080656745104347507 +32714319732430617 +15290243342951862262 +2624757556593321064 +5995296096946427721 +13517017123900577327 +6659288681984050573 +8370142806574589087 +14301356308388917082 +105383186 +14648423506775772878 +7350766340265224305 +17431203975446616132 +3189738274038104689 +9796067026192895714 +10585955816900225770 +8347710256694707479 +10095775271159013132 +1732546160493472971 +113116443 +1873618497637072787 +15984537480413207741 +27920062382426510 +6015017985077952329 +11456458862521166058 +5369537947945627805 +620889680 +12436338270374154804 +2706496571107648655 +1873618454645260313 +17117138716447429485 +18093509315353781992 +1007582071991775332 +15290807388655667144 +14641380483232723296 +5940757113192995125 +15530925132565127085 +232154732164 +13735668132425714305 +10699043268747745512 +15142404162196548407 +6368891636281524095 +15291089448049721545 +3696712944513135253 +18020491647878436892 +4631616963835210562 +5205376347324953692 +5199085354352713659 +13819031587930394 +1013515379678198061 +16278603523339605546 +102615249274417020 +1788052248969758017 +16465621545428344781 +17195630687712598440 +15289679370335050299 +6098975825932724715 +2390363305267053562 +3477293824168121281 +17104304187076008535 +3418202265618160018 +2635993685957951027 +159515970 +12921020019963142402 +2908175286381660235 +2473567754888886091 +6044165549131837994 +1930668198955452797 +7880716380647336385 +455711158617 +17089626594603841607 +330734273960750756 +10862662106438508171 +7718977057984699007 +11826142248422103288 +2224138645678283539 +714746536627148650 +4234673198106029806 +7936489785816852580 +15289961386737290432 +7741956108160621189 +6882674338183069358 +4890158661564389579 +15427680614100778 +7626094329524285918 +4151361002449609951 +8502459011534825534 +2341393787733872591 +5138669575428253934 +6361518302136509263 +6246188877658197853 +9419684159626299903 +1987512394946919198 +194315622 +15746639385482916164 +17652163440459473141 +7756557087588053434 +15893182424591852254 +6469036892210009537 +1998795749008743440 +1732546212082639981 +3642776180496617059 +17762963870129600615 +6316860770761849702 +8271097636514262715 +7034515833690718597 +1706035014 +4790241231713563392 +11739356363550635323 +17740080579981827302 +2576363855830654300 +1873618506234411714 +1092700963858051455 +13491187753482787091 +15530835708042435424 +2964529513593988600 +15288551244536835177 +8995550684990094810 +12063684487233745652 +10476206345657258758 +908024780281111745 +8715596568706179810 +16260410427443711552 +9870728843196216 +1995983957735381974 +15292499534361737279 +5303047099741252945 +5831598141714425512 +5080412918087107448 +2625321610894445223 +17119717297920817913 +5356297026902838384 +10592453243373558828 +16779888195001400069 +15135301684501304230 +1873618441748614358 +2625039560098916791 +13939632301365930928 +5458848612895039542 +15292499491369936829 +2785415326238521338 +17017082293734415922 +3588668394385649363 +15470167792673052325 +15289115311734597998 +12750853257602280080 +1624918201868772351 +236848518 +15207536979498069482 +12864601799300295341 +14428481244119703337 +14368049892416965470 +5565348540302518358 +16921919712692620952 +2729283571242054637 +15289397371128646507 +9870725373851110 +846704164711509390 +4387881809898719584 +11888218815508974440 +9892260962148830227 +12115128453863724649 +983011210292044528 +2678289775302687922 +18411699915366727709 +33560368941828174 +5835536206755026983 +9870725381584418 +6979009796803592406 +2746414843124214262 +9852718943046160555 +15291371473049310216 +12270203145506273526 +9870726385530584 +18153075185595072605 +12546296406419002034 +451651633792376326 +2842331449437669827 +17989348947424194927 +13916024478837138497 +2152216378621958991 +6928016000864223426 +5620290518589192517 +4064528641026559456 +11195150823295373530 +10859426818132544075 +4787888628921013709 +14101035093545969 +7072090857947142071 +6612442490840624558 +442814510949 +27356055371136309 +15287987228928204825 +15290243424636198564 +5832726211624180320 +2566449444308206151 +7140169643103683120 +6436443319328249079 +4057413855781212767 +283248045 +12593167795176749729 +17047739678441170343 +5670079292018873859 +1627738408887271909 +1254706872264192672 +14131629283031068227 +7512415564975465308 +3365548213302137577 +13288034261968296083 +10588787077427311221 +14383051495781774 +1268434292446090095 +15026524472793571142 +13622543044284915621 +9284429671513598696 +9611454020314951183 +9301385328948499439 +6313225371874246352 +852534097651061003 +1996567588547481232 +5140326912399189106 +2557583750880521753 +10164761744864859596 +1414174624447355750 +964254821181315912 +2880626763246166955 +810354292 +1043117232736721440 +1873618493337771222 +13188329144461371144 +2020204409927703334 +12749251397817078231 +814220948 +7350766314471965344 +2413793875927438653 +5831598150311748177 +1818167145 +818087599 +13536229622893596532 +3550769903615623441 +15289115363323757317 +5729046491235249810 +6927169925861539998 +3884829294353716569 +1825900397 +12749251354825264745 +13940679502897176528 +2785415334835849278 +10683050209305647859 +1573642406723017694 +16262666567263262999 +1838763959721811530 +12415707403918459658 +15060052311350261090 +2628875744624526661 +6158568103315923318 +227855438915 +7517987891047568033 +5782296448489296334 +1789180271589605859 +5229147070930173877 +2311806284048702708 +10342523920152018670 +16579096809208684919 +10583135657171571463 +15398206672049033614 +11749368758553356836 +2196419055069641668 +2523959969279970606 +13819027288636527 +313076836089477695 +15901935939295591134 +15292781537867362058 +2786112608104044833 +164794515634611119 +12826571563185219387 +10523161160733569835 +14260259972932317302 +13669583310056990759 +12074216548395397024 +2223383711031649256 +11230437631732097792 +9030446003504891227 +14261669986161201451 +9229891768294447798 +16507208394761386725 +9763237054718300869 +7243691848113087770 +1988922532848091222 +12639568460295845517 +16531696235000651461 +7245823452516647643 +10554716754509249611 +9184831344527295254 +27356106960286354 +17088205497771124169 +16589954806536218345 +494403651894 +4275101731089303077 +14988715965144705737 +8446679125634478665 +2572415617593713070 +8064175486935831162 +8052454368722047897 +14586538927185548764 +15087607024162515849 +1453730913755876337 +14737402000107060101 +15288269288321067010 +5630718882487287359 +5250643148704804749 +16878882991386466403 +1376126703 +7259947653609954153 +4456039366425914075 +2479908714456442484 +31022272905370842 +16850138958408409066 +1945545860539705268 +12014667835681880693 +32996417817816196 +30740222109830648 +5993321999323830444 +12323079225200022981 +3881163128407486662 +12532292418921910741 +745855674758338669 +1258091039002880710 +14586538862699761423 +2200429374859392119 +878573172406828171 +12277052476333767169 +2522831864975736692 +29612195190696430 +3675920403274355285 +2333071329017080125 +7032823735274504521 +5885976155981636605 +12907626617534245266 +15011107079779067821 +1873618544926940943 +5251489275296626302 +12345351961007500555 +13017836379328825197 +13329633534108131464 +3017170418691477306 +6097847738827018686 +2624757539397398811 +1732546186289364388 +15352877377503980698 +5853110719953052856 +16951650337051971071 +5953320668874818801 +13106385793934447883 +5744236492394803020 +1880166547305425676 +15289115371921098983 +6206321759556626407 +13737078235936275022 +502245687173058780 +5677488688285751619 +10494298846923614887 +14753586224036985178 +8220099555939787337 +14106161439742648437 +14383326641327854 +18037828666854168767 +27920045186488744 +6336543102041675351 +4025888122525859314 +15287423213318381804 +12392426871415443962 +4432807661755069124 +2625321606595152996 +7193983581574595235 +18405292847357518320 +1041707142125399692 +2625039555799626955 +16261143499745990832 +17735566651085688611 +10903203954901019939 +5778348145767757113 +9870726559528686 +5831598094423311406 +12896849246080283293 +5624520704442113188 +9568671246589696852 +10418310968674508911 +6551320005038599176 +5147383464174315663 +9870724567102400 +13808562234416587788 +3431717683755290726 +1988922584437242646 +6906705291011906710 +12430143112327668535 +9870727071168286 +9870724570941872 +7290783919948568925 +7300483465990243186 +579591368566007472 +13914751370157716020 +9870724574835675 +6364097383229559944 +6157019993248387905 +7560652789174132612 +9870724578702308 +1628584415104889154 +17461812017531652352 +16698541150342635679 +17946137665827905137 +260967832919548538 +13326822308414431279 +15511108512793741 +4944208403882527880 +9183569393148173296 +7399947675915087178 +5353476845680207404 +32432337723416761 +1873622667823692854 +5887104182899575893 +16384670846731502853 +14101030794251744 +5941764144784017680 +9870725101942125 +1873618265482088810 +27638101867387885 +333819098725103345 +9870724601902062 +2128371995073660513 +1201738991598838589 +2624475531592495488 +9184831288638846060 +9870724609635347 +11949535972653272044 +805679481429166612 +5245848899952133104 +9870725109675406 +9872783012039767284 +3411185062429481035 +2282846140646889108 +6304430915175603385 +7457755598791717890 +14938644887456211420 +6314873999137394872 +14425661019905287507 +8196427708865193542 +32714354125654265 +9195158052381810764 +11228068146677244718 +9386257365841887583 +1492645939235738269 +1495992085 +14264208142382995243 +1944417820723918540 +4280602885598750212 +14969897171663148238 +9870724625101850 +16898924885523777203 +7087435806037651463 +31586327206521135 +9005649368412403992 +537223959716454223 +7299637390987559758 +3605501 +13522950414389899238 +5727238916730197131 +7472158 +11084138473134492054 +2428928028263453388 +17305728466480491009 +7217242495543823987 +10908568596609772503 +797695489810762772 +16879729062089867578 +1842491240272905067 +31586262720735627 +1735930310036255362 +3191712388858004069 +13237708565679243274 +2979485022366095227 +808116564529926083 +9594414040416867973 +11065179627923320366 +18219329924430581195 +3665614278816111339 +16936874979922366719 +17490170222977955083 +12857552611628833710 +223556143927 +538445296 +5884848030182241095 +12850101806785959286 +5344087239302994721 +14471968470100360205 +11944851147529655434 +1992024743372210229 +4730610357785665667 +15291089439451147512 +4268409800479037938 +5910395128899058537 +1603303097579279114 +546178583 +9155601053723081987 +12131998248365142862 +11312167780716913635 +18271108150569823160 +13727760615340987167 +7882744384220320002 +6153353771414852793 +15293063541371781994 +17783567759008992472 +5303893136052857008 +5991347914597872336 +15289397310940914485 +10589915121543820671 +490104384998 +5457961656012840301 +15669210999433031637 +9503363350701686458 +7193137558161064587 +7475600315275560275 +16877472973858297612 +16476111498026896198 +215248568557727103 +12438560421907607837 +13941243479815897340 +6538745605913863762 +294698224634644426 +14269577434460810948 +447112555007 +3366032449431818571 +12157859360937097392 +10881984560763984339 +8075071877499463376 +5245848908549475369 +17035774627164205848 +763377330722121811 +27356038175213483 +1256398940586664811 +3896536008687426963 +18182772513388384380 +9469820891538943009 +1584924465 +12891075652320236488 +7354297404461155301 +92538071 +9837239803450058008 +13439045562453800842 +14138252754113600638 +6928298000070541512 +8868431006280791822 +9870724725634261 +17643102050385274816 +6041909495293490393 +104137988 +16480559093000585632 +2947421238942724117 +9959925712298130545 +12594177041502710664 +16496271579953901073 +5737445799556816729 +7027696421278656986 +1842148186646996696 +8687671170001752370 +1873618476141842519 +514614295390133917 +12949541077301348248 +27920040887195682 +1840738151924109881 +8450498537483751023 +18236814720955134797 +3545067397568950173 +12537862816034285198 +17496113520534444579 +16760795667143279412 +8750256560896097320 +2625321602295860511 +16608774888522150613 +631244369 +2836768973064722506 +6206321690771523595 +7726701492918841139 +15092941940611817497 +17884502360933493161 +3910337726729175009 +17945855675218863782 +30176172109408921 +5441210068766630821 +7298791367574029110 +11885854334102491127 +15541469894605809940 +16327905914734854357 +1626892316688667256 +17840175164768269283 +9881712940254170160 +13819010092706267 +32150347114369488 +6708848322843266950 +10512763733196345049 +1784668047839220910 +7622195581110076272 +13020605563995712162 +13065916646165139325 +17575525466142104102 +15289397319538258972 +6357046311311918021 +5623674732617751486 +12270203136907695575 +498701711619 +4116049767552788342 +5577214489430607088 +162137431 +321142484957145951 +10587083886808745054 +190608922372615061 +6208295801290693391 +12092413546983728440 +9654923030419682777 +7878949572615825719 +15571137852349312845 +18113886812457615406 +8389639136438603332 +14101026494955481 +7033951809483506035 +15689904569685390464 +10608900034458884019 +18305914028471692182 +16430411316175451124 +18062893016518242767 +434215915796 +2624475527293199560 +12157603493737472763 +1785258072604564440 +13573259713283691566 +3441563578650023549 +27638076074111842 +16882831264015474930 +18279507473155498003 +1730289986280895838 +1832528875541840850 +7697026923310367393 +10511140102554801876 +1257904945537233032 +17398586792193908904 +5923957019092469172 +1873618527730996008 +4958753984641975815 +15293909612075173735 +619524292868969453 +18067928196024962029 +6891056081346640290 +1893141969689731321 +7516258841380857946 +1836789870696545086 +6014764314626046583 +9870728841951027 +2560875217568540828 +1785522388117643230 +1939498712175284411 +9870724845499676 +5778348193057614021 +15703528257170515395 +1464040393467500204 +9870724849366325 +14092212388786679878 +10358345303129418951 +4382719909921253259 +2830394698076531718 +7033105734480822607 +5576979434843872231 +13351948495571783384 +5994450116523471914 +11757848817797114972 +13040021237472175871 +3646692057275242446 +17289282588136457425 +1464040350475705366 +15292781572260581163 +1837205073089085955 +12426051065400527849 +15289397371127412668 +18425890896230956345 +4144026118870019113 +6994666394809094959 +5248951110475065031 +9870725372605916 +4280732318042495186 +9302231382455958523 +296036563846043654 +9870725876512323 +13409614762207489476 +18164832428166502816 +7139605618896470558 +14264772149394225412 +17971473236627699686 +17948543784312913420 +1675756504502704959 +9910951986547005877 +1197790749063789446 +15287705212524718980 +5408303386569418172 +10334111064466788895 +11450314238301772944 +13014534490079244471 +9870725884245580 +9870725384205879 +1787770163782370564 +14894854925106899138 +7813876878778647210 +15287987271918775012 +1868611368115193287 +1416712772071739811 +8834282535679561348 +12786169256393974691 +832383132036305911 +18148973833642194462 +9193717847543205779 +3785541221791502927 +7754989484937652235 +7300765465196561272 +442813263305 +7880607055086697401 +3932922079384461479 +12695566147582693494 +5299098874403556739 +16828480190656765831 +15289961373839411867 +6621124925338111937 +11277590796338143127 +1782122332 +6157301992454695349 +8752346611156859508 +285869494 +5995296135637705156 +14337609258513341793 +2946180202225951995 +6926605901654327436 +3205194901446988280 +3129344044965512571 +7945441955166162669 +8059269114602799445 +1873618536328359031 +12220809616918987113 +10430737389551488561 +13727196659918847499 +2150364429943641338 +7138759543893787130 +880547287226732600 +9870725930645083 +5515050513045470820 +5325855524457366536 +7119059345498921318 +5875312241905978784 +10420287313124933821 +7425777611830094121 +1813055332 +10861653452618416720 +12231578312148476965 +812975754 +5301072911838435255 +17634738504986594665 +7087765747954418150 +16148339639237698187 +15733389799266724498 +15290525376551413568 +6223496053747105052 +820709061 +2625039590192847182 +16349879387953251896 +7277283748682485612 +6901182113765221549 +9722583101500506447 +6751981162578325577 +1160738176826558640 +8443432440787582572 +2849674899325985817 +17459732981170727357 +5876790318555281236 +297896956309163195 +15586729198848182629 +16997228164223812036 +16823961564717803038 +17359260457334170022 +1041707133526828906 +1508049959547463127 +16890203154746985285 +10684420961421630111 +12232941055145616505 +10436910888234916921 +7194265632370066101 +3429373643474749756 +4347925833117019625 +16743444847067284018 +6847384129222699335 +206360221270 +16490353754747378611 +1731418116378350986 +7401639795826694223 +14612094360531585576 +5246976952665978278 +6829197924229396671 +17094376519214181859 +934361247192796470 +16542584354194005216 +13538679271994107049 +2365056219807567470 +1251040684822703250 +6599737765818674787 +6203742652669041872 +5724666059249629523 +494402412194 +5835546311163844013 +17205553352088562090 +17164650024200400231 +1115324925092124840 +9001701177466489340 +9549673313268940173 +5413550766917772878 +1776768877711928146 +7242736046355515378 +9461579259805649810 +3284152335116213795 +7032259711067291959 +15291371438657456453 +6173800107753209956 +16874641756321766635 +15780765857606682063 +1146514889432258250 +14184131959057827450 +1873618256883498710 +6981265915127922979 +16767854907747755128 +10972264128292718802 +7880607042190054309 +4199805580057579918 +2730129611851714963 +15946833191738158646 +571465146145519221 +15293345540578098373 +17849047115463158427 +16093533000291214719 +27356020979284629 +4348489865921521082 +6097847781817605006 +5509410189291299112 +17284656215747938647 +7193419557367382673 +16198687013052361583 +1643044461274009549 +15788410621860278971 +5779476207078949751 +1774151540290706055 +423114783877512621 +5568633497721458107 +6428002724138996671 +31304310804205386 +4580640756537770355 +1041143117918197584 +1166927726818504825 +5611336678769899665 +16860434628194284143 +13941525479022213567 +5832726134240516192 +16881421182001494982 +16873795745804857656 +1894834050908827525 +29330122899916770 +6151097665987348488 +16490344159051669643 +1803181542484679501 +4844901240887794375 +480432067316224942 +268323666682340358 +8320487092031002865 +9870726042777212 +1989768573458922323 +7299919441783030624 +2421360549 +1840174024538610078 +11970588599140494638 +5683634553748089515 +15289115350425890506 +13117159209037204351 +7241607920557315460 +15290525363654783536 +28202074486821031 +31586254122137353 +10588786978549681229 +13064791643241135516 +10241773030392284049 +5195137090322450176 +9870725054297427 +5303047073946736120 +16205782698753854840 +9870726558283500 +15801421542798614888 +2625321585099935995 +4085763646718227762 +9870724565857207 +18301216972082384143 +1511577289146636998 +10211084702378193741 +9365988130818839356 +5502060460937144029 +15210250639711236439 +17461812060522224971 +9870724569696498 +13727760649734213740 +5489434912622075660 +9300539284039746955 +17678682231365113451 +11718292303335334971 +8156749573992101083 +9870724573590477 +3740815079720963015 +10680852744798295882 +13037331503003168261 +15291371490246613262 +7086919724540887502 +1005889904790429978 +5782296371105655208 +9870724585190378 +8793170502919351838 +6206603689977863017 +6114840380257353811 +15289397302342327161 +8881019260503722667 +17618730671758856277 +5991347884505304932 +7299073366780347196 +18065100343224526439 +6448736582553579209 +11640650963542682438 +15288269275423191012 +878291194697053092 +6832106476831907073 +13221120945827220602 +6019830301742551887 +7399947611428045728 +5924578518110586997 +9870725108411750 +12479077180119995025 +5886629261813306273 +6448144361652625046 +827297398757676853 +417019994660 +397091011435383677 +31022238513520588 +13681696359427554540 +10910260725118750639 +2148672331527435134 +15510209378605209566 +2115587870189164415 +16066123844176337994 +2360298 +7512697620068973308 +17625510097438585536 +1873618532029055464 +2692402507216605636 +13510731817280418627 +849524367429477204 +1474804159576492044 +6954898089583463818 +6209141837602299844 +6097847725929151947 +6226955 +9870724635456574 +6689444101208551734 +3087644374183450169 +17422075106091076276 +1347470986546725773 +1735648302231274812 +17062305393199238058 +15547566717537248179 +5972855211813726755 +2106834385579422890 +21693522 +17887683492421316255 +1873618467543269198 +15278422278309500714 +2625039585893555358 +9697337405409879755 +2401522090309920097 +5831598124517252168 +5822772555246491037 +17422075041605307719 +861327970215814212 +1997958085450678287 +7058279794389508520 +821147659536966700 +1533413145 +5356297009705672388 +5669551265446568596 +7192573533953852025 +1842430237442465734 +14105033451515939989 +10296839827164966635 +5672976425841602453 +9870724666389625 +4737837392452676541 +41026659 +544933385 +4598821867781498261 +13513914887581886338 +4527567975009512008 +16165083394671724207 +13611544013539121920 +1224129140193972318 +2907036184457474260 +1467988623104683186 +15645878012161898054 +12216316833227879965 +10617458906941316535 +2729565583346451137 +5942892201797100028 +5888796298511921170 +15793146406583614 +14837905735108542637 +12629869613005550703 +12126344320374361961 +7353733380253942739 +14108981676855074918 +14732267094484330321 +14426056237757119671 +14101060888191241 +4613498216615137204 +8659114857360722966 +12440766715654453591 +2000487911910950831 +14110673719381678357 +571999807 +12382232577341745276 +71959733 +2624475561686429714 +7373373677989488213 +468609152851 +16377524938682616383 +9955545749193892480 +451651595101214658 +30740239307127167 +9548014972137053814 +5141737015908523398 +10318013789890172205 +425617336461 +15287987211731017383 +17015954193730844883 +14383077290439319 +15779657929565886824 +10004407232200516869 +9003675253593883469 +32996392023300103 +6097847777518293574 +2624757578088658001 +9870724720522424 +14102840555306631361 +3886521448658581601 +2902806002903772352 +99026160 +10798321677871949245 +27638024483703655 +9870724724389063 +13996376549769045502 +1003633846654022552 +15290243342953232967 +2554755883604719373 +1603012406 +12275078262634983668 +11290917642050015604 +2134875795980825212 +15292217487865690011 +6360390318207883649 +13714417139604740133 +7504185064659048013 +29612147902199052 +10053655854349571891 +5352348771469893952 +11777272302195009256 +11356600521325814101 +1039733035904231120 +15287423252009661706 +9627860010529871938 +1873618476140595553 +17935692048408591405 +5346547208261104442 +1363180884395126372 +6103488066881866069 +6926887900860645522 +12973149357321492039 +17781311627788251646 +6608012835250520770 +4300193865453100380 +14540810596246031541 +5119287909249600514 +13513632858282998302 +11123291787522227315 +2209547647595715976 +15289115324632624212 +5884848060276169810 +7862633061277244822 +17952330525185626164 +12718336251608305426 +12275360279037228753 +9426596312246992805 +4684203863951425660 +9870724759188712 +2625321580800643790 +14015691446702121986 +8040837006507197998 +5759560470823898065 +3581347250154184012 +5572116912471167604 +2283061350295618550 +15292781563661995137 +17132010341356813006 +210662155978 +8642529546809204313 +9658025172157534598 +153158953 +6534244500804815122 +11432423199121490906 +1188626863348458054 +520198301261 +12822873766971338326 +18289406795517991812 +1519546473345211854 +5462796881224672332 +10834678099584757465 +160892235 +15289397298043048211 +7305619266591345097 +18008106325564547011 +8662899441783944261 +1796278484280370963 +15503713255025229133 +477206481669 +15293063506979924483 +6313103634580000310 +15291371442955509514 +18068572667551626807 +8388229101714492962 +109394696449514832 +11900417579467411576 +6511844685037987223 +10759828418061804544 +4920623494848600071 +8329765017882349021 +818063568869474096 +1873618239687580027 +17172590775664728722 +2113895771772963337 +2210675717505510960 +5215971481900300296 +31022234214225307 +7158411072313174616 +17868299572712060394 +1042835259324984032 +11846305913529242808 +16919234205864438970 +3518888985913542313 +195691884 +1518136331144750395 +9816939506534407273 +7032541710273610045 +9870724821054738 +14960942274325654947 +3207856338718383659 +12870531944683029068 +1283514803232971408 +9654763145765791296 +13465856609900308313 +534551678186449227 +1873618527729752612 +9288263741171698664 +5432371237004062020 +12303723863410360154 +1733956203815064191 +6981547914334241065 +6100103917337849188 +4900544073974301527 +13668621706186998363 +1777332863227993445 +276294892620232742 +9924458053698472742 +31304250616468021 +1416148739266015565 +15493159512336373904 +13724983541464392817 +6206453551322832478 +2625039581594262259 +9046832997262628051 +1873618463243984636 +5303047099742635942 +1507960418414891739 +12962168919905475653 +10811487687206049548 +5354604911289460258 +4512528339548785934 +5783988546905718699 +9870724855854403 +230491518 +1414738734635641871 +7088047798749889016 +10064861722882500815 +5195701204810082830 +1252450796930615288 +2052034288295110517 +13746503428530522611 +9780542906820081969 +15431078692508679769 +8795298599822955721 +5510573007748475897 +6373472986436299631 +4386154205047642844 +1466296524688481084 +8281574364107334487 +6020634817264376429 +4934147624042828653 +14581451608520739459 +1168459919086868370 +17785259861724716008 +9870725375227377 +15291089413656624562 +13662222079136788146 +12485176921678630595 +11783076317662962149 +15289397349632183394 +4261009806383464486 +2507602384638317367 +14471968401314025232 +6619027884152811591 +9870725382960683 +6926041877447114874 +1321374849595369872 +1745891129545527395 +6075095896456846303 +16235193766417601356 +751021333891195583 +14101056588891256 +16633239261029357277 +15288269301219073157 +1411918557712306593 +14213945703741213292 +6199013939414587986 +8343719815188670511 +18302063029887981522 +16423290341018857642 +6199110045548703526 +14376606517964598188 +5299098874402322220 +5514354658380879320 +421318035430 +18158855401059790794 +32714379920280923 +7087201723747205588 +13524078467103668423 +11225812687234024024 +3374038090428138622 +7235244191676647727 +14361095630442007319 +6135992709044201822 +8909873711576407799 +31022242811565861 +9471809451295069690 +292357573 +494696889931804497 +996672583265175834 +8820971457565647125 +9572488133916450015 +11949535933962133119 +296224204 +17306856519194252223 +2676033356038474440 +5887800020369607065 +1873618514833121112 +7343589259763457025 +5515988940933459983 +6196571971007373272 +15513125587922400169 +10376633327711624897 +12133813307911383269 +6439645968086878745 +4781836738466358366 +31586288515357298 +9870726444906207 +11061974037752340554 +15287141196914846203 +14933324549757946624 +819463865 +17942189474880777061 +10593863286695156859 +15287423226216388785 +17954342474369802397 +1873618450347338329 +6527795411547282975 +1041989235911440817 +28484146776247914 +8006157077928494684 +8208459340062216405 +2625321576501351488 +1640756315389063558 +15291089465245773125 +15289397401221337689 +18417203057481164295 +1413046584630257783 +1209293359021972978 +6101795934072352430 +6045857694838104637 +15289115277341502132 +5457785514812517415 +3946753346281344837 +16889333080374581077 +11236137142840216418 +4664820263310028900 +5247311353700706886 +6980701890920710417 +18413392009483845720 +11357526040426527603 +15017509038007935722 +5565348505909402986 +2481036784364903543 +6290220139589947453 +6985684907772680035 +16658392392064579027 +3732907554037721500 +15289397336735560068 +9433411965490981881 +8114359576701899035 +11743236838721013072 +8057363313678167026 +1784676364702869163 +7192855533160170111 +103179333668260585 +15289679344539296176 +16921635213733945695 +9144793563742490365 +13223613646767922519 +472907197441 +7406197770046547843 +3452050485777540278 +667089872855199778 +6155327877636176226 +17092728740639677119 +17392345893373429051 +4729938940919878216 +2436256590268100195 +12317069699553048889 +1374799038193493087 +9620696530750223013 +8536587065798390166 +2395019873428137583 +330734248164992677 +11614330566544091307 +11911353550168013087 +1873618235388281380 +34124401746523443 +9477584246401744433 +16075145612913759 +9415214157600158381 +138231604521820302 +7354015379460260825 +1518418377640977283 +17557492393527287277 +1775640786305768409 +8927653410927961262 +2624757560892741725 +12075632523641319196 +6979855815918026989 +9723252749133240662 +15111842938935143520 +31586340104505700 +18412545934481162292 +15292217492163735005 +8016103765568990979 +1654120425802829282 +3944001870332908795 +10330674133795035238 +1556905452135475135 +15291935441368199053 +1890039836549402742 +13229609214839641236 +1873618501936487396 +11733273561305397040 +1009849209434036201 +5679150902442860190 +147027456461457902 +15292499551557808520 +7315063482205286516 +13834179635678761480 +5352348754273987870 +11440327773653177729 +2388013328799119435 +1663563960126888994 +7727798225651114410 +1734238258909824175 +12583654612056476892 +5142335724176089270 +28202074485564466 +5884848086072036492 +2625039577294970661 +7086355700333674940 +1873618458944678754 +15561507287535472100 +15804890104624861655 +827861392871086178 +8540443249939255712 +16184135216576812398 +15289115328930670805 +5783988542606426984 +11444452077949370626 +4737110201220217504 +18266077987869760357 +7360212091997416786 +14428481261315756897 +2529611247665026041 +1355656582036991545 +5515200686092457420 +9870726060865156 +5804412363935061484 +14426789124207041072 +1493907215601307583 +7298509342573134634 +17017082267938667126 +13819035887356054 +17229611893419816345 +15236448206961527608 +1005889947780976083 +17422335794636072938 +9950301033540313754 +9678643295612389250 +16434946141727313194 +33560386137887578 +7247515546633765654 +524496366782 +5946696443085590406 +7721139320100817240 +13513914857489308721 +15996675133439830815 +15806264042014208397 +12835440676020965022 +6883278801346839309 +5637072609524125317 +5197393230141944273 +8661218532942424701 +14101052289603006 +1996547934651619700 +3921433773754900677 +12170083845905666624 +12427801389274962880 +16269533438987939980 +5308183081890293390 +692605777689473842 +1776768864814057045 +460010566193 +11507671079075469550 +8156858663174555528 +101487235253216526 +4484797034591757319 +878291194695797749 +2126679879460264156 +16108156248054052578 +7085509625330991512 +11527067173424814889 +11775016153775687406 +1045595339304157462 +9870725107185015 +9539912040443753516 +5885261803960092890 +12363299365555166874 +6989674032461716466 +11258663082281679515 +1788616255981165492 +827297398756437315 +417018751849 +4312966040774729691 +12273386202911302417 +10012339750667366044 +489555411 +15573565414975557006 +15293627556981788348 +6993058190603081844 +1440375323626664034 +5731175873637862917 +5810733571780593963 +10490476649116365131 +1362616808598760932 +5827969946495309337 +17119616864226923751 +2676033351739181392 +15177483003992485151 +9870724626478123 +18101357742043457976 +15475002888547339137 +9422930129104806631 +9080544794164534849 +5938943989356063311 +9870725130384807 +77937734344723309 +438812023727924906 +9870724634211378 +15287141235607356015 +13524924559303732110 +8912366315847027156 +27920075279200328 +9870725138118069 +10592171188278930365 +4723008322416428235 +5459976644113605074 +3693573093146442428 +1424505891750105942 +13325587421145670442 +9391897706793274700 +15229122199380927 +5778348175860437097 +252562806505150454 +8862264276593353530 +6155045921420413454 +1466296571978347136 +5103405401210441197 +1873618446048054708 +7353169356046730177 +2137124098070112973 +16109783657505910656 +30176206501385131 +5269329687486683231 +8736138753147939361 +245315846349725254 +6156738015537342641 +9870724661277799 +15287423178925303252 +15294191589786279300 +5322697710519587001 +1839046036311916934 +14556688284722420852 +7345432127490565040 +15289397375428070340 +15287705238319353041 +17441996526578192288 +45398647161695162 +11616541604834924596 +15308825434243152216 +511599730297 +12368985817214495266 +5153306075531453642 +8839539261532364423 +8819992730249139646 +559154734 +32432367816105180 +15402324893572673596 +2728220332770939574 +2063140749 +6208295814188719140 +16794806302830176046 +62981267 +848678270931574016 +3242721014529679956 +6687368400297874043 +3387142580035083882 +15785558567545285545 +70714531 +570754617 +10109799026223682074 +17269866578628119073 +5779476288762044383 +468607910418 +8102805470461516117 +13980703149896830502 +32432303330298432 +16421367617996199184 +17274157458060290448 +16642065601678367388 +6205475701751155871 +5726226297114659330 +7352323281044046749 +2416614035656233109 +14256452938553775627 +8777600036366063546 +17475453133986271639 +6926323876653432960 +6052225192628739864 +8484392788040633859 +1873618231088995872 +6045681555694511825 +7036226056540267201 +9870724715410588 +11445298105660945773 +14383055795216234 +10544854611794405344 +6366353488657209598 +97780957 +13571926674587084294 +32714319732545807 +9870724727010525 +29330140097218526 +5249797155383940899 +2624757556593452278 +15290243342952000130 +14282671233461718924 +4360761137424920902 +105514260 +16918393909679895271 +11780790212937281701 +7572519555015393843 +6103488109872433119 +450980818488542549 +2231065564965647415 +15290807453141591004 +5566476571519882514 +1732546160493597468 +13943016536889832061 +1873618497637203702 +12423180240789388740 +10963258216941884383 +3273906465467952746 +2359415926146144770 +1934287791725428839 +2749011849237716950 +11980757344032287762 +4360412421268465720 +5841774667923474510 +304119526640535197 +15987071511676326128 +33278386930322441 +5137224701875208861 +1873618454645378183 +14409153078548761095 +5303047091144042814 +6100103844253472409 +2345815763581956208 +11925205808492143421 +12032015207363327183 +8687135310570800557 +8382080373991626819 +9870724757943520 +1013515422670137832 +232154863745 +6101795938370414179 +3380927273142285215 +15292781563660735016 +11440287232156443133 +13819031588061534 +17487594379014327396 +644220506 +11920875690973342261 +16645742821133208918 +17947254217038851962 +16125995642212196824 +5255281706994714077 +15287705225422712258 +8301861307472432668 +10655291933708586306 +15292781499174957490 +15197399568715355969 +163513699 +8111257460758685209 +498703079219 +14020156713990704776 +230209712565726275 +28766124488597393 +1625764319863399079 +4873288184791192092 +5516046808385022295 +5565348445721660254 +826733327259355359 +11229760292383515460 +10686712480767827473 +17208585699695146136 +6326185750131847965 +5461104722620736912 +18413674008690163806 +9126821865572668220 +6980983890127028503 +1574770523924029540 +5245848917148192510 +4278834390613841174 +11966722661119889367 +518824063523694460 +34406435346148613 +6711292992039632882 +770160628783995609 +7263224397034361313 +6361518302136636756 +6154481914409144513 +9387385366965285641 +5567604607036380513 +1370042529144391589 +14598487547274748131 +2544003514773959228 +2722209420655597099 +4740657586573295435 +3482744088050428981 +882239415735642983 +3795514208959667398 +13699565059448654115 +962402734361963263 +10966376351062187412 +1873618506234532795 +15588924123154110508 +9932424728390012186 +15292217474967809006 +27920070979894687 +16457343533087866532 +3069948027258151480 +12633597574996188642 +213779834 +2914587895472602436 +6971583364852427327 +3061264508759655793 +11255890434323262389 +8990911914467077703 +4445857756554683426 +14714880334493271210 +10385193505410918953 +12774749518464557386 +873242573393055419 +15292499534361858215 +14880882641964652574 +2624757831738987950 +2625321610894576255 +5566476515631443753 +7841540557657944023 +16661576594284498527 +12889947526522222090 +1992881785903909356 +9870724854609207 +1873618441748749257 +7150386713576488587 +2625039560099049713 +7238223723724811917 +14994835356864563534 +9227353569080969819 +12391346703585459278 +28202057289647184 +5722409910832935769 +16981577515082263649 +15292499491370058733 +17114220222374352616 +15289115311734724069 +16664118286155405567 +11132295908982533268 +2785415326238640787 +16910582374925605167 +932669187467855408 +2560875131586287898 +16950522249946470943 +8122508159220259712 +13939632258374251849 +1789180262992408784 +9870725370115547 +9776099992759130690 +8050198250396610149 +16836714054522451070 +9870725373982183 +789251732567694310 +408189752105264922 +5888796315709235200 +11287624317766226674 +32432406508621306 +12451816405354619527 +7086637699539993026 +9870725377848840 +883085477841687385 +16850361761878847768 +8406163815338679888 +9828660055263613758 +2691780374684390731 +18378960206721261895 +15289397328136991002 +13736232186726985502 +10185253761964850418 +936335405003267895 +18367691563416888249 +1411636476823027830 +159826425889975334 +30740277998414211 +1454041666728627215 +5263045704806567882 +14101035093678329 +6098975770044402807 +6213874949885070047 +14280399715629481292 +4330880103466343658 +6283357645274619323 +564516732980047496 +452038239404189746 +2624475535891917673 +2879463126541217651 +10820786480081760466 +6152225697206002268 +7464045521388005471 +2312694796415228177 +7247797545840083740 +17089626560209507964 +830399553392108401 +1518418412034218237 +5299098852907101862 +2287404954 +5995296135639088374 +17822868562129015670 +14383051495922904 +399070328644857552 +6718814190576758955 +13600768769547772568 +16252369836876632945 +10589843901125579979 +10882226880706975655 +12820003494171985268 +18045375457690270152 +15291935475761429708 +10329598802022581463 +5249797151084648272 +15467531569878233141 +2519729684546929778 +2624757552294162206 +13553803778814797930 +27920101075068262 +5198521347341565699 +9632381032491412757 +6444753720828126574 +810485365 +17205605600185760743 +31586288514129968 +15294191680067940100 +18412827985276633158 +814352022 +1873618493337900214 +17874919538333467243 +5136942689772182004 +15293909556188102575 +2156571424271003709 +7268232287483878715 +265909206824074918 +5303047086844761443 +15287141175419610544 +1873618450346109725 +7192291508952957549 +8211561438808265274 +14902316069337318245 +17747435299319928687 +5510290935456543560 +9186160633315744644 +15291089465244522877 +11471899071077109979 +227855569383 +1626892333884731016 +8579829306004740284 +7141297713013588569 +13819027288768193 +13726068525523478797 +15294191572590346595 +12530071023350660263 +2599686195379452288 +10249093731827271720 +266042267409981174 +5565348505908169092 +10367111403802346096 +15292781537867485095 +315050981002062231 +12297532705006038665 +15291089400758738184 +8197562920226992187 +4661538274790419545 +7067030506543600644 +15511121405701476 +7353451355253048263 +6364097374632349124 +11694815752093311582 +15257170146262787053 +6206603702875878073 +4205456914331078980 +5833854247140792677 +4149205691846700355 +7984280505607081911 +494403798525 +12663159459949981860 +6784669707617714752 +4784877285882214330 +5565348441422385250 +6979291791710814427 +11838018326043571318 +15948081610625993819 +18411981910273949730 +2819142239193151610 +3459957951274508249 +5671848390323822136 +1733703100895417605 +17204477474387535184 +14934198676511272213 +451411970462 +6598609717403068954 +16804053178346313312 +1623790127659826143 +12213850990624781267 +6053196318902664563 +2661960728633172922 +5302201011842068720 +10909051778234470338 +11024387943251533953 +1201456932206113085 +5671783934220595881 +5642655383725746660 +15290243390241837531 +830399540495458632 +12267100947878851813 +5556444736474469761 +14480706134748774377 +11023419484990874970 +15406543414162312876 +2522831864975864248 +2316381565674272741 +29612195190804681 +13096880850319843856 +1413892625241101519 +13666367341730158902 +6049123076685504483 +6313103544299712315 +7140451638010905141 +5749614398481126814 +6205475641563423986 +15620565282397573253 +13691481276152299847 +5134111541020740326 +1873618544927055357 +3087006342024872935 +16590518809248349611 +2134674329372531399 +29330122901301982 +8754354348856274264 +9405901672795163959 +12605036789245043773 +2464914730971567611 +17648172288953813371 +11148081311892133777 +6204347614644278103 +9887040236600187625 +8616063509109155453 +2517396823863543066 +15288833291033196108 +15287141227008777729 +7971037423330943246 +6659288664788263226 +1873618501935251501 +12745284836564407417 +9246748604024098636 +15290807435945652067 +14193031196214453590 +12833791847801307077 +13513632884077652603 +7246951522426553092 +6428369928798758970 +14393775360958343225 +15333364303887477204 +5624359730656782666 +1756208976234303088 +28484176870182055 +16884063401366472251 +14464888480988737295 +11965380868552027878 +988739295851995122 +15290807392953851373 +2493017522174178199 +13731144893856694514 +13290374285542320613 +2625321606595284002 +4929903884461088279 +4634359033389206072 +17586017819785649043 +2625039555799757652 +1895116067312455530 +6261263780835249358 +933797210087713226 +17363034096976481766 +14827963881216502828 +14964325028668730773 +797977540607610883 +2422259285738200404 +15954115490261062843 +17329429728385524414 +33560429128452228 +15291089452347898179 +16903543686908309003 +9870727067432732 +13369097193039157110 +15289397366829500878 +9870724571100105 +1521238584658244751 +988739231366199607 +15489206519372857995 +7409299920381748254 +16262948613760825531 +9870724574966749 +7681228410294855716 +14595497223566155770 +1786086408025682137 +8472178325545426921 +10752203072145594970 +9302231356660212089 +6947374277898358995 +6209987891108540986 +16367321068088666639 +15291371468750154737 +14361324507276975539 +14149071737186821229 +17501986292153131004 +503001142086 +15912051102934193733 +10860970016619776455 +5973270452133324282 +16625537648487650089 +9870886988315044825 +201123445727839166 +32150286927996038 +10037814177010577541 +2137610448022154760 +7246105447423869664 +14101030794383174 +1945545869137167900 +9870724602033135 +9870725102073199 +1413892676830252735 +7172189672837431473 +2624475531592623767 +15287987224629033592 +2053847050729835746 +9870725109806480 +15987248322570376122 +3432937041976183723 +8562440839454141025 +14665097992165136 +6020446389058087038 +531434938066020845 +13327144638523591620 +15290243377345218521 +32714354125776199 +2329883539558971890 +14425661019905409661 +492176864 +5301072972026302193 +7352605331839517615 +13516735034414081552 +9870724625232924 +9955911476139739308 +880265253627257778 +3736575 +3063683824201782804 +1382240736443900900 +1873618532030425584 +5335841618940143828 +11078763948222784436 +17625510075942124217 +1785240333023002664 +7603232 +12266871665304279622 +1204131931775315526 +1285019398775394346 +6785332869306595111 +15287141214112143423 +15292217457771893195 +1873618489038605603 +1092700946662246000 +1991460697668540625 +7934866198480432062 +10531295803425490925 +1899651063193471195 +11924686081222719034 +1517290346422481164 +92085357799300689 +12595705938502037698 +5240846595623882520 +4343368849767078078 +5944302301007125627 +4106690257366773310 +1753707611600982829 +10128683564021584807 +14414570535694909648 +1466296550483123067 +5782296444190133111 +2702707693771904397 +1538656033 +11180469596782414370 +538576370 +15292499474174124920 +16373919930490319735 +2538735543 +223556276541 +13009813352795884581 +14105033430019498728 +3935742187522887801 +10574946679535508554 +6209987942697689311 +15092941910516786966 +546309656 +5962976017044672764 +13819022989467014 +9137112300296226533 +1467988623106070847 +1483280048225078064 +2130244209967315856 +5512098552953333169 +11579831075665363387 +688082513325865435 +7508263234226031527 +7351759256836834187 +17896184685483934166 +13727760615341113924 +18260242592087089085 +13938987348593820903 +144207266640260687 +5195701123127142010 +14154340218780398387 +6524975273315220328 +17573925576253140829 +5461104757013944215 +5129024196560097394 +7577630114940738264 +490104500603 +5287581206121747392 +1667395807353463267 +9870725194872257 +5303893093061192887 +10756726280622189759 +2202768234812819577 +32714405714946536 +14002482420025398139 +15528861662009123233 +17205553304798845727 +13693688167629548016 +7399947620026754861 +1200046914677923199 +1251604747722577559 +8992704749851525464 +14698362182057093243 +15291935523051289505 +2360543965963361883 +16415947289038491804 +5075826107042960252 +1254706876562365197 +1184054382509707845 +10224371324217795157 +10681513837308884061 +32996413518662033 +16881139139803484001 +14425661028502751081 +13628483798254494708 +5267137973369917214 +11313200934161749245 +12029554223868637651 +2574760160619148865 +9870724718032052 +7252173878354851663 +5349367342193969300 +7516858275246053550 +4968547803474047060 +15897020169117581844 +8234659837800239838 +2096695182 +8693225804604382234 +883931544245786523 +1415866765854259745 +935489377290433348 +27638024485080008 +15292217509361044254 +15287141265701302452 +104269062 +1604388663 +15291935458565503184 +14924276060582535747 +12701804944239115587 +11570076591822169626 +10198717259626138886 +2043722288069350494 +15189064920767147777 +10447833892469821110 +2786543335960678190 +1023278110615560205 +11272180868443097847 +4196703391028742472 +5408982899762140656 +7862516837036476283 +8648101753792044676 +12638792299038397011 +7245259424010339016 +18067928165929931104 +3997023326150478712 +6153071806601890659 +1247398663569491296 +15225300787363209285 +8840711497449477171 +5675796546877851798 +1873618476141982256 +27920040887323058 +10222252868400125911 +18007176226302805024 +2625321602295991509 +15831435936122153090 +14399056735604791251 +12617306300617747727 +695425898725793819 +492467341594991266 +6155045908522539946 +3780916436231344808 +18285679457129946167 +17089062591890728874 +2058530494952656262 +9870724760564974 +5984819116828544104 +9088103565208985325 +987047132949995010 +5672976434440316612 +15672900150760202568 +6980419865919815941 +2359415840165163097 +18413109984482951244 +15292781542165530089 +13882019050381985812 +13352392100613927803 +17353152791227993399 +2150827921 +1256117005866200286 +15942884970698460404 +6208295844282636341 +154535224 +1399263728876720647 +16481405082022472063 +4272690327276579645 +8249224782332179186 +306888584587319535 +13599745623807051435 +162268504 +5719760881385172900 +4883293725613452003 +9870726291617471 +6599530822203749662 +2848546842312994670 +4481840936535989828 +2013910353068174442 +11193857373218423351 +5895517313225353409 +7560543450718225106 +7402989653604310385 +8663192652060369898 +9870724799231227 +14101026495088748 +1366276539690471190 +1873618261182929720 +13772411546827377241 +16041596221463291766 +1730290029272843740 +6840616336330866006 +10913080833258367652 +12912667315151783250 +1081135526969960931 +5353476798389229301 +2624475527293334018 +4423402962283485846 +434216047454 +18315937183618444132 +651027637967721936 +2719063642933235320 +5570988808168291977 +825323228049451310 +2921887281361598230 +14919199795427624821 +7320744873080480596 +6979573790917132513 +197068148 +12758439102625181128 +16737522532704265320 +7513570841892301778 +15291935467162849600 +15290807483235525682 +6209141854798358601 +6932153041592664068 +16758489844492275372 +1599217113994260480 +6405261049027956307 +814730579734638559 +14941571200560993891 +17931569726871638543 +1733956203816446442 +5248105056967669611 +5569713876685690885 +18067676020521792019 +14859647144389996846 +6815608511867596250 +9870728842082101 +11485232201928090035 +15287141209812836255 +4231361072647513278 +6101796011456140979 +1873618484739312779 +9870724845630750 +13229900389757361713 +7086073675332780464 +9870726849656583 +5193727081392982024 +9073007892708745928 +4040912922788905112 +5674104469956815848 +1359796670366685874 +15290807375757913856 +1252168767630431667 +17270725783305597393 +5778348150065934970 +2504863350589635682 +12749251324732838225 +2308422095814939193 +5516892784510046009 +10788340981746781679 +10690933773821042753 +9870725368870356 +9870725372736989 +17956659416822331103 +17786951977336971320 +7247233521632871178 +9870725376603644 +15398488671254291876 +33842419736262691 +2785415261751617287 +5809763881750778763 +7610997758436118920 +16345377412211956447 +18209038410224642430 +5996142146154742839 +6242240682413137169 +9257080277489173913 +8896873960529668403 +33560368940734830 +1199703894135825712 +2514294433354819592 +16266276988277103653 +16487625412487901473 +9302231339464270092 +5458243702509227305 +7731987238413430654 +16217726513969500065 +9204802053286536705 +2621922293099287812 +27356098361830063 +11823044541028718214 +31022307298722042 +10811104230403630183 +7891322107040189410 +17498884176209931146 +17298949088090724549 +14729829438500719540 +5887235996161153729 +30740256503194415 +15290243424635084882 +14258849865125208829 +8930986418384080537 +9402235489652991738 +6157301992454835692 +282133919 +1870891575748071314 +13514550801202695398 +286000568 +7034233804390728056 +15291935518752004141 +6366353527348466079 +827294030293313482 +15475122141799272334 +9870726915389197 +7380690058883176405 +2073730062937119696 +6368045621465409490 +15131353489256222067 +17685418921550569975 +15290243360149278541 +7437088682075965223 +16579035830826176990 +1801586527 +13257753370198437254 +5725098244401023905 +1873618536328471484 +6205475632964835811 +9851590860238637739 +16875205771930520447 +17538313257810730808 +32996344733579432 +8394593230123135218 +805373539 +15291935454266216651 +27920101073838377 +8140646085958584180 +1309279950 +2187586071678509515 +8698802600193563089 +10585955812599821201 +18322828561274782821 +10592171214073568059 +17170845012500290859 +11584599154212479921 +7140733688806376007 +13521540362471223162 +1313146580 +8574054856993893425 +702355655485629220 +6204347606045694733 +11103300151687645726 +5566476545725368665 +13184621209720017225 +12133813286414921760 +3166693398854130610 +820840135 +17225270010329587102 +1320879837 +3927382993039072223 +8856014178162716767 +18164739397353881085 +8812300966546978949 +1873618471842684634 +14947097198474202 +2328755504042420499 +2574671684330218378 +9808823553120885229 +14637124918310547021 +7352887331045835701 +1147642972238785805 +15577885624644956589 +8660242922972585407 +14520872221653426064 +340211896049358286 +8694008299851746012 +9229327701095566084 +5780604332877290334 +18411417886066737168 +280472367249188962 +6310847490461354333 +12644080636756716998 +5978709954490142824 +1096649176299424227 +309604624463518535 +15291089443749306638 +11795346596544985727 +6364097417622915371 +7563201943020069897 +10867174321591906004 +119263647605616152 +18297946943826503873 +10588211952420530339 +2803776039116021729 +206360352265 +11152341702416414945 +30458248698274433 +6927733971564232885 +13975944257110959275 +5835546354155800462 +13747155969343184280 +13587342997284863511 +15846834169944943016 +8283451379500335769 +2667375046095867310 +15411231774092245775 +13413734718255425425 +8250205168748148580 +5300226909920169414 +7139887613803692579 +10591325139070885473 +494402543464 +18271169786774188519 +16222802744732624112 +31022315896061305 +6178879111628283678 +27356085465189502 +472908582440 +5003335381653076268 +14589915794325717485 +14206226796729214653 +570256568893709849 +17503960406973046105 +17302333254829431484 +6158508796651128253 +1709328582662906562 +17946419673631704176 +13265283525419227767 +8332257643058178741 +16618104504963844264 +7246387498219340530 +6064762127302393958 +1627738395989523145 +3458547852064609875 +987893190756750054 +29612216687416357 +18104757980346194151 +5993604058716791680 +15385861644461105523 +15290243368746643659 +9866850807948729039 +17165169411364360689 +5886835138979262876 +1239351118651478504 +1398212345 +2152339567527806344 +4042040936810230027 +1042835233529212250 +13396276426973328716 +10143775221151723079 +18240825824027548156 +16377260960561127439 +14260541903353704381 +3758412351937846521 +936899394817381034 +1732546186288258788 +6670593046427347594 +1873618523431832719 +1409812224 +15291935441369572583 +1002618918004869845 +12647827813688292485 +5142301044413893986 +1734238280405169118 +12024068814560965628 +15287141205513544466 +17404805271632433408 +5458848651586450378 +15740334337118442425 +9728654856668339388 +9538952392392514815 +10906015674175273447 +16840215061605076380 +7033387780977197408 +9870726550681320 +7374139833057552265 +1732546121802465148 +16260410401649351150 +6251387289329547991 +4214260831948201043 +2772559046802432635 +15292499508567350419 +14765286543110777180 +6045857724930789586 +5461950758932271540 +12853486020814643511 +17070057731888851160 +988739274356778557 +2625321585100066632 +6153071746414166769 +16884510720373249487 +4317033299479761647 +6105641286322975654 +9870724565988281 +5941200120576959729 +7245541423216657102 +11623329650056962408 +10895941273496938783 +9870724569827352 +12004799550310864099 +10800972720340344624 +1047102372194640151 +16958823041360218932 +13396638209728525522 +1996893529057865121 +14369698883313424319 +5917464186933493110 +9870724573721551 +8633463906790886452 +7194547627277288122 +9870724577577838 +8892116297265260027 +5461104791407181582 +15292781524969605919 +2200794145787550411 +30986710659577319 +7882744375621871075 +4434404628262965669 +10756162204825831662 +5400084988098728827 +7659538298168023440 +8542811457568119894 +12339564610979565304 +5052480394653809596 +5464916018441890677 +2106141661137561250 +1463944971 +10107920089263326083 +5339530072598460617 +481505910202 +1735084269426928024 +18000107103088031504 +9870726597080818 +17628168594039844939 +15983582083539758820 +14476603019229426392 +527486618147374507 +11214563466575481740 +1038886995293462177 +831809605312275724 +11398695641569569108 +5299098870104395445 +159826357103636368 +16275783350713214532 +9870724608521229 +7996312456522829522 +9870725108561281 +417020139083 +1518418386239706184 +4206560580458920720 +490931672 +12768368979738320327 +4494226498722153629 +2717880617943654388 +5251489305390690626 +7882691051429049349 +2786543370353913970 +825887321043134307 +12666755182509968756 +5349931443785000377 +3546099851290752976 +2491372 +5973993525963084544 +7139041590390161931 +9192560819121703217 +10913644883260214634 +9440398924256582341 +6358029 +10377426660277831804 +5410675028272312165 +9870724635587647 +13267515303399539665 +11561769728032320341 +13994042902743821046 +14091335 +15292499560156501681 +1814401607628837040 +13284158914162477820 +9263266126380742517 +7558005285896666670 +3832358583564915571 +2625039585893686365 +1873618467543405664 +4972924312701182429 +14933352661695018130 +2588868491370640720 +903780241349872947 +7300201436690252645 +7409299993467503424 +13779987578959319689 +15291089482441834171 +1060718949161911551 +1537410847 +15289115294537556848 +5780604328577995613 +5703451428017740619 +41157732 +9870724666520699 +8208459314266447086 +3062219857732765939 +1839046014815446996 +13317993416463954315 +1893705976699896881 +349639398302222851 +15291089417956048219 +4038578427109921708 +5863211220867690221 +4961410512965945058 +32432389311435598 +29048209676117502 +15279268331817157787 +32432367817466309 +11740202408459642279 +12484048899058918459 +9201704067659476707 +10708867523105803745 +16566338363563140649 +17351535160019927672 +9258954904806116763 +9215288745010357094 +17334296795155016096 +17063535758218916304 +8756710328639778270 +1837917966402343334 +10657683217541049189 +11644549529507011158 +3060829241574036785 +13883199338295028226 +10972295180442558384 +1012105271869852511 +15722184770675616487 +18071902650785863545 +2624475561686560814 +468609282224 +572130880 +72090807 +8253013595490370123 +468613143414 +5056490867517584283 +7890538549336038385 +30740239307253730 +8503894835705163739 +2089265852158775170 +2265111940109648592 +1626046297573316170 +92046654288647113 +46759182496631581 +2471556026839752620 +756647600093 +17825755834711742948 +3178332733848776213 +1041143135113000526 +15291935501556069217 +2624757578088789094 +1993727787820991914 +14273081993166851281 +1595410227 +847832260416057735 +3764031824902033828 +9870724724520136 +99157234 +6832150566454453333 +3781972879453334959 +13526334602625309658 +15290243342953357605 +18002638457266187003 +1732546181988971170 +6166185757668424714 +1873618519132549934 +5460499803636173842 +15287141244206066573 +13806855580317125955 +8242562759948259786 +3528621854514553111 +332990405181794087 +6103488088375974636 +3759074492607577036 +13529168416684907735 +1873618476140726818 +14665351642484983 +4161540704950758454 +15290807410151138065 +17941907428384661909 +10369289955208478376 +15290525359355600553 +304119505144068804 +7619675585940449250 +17120891958370710093 +1840738130429043597 +9870726755612418 +2625321580800774929 +4417872376026175381 +7130346322594634771 +1144540856295560939 +637863508 +5722444603490653163 +17685702531321644963 +5512098583047253736 +16779606114112197033 +4526456999607161820 +7877405155279521729 +11968457278983858892 +3863710205770684833 +2926114800292874433 +5835546358453836520 +7978850616169091608 +8348067735519772129 +9009022494402619718 +153290026 +12822961480931891735 +1623790196446280538 +5565348467217023481 +11086277220258427136 +5462796881224796545 +17122305285393487995 +12204321353354716271 +13853164599648330116 +4197831482435132115 +6979009766709919951 +6998742371176374477 +18411699885273055254 +15293063506980067679 +17619012718255228942 +667410241494334138 +15291371442955631012 +14388795679132697565 +10876344215514716818 +7299542677140683259 +2796306127085596242 +90526560417224428 +6743921257827752952 +931541139053428654 +7120267569582534002 +1730290029271597409 +1847659236867118501 +6928015970770550971 +7452748519230227475 +32714392817070869 +5881020564594848410 +13944144563809176308 +1873618239687712786 +15043322274587564109 +648660777476846273 +15462458055234171442 +4141551246163851657 +16250929785657232843 +15293627574177845071 +11079604007982747283 +472638123518667453 +10591889189072737947 +2784789629624675467 +10331044321950588855 +2333704892499173383 +5318844751419437477 +5537746412217581132 +16704189977091331861 +10760392485259723716 +5455423538481273228 +5570988786673067187 +5641592912387529778 +366969508515895588 +7034515855186198922 +15293909633571908228 +70488873850850782 +11908378959853526747 +1873618527729891186 +15290807461740292038 +6041909482395757217 +1894834033713048546 +2054874474321823305 +38835447835012918 +830963590496074556 +1041707189414158096 +8059269041518565661 +5677488671088726324 +4959080478982475834 +10684090243060806471 +11476585613280360892 +6874933480867500976 +2161929761716788687 +14622810224014614164 +18019610811645893161 +1873618463244108107 +2625039581594393157 +7161700558465287167 +5352762575340513185 +11176433417179046304 +15287423196121342030 +6156738032733402975 +6153702801206038886 +14652089689918236380 +18350984080067481271 +15292781572259468607 +2558626555980503155 +4756274120448559372 +1392068364884000500 +5516892784508819088 +7397691497403327517 +4471064719797348316 +5565348518806174015 +6524934309752822305 +7923736154818961912 +5592392921167110396 +15289397349632313371 +9232993931526352312 +6415222970935285018 +9870725375358451 +5938098004633725980 +3811652717180905320 +7211896323698996472 +2914709013123774150 +7033669780183515494 +14335721899955676951 +5197393255935321214 +9870725379225103 +15219090238908604187 +9336512047641670935 +11636611028735501479 +12663355854427731763 +9870725383091757 +9463915760276757834 +15292781507773676992 +12316955641894035298 +14101056589030378 +4437506739906835197 +11955740269026953494 +14258849908115795343 +14539682522037107578 +5882159700913700175 +10276036049511466810 +9720112096191341434 +972444831067156991 +250884895352647058 +15184207041518052684 +464309985406 +2840921393218461125 +1629148465105621258 +31022285803508643 +802207808143626587 +15167982246001250713 +2146416183109427691 +9759732344438734517 +14346663404917583211 +15561569756853586053 +11602995673295907911 +32714379920410781 +13914483543239913141 +5516046752497929776 +14383072991264828 +1251604721928073068 +27638063176376698 +8309445823562473369 +2416715528337840263 +7818890396069158803 +292488647 +16891689624999392124 +6217513450722445667 +4790241261806381039 +29330157293275120 +9398797421263332714 +27920122570436656 +16593903001781686686 +2053107091409498174 +10753772974326626546 +16152901408141622644 +11842965961515801714 +17299513090801489238 +1873618514833255027 +18113807416795337300 +13941011578730799368 +5458631525329552020 +17063898723268978951 +811861632 +14373366486220484099 +4977791646651668830 +13519566196063562287 +6927169947357020323 +10481529128982897787 +12817829069477385284 +15288833260939385531 +11672803028900859926 +10554335258691243712 +1041707176517518796 +33278382632420494 +4170129077182477659 +14460252044543938199 +1361206713689532785 +9870725948864096 +17092164780919637584 +1323501280 +17279695936641176756 +5511666268923246812 +4473117350019076740 +17206111748367330526 +10913926882466536739 +17090190593015371008 +13070886371127466925 +7139323589596480017 +33560442026483775 +13832769549366859333 +3749134244271891892 +2625321576501482500 +9548671834934503090 +13819048784121247 +15289115277341642731 +17089062566096236243 +2204229959906895121 +9609301821825043307 +5890382593019505075 +14494654614837472639 +14249142365020712245 +5835546354154550773 +9300257224645751348 +10965002685862060833 +7488254867681055353 +5461104782808583909 +6070633714457193404 +29048192480191807 +6098975821634951352 +7017843205285164829 +3698377064120455233 +7300483435896570731 +15291371481648157764 +6364097353135892893 +15996675103344779877 +828425408479844917 +6360349248204127113 +17628048184875428023 +1366034156 +15289397293743894521 +18208198535270704629 +4046395373324486103 +18101359711064496043 +472907330083 +5569296752742654591 +2727527756201598600 +17009624892008781948 +2153057073357728791 +7300032638221960104 +1951690094359832233 +8223467025204212233 +12713221567559512541 +11134268303975201487 +9421686826977599290 +32432307629740894 +6106202401204039808 +2361671975685338354 +29330208882440766 +10792923893979177689 +14683276054533390468 +1873618235388411568 +8328513465440672907 +29612216686167693 +7516081834097649101 +7032823756769984846 +7718197728942432608 +15591448436321301226 +12245079979070732331 +17299231091595106926 +6097847760322520776 +15291935484360150547 +7433986540338297739 +2624757560892871843 +18063211571015987672 +13916497988962505323 +5993604037221555254 +2411664803811383513 +18089224610120686537 +15291935441368345480 +1571668334895192915 +10405159077555017475 +11773758314556779717 +1041425177311144253 +16904712944498910012 +2730758514787295353 +17619294665872390242 +28202117477509969 +1873618501936616332 +18403096819327721261 +16437512667026442765 +31304246317313542 +12590065597550705397 +14259413854939335160 +7193983603070075560 +12756019744192614745 +15099182159839962753 +14304069401668103002 +31868356506899987 +2625039577295102544 +1873618458944819238 +15995643366203073184 +5831598115918777559 +16879729031996207110 +9870726057129598 +9138963602338287300 +13237708535585570819 +9599768174033064471 +684134257892941248 +1842430228844014375 +13732283957089946624 +5248721418518860973 +12849535816273515847 +12483484823262537623 +10927490846285832396 +13391406225630444514 +8629091087366833059 +7857417374369335809 +15982426378970620300 +15291089409357469672 +15344331988932124337 +3041426937126277956 +1508117033992663628 +9870724584065410 +361853366456821191 +15288269318413890579 +1930668203255024244 +2719268023842509485 +9399122277208116126 +5462796864028884097 +8456214898278286307 +14101052289733739 +4397482886344480317 +1873622667825208251 +1411918553413127334 +10775484697844996785 +12221849008989087493 +7880607072284139095 +18157608498967832039 +15291371425759702632 +10800479445230693000 +11930419845017986269 +11176273900772135875 +1252732744547922454 +18115683526094563558 +1651820617207601562 +8692785013085990833 +6050251060613050686 +7293292946252047947 +11501873228661418465 +16602804713776357694 +12644547810388085747 +4728361332586319732 +15530271666638163817 +417018876556 +5995296152835132761 +1873618243989631401 +422517309557386983 +15942038964482237108 +489686484 +7612019564176299762 +6163190042159568373 +1777332932011954283 +3641272205610733853 +7558005371879034363 +3870997034531753627 +575239712866635559 +6461237554091356403 +9127481006617859713 +7299637412483040083 +1627738361597680013 +2676033351739312369 +16040216177439937650 +12391274328196594200 +6192048672250678714 +6041909508191621713 +14770363635410092006 +2145831495932714731 +2830312599839009596 +1413892590848002652 +422663350165586012 +10585955829797098153 +2395927253977483180 +5249797146786735941 +5248105082762304149 +4777328079875302507 +9870724634342451 +15287141235607497372 +6204347623243014884 +5778348218852403909 +16873513682111570680 +9565191053992735873 +15293909573384163532 +9183502703411752140 +1540450679473650552 +4478021395286069563 +5885976078596835622 +5727354422913011226 +882055441458867373 +1464322427066011076 +17502053046013550704 +16793153298366748137 +1873618446048185167 +3489386788179551050 +2014487363132002995 +245051625314 +5884848051677709714 +3001971585049045291 +7444008460096842013 +17219576355391228484 +29894155705980337 +2036205445 +5347351719937378487 +2625321572202189845 +9870724661408873 +8083932538096205607 +249849483538008553 +8023447631643684941 +39912540 +30458265895589209 +17094420907842557820 +31243254108805162 +13863504285787887148 +1981544248950994330 +11288249707613806934 +8107633101452235030 +7298791337480356655 +6342120543023879578 +10058027387697447972 +3387142623027022372 +9989062842342649711 +439490216513047947 +7171706723174648876 +1575898563739936006 +12598689303945959538 +63112341 +8901793105613516555 +563152432 +2522549865769689670 +567019062 +570885691 +15442713712222878029 +10589633049251956070 +14210563131035114928 +16980449458069248289 +5196265211820249768 +18143576396795037593 +14891155640775045542 +468608033684 +1118323118388038380 +27638110466238192 +1574831916 +5832726215923752808 +5141454935019371137 +32432303330446946 +30740239306007100 +5511645657542824553 +2204460350425091174 +83092815337956110 +6154199846417866100 +3734950395625869130 +830399557691527051 +11176546808036614555 +12270002031873435116 +7801663844435514610 +14383055795351369 +985223082406925265 +1998795761905651225 +14431204815269019157 +31022225615777133 +1939298784770471415 +97912031 +13598617575392636275 +8664854889141977247 +29330140097369354 +17033744793357343193 +31586335805361333 +32714319732684307 +18304136017468875420 +14637903957824966108 +4959080534869678921 +15528861576026870906 +2624757556593582011 +1145668896112782533 +9021496992187490895 +6829854314988120316 +100077101650229230 +11294291098333287955 +16629894599874205281 +115210490232321265 +29612147901093924 +11756135773985665610 +1991991098769615699 +14911447610171656258 +17956211265708312542 +12929336513373093754 +1732546160493746260 +1873618497637322028 +1682680391473518261 +8905421980220404426 +12069467635392584406 +31304242018008282 +345184634366670463 +33278386930461399 +11776869488740733563 +11076891475999680409 +10331572886748677681 +5356297039799722580 +14056767300275890768 +136602088618283720 +3666742271342296888 +1785796044663495875 +5729046452542978971 +5516892818902036036 +4480193273419164970 +10305743330715660838 +13294897524111587141 +16874077736412719899 +6261263733545503803 +13726068529822895233 +15185951166044854742 +6927451946563338409 +16171553699386190354 +13819031588193568 +14930532536359593554 +11077917976397097095 +12155591473290041238 +32150368609849239 +1521238580360333554 +1840738065942004734 +12108985011499913788 +8864802475807090195 +15678048125207403380 +15289397341033737685 +17512680617242669601 +15289679370335314137 +155911487 +520197198420 +5464488945247998405 +5991347923196709196 +7799373112474159929 +7436285990323968518 +159778116 +5343185758970927986 +7063042752901637025 +7139605588802798103 +18144287363223279391 +796257100978598870 +234893961197867363 +11589943904033663131 +6806854984264730851 +13396082089821356296 +14101047990442038 +10241156380279779857 +209763203034664663 +818063611860166725 +158978436170930308 +12482356800642619076 +6762036744137224427 +9870724800607492 +1256398970679485894 +8332450570656445168 +2624475548788672034 +1998795813494804357 +15289961386737554743 +2791055594105670401 +9288819099220979927 +17528022603826350419 +6653676380367561746 +1417558859971390426 +5793852920991191417 +13762870397868067688 +15289961343745740873 +14593427669827589744 +6473981399990954226 +4689994313342928586 +15140097999495499283 +5993604063017447199 +9870724819940620 +15688521365104708541 +10320989085193885011 +2719347764409950419 +7290339324003421430 +5496922373131626252 +6097847743126594058 +31304293607147500 +11780957597320497767 +15288551266031063521 +14939879084947609329 +17837453566692251563 +15292217474967933886 +1873618506234685768 +5405598728725530840 +6456023583136570155 +7196582215243931218 +7732782016354589313 +18153064162178059736 +6170749808377011330 +16427545104100581119 +7211332299491778185 +7033105755976302932 +16470125690924584882 +5831598141714664360 +9870725347046863 +12620665318346658155 +6365225478934038500 +9870728847324985 +2236213724530673692 +6304798526084242013 +8597156797830206890 +2625039560099180808 +1873618441748894000 +12020684574736648728 +28202057289765675 +1733363542 +15289115311734861497 +2973676922841153012 +1007582059095416643 +5270521238077072809 +17989427870652511025 +14432668792915513799 +14430173329638385718 +1403164865030812319 +237110664 +8810391670700720015 +987047141548705749 +6364097430520945210 +2530175340658847637 +7194265602276393646 +6153353788611041818 +15687337562302075534 +9870725374113256 +437798118096833917 +16281544167465775624 +6364097387529112317 +3308118261903722811 +13487842911011821561 +13302722670275794143 +2789363573071888247 +15920335005095366630 +9870725381846564 +18249889854079386913 +2709909863184877190 +11245211862795826389 +13174099600966504023 +8514628424817727840 +8496115233451488710 +1760429914 +32432363516946892 +3695785885653940498 +5462796868326918929 +15449764483597276513 +13922694655813042888 +4218340464526913800 +2368903240497371393 +14720813411196297163 +10377761462107271507 +29048140889812019 +1344877224227128935 +7300765486692041597 +3031237456602021598 +10233694917695591014 +2652485244263484030 +464308734378 +16646707010104273772 +6290220066505710979 +7119982482055194241 +4000797057358045476 +16041596230061991434 +8638148913314294840 +16075180006270249 +10863510053166139557 +27356055371387646 +15291371408563784955 +5881302580998508412 +11685864050244016865 +15288551317620223171 +795149922 +5140044853005404858 +27638041681140223 +14383051496057442 +15291935475761565242 +9563985093663792945 +5862768037449528098 +7138759565389267455 +18051696935085562909 +5196829253224778022 +15787693227923478798 +12636173248644995446 +8483415125258481856 +2624757552294292062 +18181080380580382302 +13553803778814926632 +5996988186764335476 +8125591449130987595 +810616438 +7087765769449898475 +16516307938144509538 +9373626575421644363 +31586288514263679 +814483096 +18370210118498347032 +6360390292413492186 +15287141218411549206 +7217242499843363073 +1318389466 +9870725943752286 +15289115363324026876 +18214565962260628287 +10583135721657607333 +18332501117187682583 +316178999322815536 +829835572176903487 +12118995007347034777 +161380733623423332 +16163352099225169901 +12385798487652112459 +7299919411689358169 +359083517852019816 +1873618450346233173 +5409264954858295919 +12550808634470385197 +17092164759424404325 +1147642972240173499 +5726925958800624390 +9389031138955568283 +16262666567263526348 +1842148139357400616 +5729046448243695153 +4273355879183562937 +13729452748150740984 +6925759848147124333 +2582577477291040769 +227855701273 +18147141886506247071 +11076225877980886072 +10583135657171819641 +15294191572590474399 +12913844036114204820 +541394510512615255 +13819027288896941 +5672976408644578166 +316743096613097945 +13228094635257762412 +6208295861478694670 +5464488983940525962 +16191113565432457819 +2445495030695014036 +10069036677305099476 +14473139378666215094 +1254142856655818849 +16383116559020531817 +15745644891311120536 +6657752876032334862 +6362646389242424537 +30458205707835936 +4383565972027616672 +553316173655849374 +7086919694447215047 +6423213095607547179 +9870726994097942 +451412119984 +14900213215261693826 +1777050885517162610 +8424561207639691779 +3143159605220479919 +9302795415260770991 +31022272905631700 +15291935527350704808 +5249797202673938308 +17823938822072527247 +7193419578862862998 +11781590272624962395 +3955329463884852949 +9202569951037052432 +15292217535154433248 +10803094198805280921 +1992588707391933066 +1251604709030191656 +2395801507 +3685635809078677586 +7288365174791693042 +17619294708862966609 +6151097687482832224 +7877020788540263169 +12299775547791052891 +2947421243242255604 +8859398409388577612 +2531021368370416782 +1873618501935373860 +5041159669577567762 +3534442396037431276 +16351995421707809143 +15290807435945788056 +17516169188842411223 +33278412726356612 +5098241858427578358 +13944426554416906961 +1154748910884053666 +14815596685297214988 +15293909564785575498 +1464040410663692713 +6525821296728881183 +9944522895650614095 +14264490150188168511 +6101795985660391972 +395562737344079839 +17224768959671249100 +15375116627154452053 +8385438928387447427 +15287423213318653226 +99231138423202157 +2625321606595415023 +1027501559586053107 +9213319722374288656 +2607103221127007915 +2625039555799888102 +2836768977364278911 +6875872028473769793 +15291089452348032242 +8707929775530729150 +1684594439441831534 +12911821265943675102 +7192573503860179570 +17564225130024154385 +7888341864134085814 +2446067626 +9870724571231179 +18414206479632118086 +12622923746538427454 +1779588998748320625 +9870724575096064 +15827194619374489592 +8961523727179725051 +14592299539730092034 +5888796311410064180 +8254118302865908154 +17089062531704374394 +13523514438597303576 +3305725656989834201 +10416042942961112008 +5896059788477882589 +2912231556061550417 +6993874441261166970 +17646390544367164312 +5300226918518891662 +503001254706 +1218076211525591437 +6743921283622393336 +7299073388275827521 +16074403774197674816 +13735950131632297975 +27356094063919871 +13143536835617301665 +14776830432800886920 +12137763800564652489 +14101030794514693 +2208983649183357200 +5344291102832488016 +7239069803025664444 +15289679310147568618 +10944945415837068180 +8626938315809377958 +3404370981523179450 +9870724606030855 +15201334258774400856 +1903640920853057425 +16520488959599916544 +17983605292098133627 +438515478105 +11042190982947632025 +1790926390050643571 +2836065437668435361 +5198239326640150300 +11473102108028714898 +9870725109937553 +7035944040138089773 +9870726113883797 +18181674493324779764 +1988560765 +5248157445900799128 +16860434658287115954 +6517011693716180816 +32714354125903683 +9870726617790200 +15290243377345349160 +492307938 +1693170535548588864 +2721642184023499258 +1251604696133560809 +14383047196761068 +14997655516592102606 +1259429382145270300 +15289961326549807718 +5725098261597081044 +9966772835707134727 +9870724625363997 +16546581931563052732 +6097847747424642456 +361675971417280518 +9301103273853920997 +3867649 +14386655907412250239 +17867978366535231047 +2624757547994995695 +1386796956420346381 +8777599963281821634 +7734306 +7329222073103763285 +11600953 +1631882651478527071 +12344076903517863722 +1205890305561802917 +8112311653099986575 +15292217457772027151 +12661099740401640118 +1873618489038752978 +15294191675768790213 +17462509665872383919 +19334223 +6206321746660256166 +11637858186298997810 +3978649049711142778 +4198590440937249132 +13303564186159091720 +9713395898231444199 +16146849156833550336 +1873618446046924380 +6100103835655035068 +5572365175565008961 +994883495280134866 +6577969361226586204 +9777290512356626023 +9870726160283298 +1884114781242153780 +6153353835900911017 +538707443 +15292499474174252706 +16541217131543942121 +15289115294538938876 +15519826062115491195 +223556407208 +9870724667896969 +15289397375426962155 +42533995 +1146232890226193423 +2287719346835518231 +12425792594693006844 +546440730 +13819022989604606 +13766884099731645578 +6440281088642261888 +12435788500255787234 +5780604285587580426 +12600530117761389477 +5138018131179803353 +743599530638583941 +7353733401749423064 +15049821920487101580 +17783567759009272239 +4979381721411438547 +8465882951412433283 +11645598856682430984 +8365389529913711388 +15289397310941171387 +5938097965942584404 +4709060078846742328 +18001524892028126994 +490104640774 +16862103730560529067 +17020869140155612353 +1576180593040251309 +6152225744495973527 +7268001992456681885 +10235386986018066647 +4018935546784147094 +13095430805592295264 +5461104714022270291 +5562931126634032160 +2729219867515824626 +15288269284022042755 +15290243428934496910 +2989761681675849479 +13626565541769401812 +17152685971422981223 +12991440749542262298 +17863775709192723618 +11776016724695606232 +1890885821271929350 +13925023889216252885 +32996413518788023 +6686510624830812644 +763377330722387574 +29330183087925197 +14900923026718147497 +9870724714296471 +7093479009436063805 +9870724718163126 +6368045625764818445 +15377479740513021816 +11891037153169383344 +9402235429466616558 +14273081993168251676 +9870724725896406 +1894834068105030711 +16425638839461285451 +35191393466920392 +15291935458565633177 +104400136 +12376142831371637391 +13945283648537564056 +14636944485776181357 +4434956933160179009 +31586314310147296 +9386257309953700411 +6926887922356125847 +112133401 +16760866171987724 +11033411317947120168 +15292217466369355112 +15288833286734041922 +1873618497636076004 +7160656041636872842 +1873618476142108126 +9675056238046940092 +681145240220995128 +5831598133116083373 +27920040887456585 +7439351969672861390 +5140326852211708841 +6409817306512437596 +2625321602296122622 +13614615898053882521 +16427873138458768875 +14520872225952833782 +14919763862626711246 +4148540773936141234 +5780604337176710042 +145215777168242087 +7088047768656216561 +11914640296408082929 +14095300710942186274 +5303047026657137861 +28484108085248033 +10783079664800386428 +14758160561175484694 +18315091100018565590 +4787593738391804445 +5782296431293635493 +8697674543180563780 +7967657551273421726 +5570112874703564583 +9870726276282040 +12922846182623948623 +2414366301109638804 +32150347114635911 +4603419666167000069 +2390363305266057276 +11294266987969080149 +154666298 +6383504781677257708 +6864248866757432355 +15289397319538533314 +498701975383 +11702319017904717188 +16153465402254959366 +6044165549130848751 +162399578 +6926041847353442419 +28766124487496165 +5994732081336831637 +15739206228516279559 +1824223415442236697 +27356089764622697 +9870724799362300 +14101026495217607 +16871257559488149065 +6178399515959760179 +15287987241823847532 +12059258463049298396 +965684883864894064 +8816714405632569799 +1201738987299826446 +1890885829869256299 +9557904511767362178 +10771469979967885227 +1167049768286691731 +936899463602596488 +434216182981 +876713268353905688 +2156289463756088874 +5522619787665870860 +342928503145893145 +12828601821883287892 +34406435345030319 +8540508668388398914 +15288269228133596679 +7032541731769090370 +30740204914162486 +17425160200172226396 +14995963418175877042 +11229884474259869054 +10247753748507467013 +15881163575329493366 +15289396747527921171 +6995388121444531954 +1873618549225230383 +8900822134279789179 +7942152859479710903 +15859000273729254254 +197199221 +195728855030451384 +11503637287700409891 +15762397262040946025 +1884960787459746776 +18191916065508500746 +6981547935829721390 +1873618527731258850 +1841584106552848185 +15293909612075427254 +949171281457278474 +1732546190587677042 +9106532716476055323 +15292499577352578128 +8983295826499546123 +11846258745807154737 +7193701578069181084 +13125102973793607246 +12058130328652561664 +104025378577266075 +9538952396691935159 +14259131829938449927 +1873618484739460298 +434654902054570367 +11425304713130351240 +9870724845761824 +9870725345801678 +6050238105327328814 +14266293419834890448 +11589401835157614731 +17877509356004053037 +15287141166821166360 +28484159674410454 +9117265770471249763 +15290807375758040125 +15287423196122729198 +5415236518388573270 +104307364887021771 +5512098613139945610 +4085763651017778923 +1464040350475965501 +6525821236541144338 +2077627859197311022 +6154763844830504965 +14158499169996196956 +9550801396076787043 +219257113389 +10757572286839923422 +3780916401837002946 +16459447294307932445 +12611198514295888750 +15289397371127666106 +14240769115040150377 +1467988640300881514 +9870725369001430 +18326607125140366656 +12804866717273492029 +12271613223219962434 +1413046554536599174 +2048016299960186898 +1412315415600376201 +206496106184003257 +9870725372868062 +7924179306407548411 +9870725376734718 +1411636519813729756 +13679247607121524036 +5682914168999269486 +2478999941885868838 +6980701860827037962 +18413391979390173265 +15287705212524970719 +10356774878206323784 +15289397306641888764 +9302231339464412929 +6981890464072481711 +18039596185714450860 +2152216378620980733 +12166201838644829561 +18164832363680980961 +5988283756484119198 +4259434058519893856 +17778250071320304201 +6162654095497453914 +14000669212585107224 +12957276696313944224 +15859526965022960438 +442813529944 +7087201745242685913 +15287987228927221647 +10695941049625226775 +11246066946089444233 +4278716355 +1529157678494199128 +17150122061001608948 +27638084671715745 +282264993 +952799931069514057 +6366353527348595998 +11847104721929596767 +5509410202188196684 +17791686118470801421 +7883829554400082142 +11193857317330116209 +15725124231821148266 +286131641 +13137975441279948625 +9721963210361550550 +7299355387482145607 +8920924900716599085 +27638041679915276 +16858460496178728737 +12665415612666228960 +9824887415922503212 +5135521567145151109 +9896294839303090510 +15290243360149413181 +5620239770592101772 +1893142021279133035 +1873618536328619699 +883931539946607141 +5203279258817884767 +7194608100425405770 +15692721558936031791 +5515050513045736992 +6104586261132348776 +1410790444811042419 +6020728431256359742 +11075661853773667635 +17090190657502529111 +15287141218410304554 +16730401300547984285 +5168699629008803921 +5356475488652378062 +13283720445667456772 +820971208 +15992827209953257464 +17417861760051523405 +1873618471842814787 +9409295226592058617 +2625321597996830401 +15847962188265705454 +15290807384355393965 +33560463521815863 +821147663836515435 +7086355670240002485 +6344476675021678260 +17634738440501084188 +4396379171791444860 +14159046612948228656 +1838763959720828168 +5783988512512742635 +14772210831162307111 +5259808874432453437 +7142560854578837006 +1836517230 +14034799134864058575 +12753199623155225705 +10153395699861238186 +1702123610703030368 +17940649545867283927 +12020126521146283610 +5283092403269876579 +7534809518349570880 +10489348592104705957 +12637664203334294840 +12500216025869325574 +6364097417623063507 +5720095940072782545 +8694008256860068266 +1784103933350605506 +12266254864277703318 +15292781537866371877 +4253831694270226695 +6912693590870532334 +14395573755353642936 +13669583310056006991 +5813986321423406818 +7395042549638650332 +8858552368779105626 +17465165077596031696 +7192855554655650436 +6599094040315450146 +15291653510947225427 +934361247193047950 +4275101731088313776 +13776701421853957181 +14578349402296176684 +494402673863 +12269921081813121463 +1165075662066773223 +12826571498698443910 +15055604049392244634 +2791055632796964811 +16893287376696974862 +8911802252948878334 +17513349011919029734 +30740265100651496 +1168553442637402264 +10259573046193884740 +5272120000921867512 +5516046782590618303 +8940916583823070148 +16075167108392973 +10756726263426409577 +15228383312902708193 +13824860123674654358 +1873618256883765852 +7409863957487105460 +1031583703477396751 +9187603783719474637 +18077901738905053581 +429916882975 +7354015400955741150 +9927197578428168298 +5569296709752221949 +29048106497950689 +15289961360943036350 +13217980679450926591 +7241043917845578813 +16881139122607699672 +18412545955976642617 +8695136369761662136 +5249797181178710087 +11309390084970334039 +3850502710603302744 +6979855837413507314 +1187792030925012870 +1042835233529354132 +29612173695716803 +15287141248505492922 +4228883117531687867 +14782591063706199312 +14523863439265588071 +1873618523431969101 +7192009479652967008 +528332736142008764 +3577503648416544388 +15390325188602718250 +5993430486462644438 +2691363941378636820 +5249797116692942313 +933797253078413388 +8233961467785401539 +1717145660605813801 +15289115350426150666 +7141015683713598028 +5645056620059299518 +12273668189219863928 +7047658320246171879 +10908850595815169266 +6402191896111689259 +5303047073947020081 +5405598659939207289 +10225964751841660598 +17096003496647471815 +1432832873447177303 +9870725054559572 +14424532949994507886 +1997667704893893140 +11468510220170511995 +15229092105688118 +3073660975119364542 +5370706211299075507 +5744522418110153479 +9325027096347814400 +9870724566092420 +11878630053446879642 +12213795120255867404 +5147383464173326307 +14337715982133304942 +1149335053459206969 +2441545293858411959 +1197790787756570109 +9870724569958595 +7721139341596305265 +8990319004230704003 +9870724573852625 +3058726378331457583 +15292781524969737783 +15142404123505685028 +5879864397206929293 +6152225778889200040 +9245620521216600424 +6199080689898563124 +4197549457432995675 +14975681650484328111 +12427099071115699399 +5411521030190797467 +11829894516969401777 +15462816074920244586 +9870724589319147 +17151509585123765141 +15833521322698554990 +481506047097 +32432337722424725 +4227739705024253266 +4838344835412355263 +5334650189024599814 +2624193523787787152 +15289961412532197180 +9462223648962583564 +7085509646826471837 +28766107291571409 +15288269275423461702 +6536766704526307445 +9870725100959073 +14923712027778116579 +8631911307282179229 +9870724604785660 +5516046769693999969 +18157949162009812971 +9870725108692355 +11294548987175379858 +7183128486057567041 +8075071868901140660 +2612746777858034974 +12121874704610963031 +9337115527177132187 +10067399823217348798 +31022238513760255 +8790845827308403745 +439094096018935916 +882239441530400235 +11078361536363433841 +9399866244694620927 +12363581403452875633 +7246669493126562551 +931505869076916209 +1069301756133922241 +11461030838125679594 +1283514807532527089 +8277079119226297987 +17607182983838567216 +14971589287276927142 +17685914652015138405 +9005649368411410844 +15369688544068648930 +2622446 +15292217500762592342 +5463792384398545168 +935489368691990538 +5697191325465977440 +6489103 +15472987930905498113 +14295407421965226656 +5887799994573981719 +4329752059351341657 +9870724635718720 +14154364749179470311 +6760362462859049824 +17480593072628501967 +11235855143634156183 +1198918814674542866 +3398915934341379803 +17810613830376494950 +11164094934344948946 +4527848932273826683 +14424533001583671682 +12060104477863059875 +17466346332330612002 +1873622121829657384 +12063206628200697685 +12099752036348412944 +2545948228170694227 +5778348197355915671 +1873618467543531659 +15302298090060781772 +3191712388857011804 +15287141192617055191 +6313469283866600321 +15289115337529506462 +6041909422209375541 +907297515964556180 +3416228198089781067 +14767261450680549899 +10655335579542122686 +5727354401416547041 +9870724655051861 +10163069590560392742 +13726068564214882503 +12751507524739009762 +5356297009705912861 +8971880411373046210 +2287521282109367047 +5197393303226551064 +6153353814405705740 +15291089439450148190 +17382811658617571632 +1144540847698373362 +9870724666651773 +541328895 +545195530 +6364097413323755434 +1839046014815571308 +15292781533567073670 +15289397353931755322 +3875793754648152694 +2843741509955444077 +12500216000076059035 +32432389311580947 +18179418362103996466 +6205434785478762086 +11171834454140929943 +5875647804285668312 +5996142128958942783 +4438189719316611552 +8265177372236934623 +810278393373483946 +6231742805412762791 +8565132145265958587 +490103394968 +564528692 +17811132529008909422 +15082607003165153399 +1629430520200585301 +16986559721201292486 +468609402858 +72221881 +16876615896935173712 +7352323302539527074 +7931231846053735111 +6140108314426091432 +6205475723246636753 +6926323898148913285 +15288269262526825644 +1873618252584474299 +425613749323 +5728050170100146452 +15287987211731279342 +425617607080 +17653420728958600665 +10364150078460676759 +7998758032445760312 +14383077290696557 +2266898657653040227 +29612212388258976 +6641861280600703651 +82548115705513758 +15291935501556192084 +9870724716917930 +5509410184992276979 +3189738338525527424 +27356016680241656 +91555022 +2624757578088919951 +8908700085416497445 +5249797176879436595 +9870724724651209 +13355512081315090985 +1441063386750527461 +3415946190284857310 +14428924761094500200 +4859767484456777592 +5567604576942691550 +15291935458564390944 +7087483744449003999 +17013740960873193202 +6749479202064246363 +31586314308895827 +2844912017228900993 +1518418330351396977 +5558136804797002269 +1873618519132689242 +12275078262635248583 +28202134673578407 +2841982591601491282 +5352348771470176679 +5624572982267431263 +16469918826902269995 +10294860376912959583 +11118215535264222121 +14490988229158572323 +5249797112393657833 +15287423252009934008 +2834870062605946407 +9047160756163518012 +5209231736240807141 +1198918801777911680 +2573543850791168225 +1125314915933235255 +1764178170326967109 +1873618476140857962 +5497607428827274681 +6380846095994142267 +12815175355945470766 +12796285906307986120 +827579359271743685 +15290525359355742676 +14261398347457710594 +4069510312544114130 +10647918455472475750 +9527547870932258110 +1300970826225903398 +8208177241975905308 +16419738180414693854 +2625321580800905782 +8040647531058127149 +3241336572904953818 +3935460166821431359 +1609691227769165215 +3612294399218557794 +3655854607192904919 +15278816674640185734 +17284241873202253426 +14749580058850431702 +14525678288269291711 +13780637506563354706 +12712087634510638165 +7928975693336365885 +17132010341357071050 +15291089426553532509 +1626892316687684236 +13307798926833552077 +2844880603282488429 +3793164223678002967 +528614683759161488 +16270286698862744508 +10320637572337377507 +153421100 +14015938822769559012 +3664204166709847431 +2731257686060980723 +6471725260171578694 +11372167720875204783 +18324221653005116736 +1990666252850702238 +3893100303535847255 +2147544192832849818 +1815161925519811790 +7252182233586352812 +13729734747355825144 +161154381 +3561302037904643045 +1572232290317456011 +30458188510677309 +5386208039263943659 +8799952833503831462 +15288269314115971432 +643025413929640895 +7242736050653848114 +9870726290503357 +12198029587825179945 +3573803894998306448 +18413674030185644131 +10159392366806265990 +10846196352290799203 +5779476297360880095 +32432333423137434 +14922019929361902027 +477206760322 +6980983911622508828 +448372043365427978 +13515158333216991369 +17057022104268446905 +4983841778875519619 +10608900034457903039 +2676819902 +17131100491778175603 +17307138582886700813 +14472814467718459799 +878291147406188045 +15288551330518208409 +10875081212388725709 +29612220985601058 +15292217539455112444 +16248578108880346159 +5299098822813425452 +1518136331144998187 +195954029 +9870724821316884 +1427238547442458854 +7706082920377033902 +14146408692432445421 +12163381674616884110 +28202143270908547 +5710389916955189363 +16254596003192774028 +339083058007920592 +1873618527730013721 +1467142535205636266 +13983714582082383838 +6100103917338113746 +5778348236048443320 +32996336135128297 +18344667468539252428 +2663285062890638790 +5778348193056639376 +238820817369713602 +13179445551491209107 +16402822731255526994 +12580614903473058667 +1416148739266270632 +15287423239113293293 +1719273293 +6980137836619825400 +9870724848383273 +2625039581594525021 +6922789961772911136 +18412827955182960703 +31586258420454459 +1873618463244237340 +4409898088814486745 +6175741805446847639 +5246977008553442158 +6994029658347622066 +15291089478142680221 +13862523603732615144 +5677488628097044128 +17082847199017054198 +11074251745966443743 +1977521358397072459 +17117138682054580301 +5842746129543809582 +8787523062794054278 +5438273239143486043 +15287705255515546802 +188889155143818009 +15058563649293004319 +989685165561437936 +15291089435150856256 +16267581173591577767 +10604506699394332954 +16690556653938368767 +15289397349632447866 +2231177007949762504 +9870725375489525 +17971473236626723934 +2530175319162379796 +9433463473978102098 +5994450030542719305 +4891407656087067782 +11468052919789171971 +4974759074281294514 +8192767943209280116 +18150243963758262450 +17235362122381355610 +9870726387168986 +90244561210977012 +32432363518305239 +14101056589161617 +5191941735507716928 +11127783689530274156 +1416712772070762704 +17939922298747571457 +14263644100980123937 +18390671708185043160 +1543809028311897582 +13145134880981343700 +7536662675168835944 +16127313993280992745 +7659079343640105847 +2126679883759826993 +2624475557387394578 +1733392188206697419 +7247797567335564065 +12715826553344903457 +12266818901382939782 +8560555302365765095 +5299098874402572793 +2146416183109579462 +16908326308189521058 +7745426544242873861 +10421968855786398729 +17944727622506659747 +10593581334778944545 +8422587032633428225 +16500250690393679804 +4378750795426176452 +15073085829994532792 +6248375418015596359 +15290243403139980931 +12270241394066268300 +421318307722 +6419453255668612859 +10907429529076434948 +9764585664502770331 +5789644173607637547 +11453734735852880562 +1410790487801620923 +5099899943215653664 +2624757573789630868 +32714336928733985 +15290243360148180250 +11511147933887313666 +3009662357202367096 +17625510101736891241 +7085791646032789923 +4120982579551285151 +5671848295744342958 +12711298285117582250 +10706014518282508495 +6815608541961667989 +9297719077021430834 +15307507726591869555 +95187555425672908 +104025408671195668 +1873618514833378449 +811992705 +7034797850093420943 +1873622147625543845 +11932900081838344254 +6571549400297385945 +815859356 +11074977296540377468 +17410350896437664593 +16364556099866137988 +5410675011076500194 +9076392102438124295 +15288833260939530457 +16953342370982867010 +1815323894952711712 +5886499212326167987 +10168145881510007906 +825887260855527135 +15018372292397308979 +5250413516934023839 +9870726449034976 +1823672171 +1256962990588706834 +287347883431907450 +7246951492332880637 +15291089486740017965 +1873618450347595298 +8443432440786588623 +10996975363204083978 +5154543567838466499 +9743112694135288668 +12803790912656852719 +17165175141756129461 +2365498112266799533 +18319673058311761735 +5677488615200396516 +12613011696023000819 +2625321576501613384 +5406047212357096007 +5812662174917014633 +8582759827220606431 +13819048784252432 +17063720851181361214 +14692125830678778205 +2138237718664597891 +14953027591898083748 +12911837688061438918 +18322884876277260628 +15247837858268068800 +15289115277341756855 +15511142901182393 +13609859394403441799 +8592630279832086358 +18108263957602979490 +28484082290738106 +6364097396127828135 +7353451376748528588 +1082832726153255394 +2465915763272212749 +17944445614701758580 +5464488962444038684 +2908728282872694777 +17941158056733708915 +7318928098821087094 +8489561521808090456 +15292781516371141369 +5672976365654141577 +515899276494 +5726358123273077950 +18411981931769430055 +6979291813206294752 +11227456630099825751 +10597785753502118592 +1905391107871286576 +472907457472 +9870726995474199 +10722843938269568007 +6270921144476981295 +16880857114802736070 +4199805580056597828 +6563516821440570350 +5516046761095423979 +11626704882423196691 +6542379093554781694 +6396306851230663912 +7063619439807119416 +1523345308027076757 +8386284960399715759 +1873618235388541728 +936899437808086680 +7140451659506385466 +11129475727758725028 +13489466036702427188 +27356020978292179 +10483627262307884531 +17408884739334741945 +3021269128935141140 +17946441695893598722 +14473510418571144662 +5993604037221696956 +17897574268934639948 +6906773163853115528 +5129654712350633104 +14665067898487842 +6539294102684397294 +6204347636139758180 +1788898285280317488 +7352605301745845160 +4208656533364874942 +2714341079893873688 +15291935441368459428 +1873618501936749377 +5522024731759101772 +12074883489796924824 +11917647837929031151 +1732546164793162164 +538688904209328129 +13041281286977764842 +5603319953619882372 +14498644579613824827 +2203332293412067144 +16441129845655087915 +7241607920556327509 +2625039577295233253 +1873618458944932676 +28202074485832210 +7132563894606328508 +935489295607611539 +9870725053314382 +12890040283581524292 +1517290316328814602 +11496943314063287284 +9284362173790505534 +4581228268110439327 +986765107949225213 +14657860392804688872 +12239027656080514471 +155104173409966093 +17185961547367585116 +14361456990268308569 +6113973966562412719 +7758389320980651060 +1073706233092000080 +1573924423125718538 +4999048390027130794 +15292781567960305852 +18270115450271131437 +5888081980883690144 +1839046006217008593 +13001845694847519268 +17570286029825272662 +3235602899388867267 +13169917011251446772 +1623790200744461489 +5512098522859662839 +16127951361465609170 +13669865326459697095 +4069792311750432386 +12030211053774328755 +11923578915473263941 +1081973688179903686 +17305802256283475044 +5155012453095319171 +11235009133117204546 +7246105468919349989 +13729734730159907365 +3383274459479366568 +7206089555868473662 +14101052289868362 +2672703285363433973 +11423146816890476875 +692605777689720747 +8386536990401899079 +9789319859965203781 +9870726099793548 +707396284562889845 +15291371425759833661 +2624475553088105018 +878291194696067991 +460010845023 +10955223681225151190 +5459935770831763140 +9870724603540470 +17465760264366414308 +11758069550563400571 +9870725107447161 +9870724611273748 +827297398756689663 +417019024238 +2011949215507682416 +16888390040270411675 +27638058877206156 +31022238512525335 +1200046884584243185 +10618847259384615371 +11050223150350483894 +16754216790275083324 +5567604611335916412 +2622783424577870374 +3460521984079308294 +1788616212989637458 +7030864343134905144 +4888419829561170402 +13605998671607318835 +2676033351739443420 +11424491477468199703 +9870724634473524 +1895990673212124560 +13689067264448424108 +10799758872163985210 +10321765646545201236 +15287141235607611616 +15292499560155410011 +12436744821941414982 +12542566136569212616 +230324577526291154 +5196829205935043722 +18313170975766615464 +17063697102470777862 +5972855211812726219 +5887799973078780812 +1377306693002881339 +1254668688967817032 +3775072285107036691 +7245259393916666561 +2524776373 +5822772555245514592 +15290807401552691472 +1059334855484843902 +5675796516784184589 +15287141171121831271 +3297425404401232105 +245051758675 +1522366620176235711 +11655001993681129374 +2625321572202321550 +7407043776264425318 +8482084103035038419 +2018524397999319305 +9870724661539947 +15070874038479104359 +1144540847697125664 +12745679913544333764 +40043613 +28484120983261483 +17945855688117136180 +13819044484948156 +10754470140802972966 +16862372087833839962 +7351759278332314512 +2785415287546401389 +15287705238319606123 +13961369777997965393 +9870724677001470 +12346762090311780732 +4935397869899304965 +496747170645217690 +555550251 +2522267857966096147 +6890067904360508874 +17954261985218795793 +2121551635259406425 +8683329641419378831 +4728670048079126156 +563283506 +2065251783916128836 +63243415 +15793124915494530 +15594797272826128897 +6337342946992267142 +11381149777473639049 +5779476288762293066 +2601013084734032740 +7406197765747524385 +70976678 +1401559470217771767 +4022783898176071827 +12375010918606839969 +8842016287783671097 +30740239306152433 +32432303330576858 +6366353553143236567 +18115860927276519283 +11122727754716749345 +18059263644909513629 +8874026623554709921 +14299680457632139871 +13461170871450736891 +2992561296015233971 +9870724715672734 +8099703328722674777 +90309828 +14383055795482929 +8857706332467707857 +2108397809554510596 +13031177649551653330 +3315661715940248801 +16990917678970589078 +98043105 +15290243342952249439 +10106624428750691668 +2624757556593713021 +32714319732828542 +8181187340489997392 +5393540432733545042 +4936630674612433658 +16135696211206542213 +10516680436458395027 +9473994526259026288 +3172873313800751653 +2574671731618947440 +17011915733784399041 +5566476571520144370 +8414115611715784334 +4600231924000053823 +17589395983134517812 +8685292702592676768 +33278386930601602 +334447484152128133 +28113639747772581 +2625039572995942000 +1873618454645641425 +15287141179719176859 +16017733768637328308 +12306639309850170310 +6365225470336852358 +7086073645239108009 +5722409923729836718 +12743317986952749617 +6041909409311498627 +5979159867485134982 +15291089469544088537 +3866984390250997222 +5357989060832470257 +16269555352897260470 +1045091347555574917 +5124918939365817259 +15292781563660997909 +12589899362083679284 +11484387203384755759 +7870725491967618185 +2610595274536540827 +6208295865778120519 +13332280541073654784 +14318336791419095817 +5565348510207728413 +12545157304493825326 +9658025172156551231 +2997871977344213186 +5837238474067478922 +15511125705253662 +5246976935469079525 +17772450815750777329 +13941031974197355780 +16874641803610638854 +1391321615130565291 +2047638292458729588 +3295137431799204434 +4799330753387769087 +2327459577709752902 +13863504229899586046 +14397928622703527686 +6152225753094687413 +6117593727620116981 +15446880863004284132 +5516046808385271110 +17585064889486832367 +15293063506978955575 +14101047990573782 +17619012718254099588 +13671513674306231252 +4847114588453688079 +15669493015835727020 +17177580788047623088 +5833854208448540712 +2624475548788811061 +455711539361 +11900417579466447504 +11331431558187920779 +5569296735546842053 +16874641739124863622 +17298949057997048421 +14316519415399265338 +15289961386737687342 +3879741967089415290 +290450756178700624 +1841584192533979016 +2210675717504504798 +9880584878943375429 +8013239568478721854 +18412263930975748141 +14428784522053688566 +1945545821847564933 +6979573812412612838 +13992801308560201785 +6211263978943442008 +9870724820071693 +15291935488658330047 +17623817999021398681 +2031531694769920507 +5337765204523764648 +1295506201807315326 +1711177619955797339 +16629762695496159424 +2150364442841918445 +5661467138594919957 +8912366354539825548 +17099137057247020099 +9349887124383224614 +17094850760611611779 +5938943985057015806 +15331874334187598678 +17396614503441970604 +1489014859718419092 +933515197985005752 +1086068750891496656 +12593841123448540500 +15290525410943646120 +1873618506234798085 +27920070980159234 +11867996722743958530 +16624934093420766607 +7140733658712703552 +10907711515386135518 +15292499534362142621 +13727478616135047547 +16879729036294381104 +5730738598249187473 +5458848612895428701 +9870724854871353 +11644189250161151411 +1873618441749007310 +6760308635310643255 +12060104430574575960 +15289115311734997192 +6364160896049559518 +1517290299132896120 +5652457670769775288 +4541282462845920612 +7519030386508587495 +5535304556822082227 +6233728204387144717 +16686197489590146326 +7247233543128351503 +8683329701605885978 +8515756473230956045 +3879177951480792603 +13749498190853269567 +6310847460367673484 +9870725374244329 +18411800108727758233 +9559615987485527072 +7235250283120384377 +8563309102032174101 +8147865954415435273 +16938604530725897650 +5826194972143212727 +10208613847866042941 +5851647671361367684 +10693070054104898178 +9653635019966605610 +17464068217539343718 +1254142826560768018 +5849162520410284442 +10159392396900179141 +507300696794 +17377537000932073453 +9253588097292832956 +13922694655813161250 +1411918557711328546 +9870725893617234 +5163679068640339560 +13770241597475262964 +2219404100148202350 +464308892191 +6914083977458316027 +18114168828860329400 +7034233825886208381 +14952684988734398302 +6366353548843949856 +3539821216080294437 +15288269236732319687 +11848796837541853896 +5271385667144599481 +17416014900210055894 +5249797194076738263 +494696889930828100 +15692070679858520875 +5192880963399984372 +7246387468125668075 +1731982088996807972 +31022221316605343 +14383051496189468 +3401915643830956264 +12300862889302759326 +15291935475761685776 +9301385328948890533 +7794629221248614912 +2624757552294421967 +17192339668121044802 +7031431794891229609 +15942038904294617893 +9752004188112957208 +16261820492262174948 +6439645968085885634 +810747511 +17316681810146379588 +5778348223150557533 +1873618493338162300 +31586288514378833 +5835277254346940795 +529742740771051886 +2235931652240122960 +27920058083513990 +16200965526955702895 +7352887352541316026 +4755315023003075772 +5727354427211206673 +9391897711091584534 +409981680210362426 +5458848621492772947 +15287141175419880230 +1706644843971300218 +12301880582509048139 +11986612011671894549 +9549109310558594172 +8694008321347227552 +2105142282864127290 +17868909830197946024 +7033387750883524953 +1043399249139350309 +12903069678853165213 +8249405001308728640 +15291089465244784182 +6365225423045740013 +227855832298 +28484125281300687 +13729170697355338382 +5746569339698554696 +15289397379726381967 +530117487457143811 +13819027289030743 +16006179662396936633 +5835546375651264551 +5565348505908426679 +15691604843033018212 +16872949705194415821 +5247447765528374823 +15943167017196213937 +4822257748200864958 +13669583310057399680 +7888341834039043640 +15291089400759017059 +13223018370104183749 +7139887635299172904 +145983380715949082 +1839045976124441771 +8386285046382084334 +10371546090728801761 +16365117057346848162 +7001542349735486788 +5833854247141068679 +2572415617594109789 +1039169058987137358 +11820958803366847370 +14101043691269068 +15391494223742584920 +7352041277538632598 +2327459530418631284 +451412240191 +2787671431665158241 +8998114985810155403 +17396808035473438521 +6053196318902919203 +5302201011842336298 +2055147908188813202 +11911353550167018565 +7301047481599263618 +5567604645729145714 +17530705634602601468 +10442674440483204448 +12835456257182949440 +15290243390242101320 +234558121275971664 +882239454428422695 +5707451655310945990 +6368045630064242521 +7221038382230168311 +9839328478246342708 +29612195191076277 +8327325764367421421 +12133908888584007713 +1873618544927317098 +16852270840353734095 +6103488114170732272 +6043037483520495156 +13970089714745961641 +7820211846381248893 +9237398406700936639 +1407452925 +5405598724426372527 +15740334358613923819 +1873618501935508469 +28202117476394754 +7139041560296489476 +1575334543830965981 +15290807435945918773 +13919224524090404958 +8752494394017080739 +8383464672958632374 +10167863860808410147 +18332619666187903684 +14424533014481676664 +5729046499832959170 +418283403591038951 +14444632933017337905 +15287423213318782905 +2625321606595546000 +9763671964213720131 +1255834993763509661 +2625039555800019696 +7191787953594783916 +9870725055924901 +13991673242948481717 +15461484579900235151 +2427623891363173928 +6153562809800997333 +7245541444712137427 +1493907215600324477 +4510195663483449590 +16870693539581620731 +869984510486187232 +11408348231855704533 +7194547648772768447 +2446198699 +11293908513396519157 +33560386136916360 +9870726575388400 +9870724575228895 +8166887695337994850 +1677448585723455407 +985637059534865101 +6230061926665188182 +647368416857511007 +5618598441667339881 +9140276259359843241 +7401639761433856675 +9870724582944202 +6209987891108781158 +502997539631 +9803885194457261758 +10338899821598495760 +9446153529123417006 +503001391441 +12696749360493643203 +9002294370558360033 +5595004140770700886 +12253585582527233970 +10507660505631644819 +15758933542865883961 +3600216065075850137 +9870726098548361 +1945545869137432630 +9870725102335344 +11140363946552811872 +11024829549809195509 +9870726606321399 +9184831288639232826 +2624475531592887530 +5057457538052812967 +9870725110068627 +4687824774223042897 +7709687498704298215 +15291935514454208468 +7449919019336600754 +14968028355101535912 +16252369854071593358 +11937155776729718864 +4214598676324625716 +14873936550357312146 +15290243377345475070 +783026400049719196 +6601865479546622973 +15293627556980804220 +5198239283648482923 +14063480800060649673 +14383047196891605 +15289961326549935014 +1944417820724325628 +9088972881471165450 +3983221356444788824 +9870724625495070 +2624757547995129921 +3998723 +12232186602109608027 +13682442460564307110 +31586327206891437 +9870724633208852 +5624238696637615981 +7865380 +528050642354849752 +5301072929034740322 +17047739609656488137 +8468454696114149827 +5511666307614640855 +7141996804577118293 +11732027 +10444065224309895767 +3695202118163647144 +1873618489038878661 +11757180014591350951 +9202545960757185874 +1092700946662502606 +15287141214112396572 +9870727141160746 +2014487406122710994 +5831598146012847244 +17793638793409007851 +13232275560705703293 +7300201458185732970 +1147642989434981931 +1041707150723145606 +10908568553618344222 +6974459570491569747 +742583929184658323 +5411573444917201807 +12782837558680106239 +1873618446047061594 +1633977097952959206 +5302024133457162651 +2467043755798312207 +1784112314702630223 +10163069590561767395 +17571994871764906456 +15287705281310187838 +11411381048698022103 +4710890694338816375 +28484120982012683 +17791800825825923626 +223556539077 +538838517 +10105478591425899048 +38798421 +7721139371688995195 +6310847486163558345 +9870724668028043 +42665069 +6209987942697935350 +9870724671894671 +15635925519041824837 +10923456155711856608 +1144540826201899274 +11491231604091658060 +5102277352796337264 +4253979279597850650 +13819022989736770 +5880738582584709332 +14942863891313924504 +17785259844527787567 +2305640534728056661 +6044827932502942422 +1466296485997604589 +6005160492526151788 +3670419559583783534 +1384869222252743899 +9549673330465266138 +61998212 +9665870200200054201 +9950583080036756657 +3908228642621968388 +2021239845180299770 +11869124796951771922 +13985437437494778262 +17298667041594762638 +2450713840474680567 +8102805470460531356 +14260259904147624914 +10593581360573605537 +9870726702987005 +11233051390538684390 +2208983614789014613 +8967118772139864461 +12874984814839952296 +14256452938552778169 +15288269241030367071 +17740106858442535477 +931541108959757859 +15015751190998230237 +8979911712249689955 +5040671887130580410 +1368312660932304301 +10104450048439825257 +29330183088052234 +553976982239327320 +423895235843350087 +14362448656949408528 +5671848321538989061 +10733618018216263925 +4977791693940394626 +11192970930885113995 +864344229722669617 +15670057052940939759 +16306876268462091995 +12163423461833712638 +15287141265701558660 +9870724726027480 +10822752763191503731 +6103488109871457987 +7389908165117874615 +5778348248946456211 +1608517436 +958440276318952750 +1836789883593576464 +7034515825092526467 +293570133230110574 +2950805418578419191 +2786543335960946009 +12974919760130952302 +2399325703848469929 +17625510063045741304 +8405295912409567391 +5620566757354269341 +227222435788640316 +1873618497636216817 +7311508048676545457 +9948326991805167380 +15417905864639003720 +3477127770951657905 +14237381820030133039 +12428471601026183387 +1735930318633987975 +1873618476142242545 +10700535707997250816 +10280579133800018042 +2203332267617571173 +2225256215728111168 +6672273938365633844 +11780652330017962598 +8807886331112852025 +3530088557255091586 +2625321602296253667 +12749251337629741243 +8794204864089104666 +8299123345010271848 +1571950295410568019 +16604007140260671746 +1785514015364695612 +11829614794030073281 +7171900887576173574 +15166008169874209498 +11918933647021000936 +11501195652629140806 +11649061809146122199 +3364506306553723558 +6365225405849802018 +5792345985031355828 +6980276881077592311 +6658442649972320618 +15292781542165787053 +1502804306755409381 +5252669682549412775 +9870726776452868 +1230054568341818606 +5837238474066254450 +2874084217735302447 +13303975118895852218 +15377371869015000175 +8353308221296633719 +9903409772850396166 +3879742053071789753 +15721176019378784011 +18411699906768535579 +6979009788205400276 +11578138925660255781 +3292973778355033587 +162530652 +1576180601637716751 +7406197795841461824 +30458188512062143 +9745666689313746610 +5881302636885846065 +6928015992266031296 +1881294612916279670 +5141454965113440255 +6967043109020902905 +17782439719193620241 +17377223503468572672 +9870724799493373 +1256116941380662047 +14101026495352195 +5561192151909210060 +16793039236969098918 +8369703120338820970 +1201738987299950103 +2201358208687543927 +5517738881006966724 +5353476798389507501 +5376821558582005938 +434216308442 +2572415557406382840 +7137191519510548122 +7140169634505490990 +3370817464176368391 +15288269228133723091 +32714349826763921 +14383042897579934 +17077300919520947776 +32996357630471870 +8153674566643691769 +5539784066175097045 +16031823836168870763 +1873618527731401360 +2242842311689458015 +15881445561639372856 +5659193931464994254 +5304739206756638187 +1041707210909630780 +5993603998530545780 +18049103865480687974 +1873618484739593999 +3237330832107509644 +1758425444587755314 +6230770123047596409 +9870724845892898 +5354604932785051364 +12185761058806315355 +7601774322648748731 +6927169917263347868 +8248084085548261586 +5994450116523873864 +4719201999576523634 +12352423059044386681 +5677488628098412376 +11647045273970363568 +15289115311733748419 +17085949349352205532 +16634367300845572761 +2785415326237661277 +2673382969485887710 +4606392329728302692 +219257245543 +5303047035254620563 +3877485835868652163 +9870725369132504 +1996539682274166719 +5300408012089352731 +17303871552606990253 +9870725873038911 +7033669801678995819 +3170183639832620868 +13819018690441534 +9870725372999135 +10591270404615643134 +1401410958117133451 +33560368940998627 +6658576559706819669 +9870725880772166 +9096726393093961456 +1627422990329724608 +7786929324177967047 +7245823443918455513 +17186370626574575331 +7650444516499092067 +9870726888584972 +1776266212219562635 +27356098362094922 +10866046316168176475 +31022307298995169 +1945545894933324072 +17749865877889229781 +3265543275046184000 +9234281886090274515 +17826052294924058913 +12937651856903064504 +18007824240376177102 +5779476262967786443 +282396067 +27638084671861496 +6157301992455103302 +3204395739605579016 +8668153581760419942 +15288269236731071313 +286262715 +27356033876298963 +16857050461455994383 +1227242288153387496 +15290243360149557182 +1801848673 +1281295571478011547 +7032823726676312391 +16370548384624553978 +5513337682873574654 +16875205771930777975 +15291935454266475923 +17473034232504011278 +9937836885805321750 +16357059045846882019 +18175636583256631448 +10667162361920503880 +13035898719410924249 +813368972 +17087641464965766833 +15733389799267133019 +15289115363322902883 +6155045947215342355 +829835572175787929 +316178999321711948 +15293909556187128384 +14515217839608778317 +15290525376551806599 +5984819155521328568 +7139323611091960342 +14595100389033534513 +11401612943088228433 +8744196618956189098 +9808823553121140215 +1184854787186235431 +6846637682556690481 +2666811000392327870 +2625321597996961395 +1041707133527223375 +16457060609338066047 +9460292951366521626 +10705679793835559114 +4069792389134235710 +6153353818705127203 +15291089443749581256 +266042267409003219 +30458248698541404 +5323116982516337125 +15292781537866502671 +6156737976846472662 +1573924393031917983 +12015487504111448830 +2363364125691044050 +11970387633123900339 +12476786330444771904 +12537688309411163897 +12638147294677253117 +7300483457392051056 +14137369733884501834 +28766163180151396 +5195701127425443663 +2933734509745342729 +8428258315504206221 +7404505697425234423 +15238422321780434066 +4144239374822822188 +2157417529367871854 +494402819782 +18122024172392506445 +1576180597338422353 +18199915413964343495 +15948081610625016594 +5837238405281155196 +5887104174301395787 +30740265100788241 +15291371438657852193 +5516046782590752063 +16278554206653409238 +9493321181781304172 +13519837262133160122 +10163058623031678991 +1816407481412441268 +12374709918600227231 +12124871760000798005 +5469235769064827549 +2661960728632183483 +1873618256883904596 +5303893075865511927 +18185058707353441325 +9293468489290638863 +2624475522994299929 +3537491628065245249 +429917037378 +1841584166739459024 +16112193563348458474 +830399540494471455 +796287374104029837 +9304480456320749093 +8663063086999543290 +9386257357243687819 +312230761085943173 +6204347657635112815 +1042835233529480162 +537223951118255944 +1581886662519375204 +6166185761967983123 +937181475705678069 +6419603398621875267 +9870726535476967 +1410074370 +106292485926954229 +5352348775769575693 +3297856681506179697 +10692085534723158692 +8876608417013722765 +265627134532399890 +10769902892014381211 +5408982882566487923 +14522559579975985133 +11443887989255400387 +15954584610971065096 +17501480265540785704 +6716515055005548664 +14424532992986451818 +13237708557081051144 +12400858092474753358 +8510480267887864000 +5675796529682213802 +14881076064013474982 +15287423213317533015 +2235142484806161072 +31586254122531154 +1195699440532198305 +9870726054770301 +5461950758932517025 +10700535690801327671 +9870725054690645 +390570242754363440 +1542167345449166470 +16950240237842479701 +399811749952818791 +1692606545734816107 +9981769256857393682 +1992881760109683818 +214957951250 +1095239150174146341 +5410956962993161805 +5884848021584045995 +9870724566223275 +4921509164315792960 +9870724570089637 +2251871061326900524 +9059485294012419601 +9888744810737384411 +5083210814004410505 +5137506722578392806 +9870724573983699 +3740815079721365759 +6307289747169351292 +8954142712877762318 +6947374277897365111 +2302546993561949139 +5833854277234986247 +277990031633898295 +12264376911110680144 +2572506237372816484 +7882744375622131998 +5252617345205559600 +4264363504802677043 +1460340488 +18108263923209887963 +7562235540534921654 +12628608773943282638 +5885543897745214766 +5886953910974111719 +8260263441782293995 +8756617791282551142 +4548898661544118716 +2840357278731081283 +7193137549562872457 +32150286927018434 +5245848942943085011 +9870725101090147 +231161255217739298 +13836474390506180177 +825323275339566093 +17619012679562962682 +15349711462261332056 +9870724604916733 +13317208580701230884 +5245848899951276997 +10916990529318691774 +9870724608783375 +9870725108823429 +15148238206751484973 +8525702746011299920 +27356029577013036 +30740209212340926 +14108828808151324093 +491193817 +3342493899775500454 +6537053438712960433 +12596551949017946442 +7354297395862963171 +6928297991472349382 +10601803635978414411 +270554547049277249 +2753520 +17238671514823108386 +15088171056968837245 +10908568639600747126 +6523847130320155994 +14692217879646983464 +6620177 +8106641299786583541 +11972090737761480042 +13888074485517803035 +1785240333022009483 +9870724635849793 +176450185316341920 +13885455448020814467 +5887022448955385325 +5784522618070110854 +9870725139756470 +9870727139915561 +691477643294354490 +9870726147569309 +1873618467543659720 +1266112799701416276 +12004184676178276360 +15970948408630318067 +7191505932893186074 +5884848073173181498 +6100103857151754787 +5566476498434525268 +2625321593697668949 +9870724655182935 +1388146554381031583 +6365225440243040530 +14809301315178754677 +10375505326587316736 +5356297009706053291 +2033846147 +14262798051772021007 +1653406398936147620 +1252168750434758006 +17468752969578520575 +829835503390711881 +4721835318523814945 +15291089439450295675 +12754891682880491270 +12638603244465631850 +9870724666782846 +6236830316029746083 +7298791358975836980 +45286518 +14428481226922935975 +545326604 +15289397353931869370 +5886953962563243586 +18101863374136742994 +13306106854211918681 +17090702837803407301 +10906583479868327976 +1195022271502422864 +16508579235574254591 +5565348480113903999 +1299603461808017475 +18388527066534404246 +13941243522806850893 +17961737508024490798 +17128505473059728849 +29048166684559955 +601056510466081194 +490103521324 +17465760294459089559 +4794173760728862646 +5885261834053032764 +11630950185000258145 +572393025 +17130766381153262691 +17738386836608217714 +9714916620294626273 +7033951800885313905 +2063067049313311486 +30740239307510330 +12758303666260826943 +1873618252584605443 +5672371493959463336 +13322381941750500585 +425617746462 +101487200860397481 +16633695840000740711 +17922810271644068285 +6021581796670193070 +5567604619934639262 +7897480855339494000 +512640236460456783 +16074735873595096276 +18263821886743186587 +3878331902272761666 +15291935501556337189 +8756381313640910965 +9870724717049004 +7470284155521404878 +2624757578089051709 +935489377289456984 +9077802184452229772 +9870724724782283 +13283598388764161973 +103286007 +15288551278929199014 +16551960241296127023 +15189064920766156866 +11851809434510388996 +11775490430040477106 +15293909603476987271 +1873618519132802343 +13714417139605137437 +9870725232555468 +996859147392267830 +1573360373123996581 +8859398383594200618 +13630869015309271476 +6153071806600915522 +1873618476140994372 +28202091681876026 +33278386931984379 +11005714949943149354 +17867767375493404861 +2677725742497282647 +17942850211037331187 +5257222861259937854 +1481003414893108436 +1091290856049946508 +9253024064487057044 +2659583264973933254 +5880738612678643163 +1838763942525032456 +1636264303811127962 +638125654 +3490850703291659215 +6927451968058818734 +13019610789626603741 +32150390105330110 +346175288917236448 +5501615920945045483 +2381504242832520082 +10277198458468592427 +5619726442791975944 +14090798302164113959 +15097549489175882133 +9870726275167927 +2479300263529632077 +17919176681865228539 +5461104787108142257 +153552174 +7139605610298278428 +3512998078655174610 +15228101279304663134 +7778665200779749617 +12120648229132179337 +5569296757042207104 +477206874070 +5728050221689420192 +1093546995870676869 +1371696913653381068 +5353476841380080660 +6098975782942683129 +10827453674717977265 +4384733239384298717 +18101013685495412158 +4333982245204397716 +16320874009080917781 +1730290029271860869 +9018208231195109077 +9615412020284565420 +11929824050942069630 +2103039515099409757 +7300765456598369142 +8512937848331659541 +434215078869 +32714392817316564 +9762108989108395322 +9291494327182253300 +12862732108132004345 +17074539849740339114 +5245848874158019028 +5193163057186017674 +6926605893056135306 +10544097276377700640 +14366386701052820377 +6154199812024902995 +7303449720790659063 +6821858679083715819 +1254706842170768251 +8800076364837556033 +5570988786673344395 +196085103 +9141462481572413382 +14665072197918269 +13449399709461668671 +15739323154242221660 +18301894999067279203 +379168253639150821 +1873618527730155052 +10588787047333909091 +15288833316828105665 +4900544073974686209 +3140612922788834225 +9870724833047829 +5885825845362385027 +15583097549950706851 +6619090118045292555 +12711298255022535739 +15235300779755857465 +5459976661309925019 +739107654425593613 +14152269112331228543 +3463955119817380427 +10026265725741132560 +5077221417231718925 +17732512971379654706 +10375515808604705928 +13493641436871671562 +9870724848514346 +7343422898977459633 +5940918086979030044 +8912366268557574297 +1464040393466667237 +12918763888741537569 +2625039581594656421 +5354604911289849361 +5352762575340769626 +1727137614 +16872385650894637358 +12875717458541220802 +7273674818118696817 +12030210203978907381 +3589517867127630159 +10339666438119363062 +11288097516716240748 +12804866760264206558 +14581169549127065194 +1413046597527287258 +16632849846679715925 +11916758662360556959 +16876554000686012086 +13882353207404138737 +15287705255515660759 +2175065808065212760 +1996539682272915040 +14904290184156224700 +18081217669066614009 +12618268146972584015 +7194265623771873971 +15559344109948986934 +17461812043326695687 +15289397349632593279 +16561288134575080781 +7084944640355881637 +9870725379487250 +2757791645513175159 +14576212124415365133 +17681715328028923244 +15287705212523860944 +16101055855215330042 +7192411322384910543 +6524975269014953278 +14108981694050156073 +17465760333151611316 +257951129 +8734347241957910238 +17464068196042873085 +13088377121872300216 +12901242575040766113 +17926949171264688931 +15287987271917911848 +4524471809446078839 +12348454158632966911 +17385354375790337904 +2577209823356334301 +8968810874855572752 +7032259702469099829 +14947330030372721519 +5779476262966540181 +7133807369969162434 +13522386372987146822 +6981265906529730849 +10279024731356797940 +984791074812605829 +828707437778974216 +12020690515259833801 +1873618248285303236 +421318450547 +9460366926602855352 +3448402978161508786 +10628953736434487250 +11914033402398455177 +5725098287391840494 +7093139022160607420 +27356012381092193 +12961322416880839790 +292750793 +17142588721119760121 +7193419548769190543 +5269884197671281083 +6311975551772798985 +2624757573789760483 +8386072762472212689 +14097513009910468738 +1104480633808824466 +11846037961957313855 +1836789900790885888 +825605274545896483 +8328637008159451650 +13071641208838957525 +15287141239907038979 +12103109825679658049 +15223475369445103476 +702355655484643441 +11183855665341141176 +812123778 +12426638588012880504 +962327146969831775 +16904367046536606435 +815990430 +1319896795 +2676033644081057679 +1783548230307678558 +1873618471841708641 +7299919433184838494 +1784130019892489330 +6245060846438853488 +819857083 +5511666268923516536 +11557237977811218097 +2699017618734007394 +5675796521083606737 +33560463520711051 +4624411722083691267 +13671250022048226390 +4549319921336079635 +6925759869642604658 +2625321576501744105 +5325844482111182883 +7254803493019988225 +14964196544878031586 +16326119896447271573 +8683329710204596818 +13819048784380837 +6208295882974169277 +7563201943019077168 +17094376562205139371 +11860940733777799650 +119263647604620761 +12779163922391108646 +10328470740711773986 +5246976952665125062 +2599235317102220120 +3178894345087771734 +17939033673395547362 +2844746665847494179 +17461812051924031855 +1791343484932474907 +5347639017050171957 +5782296405499264455 +2151210492048850311 +5233666061547950227 +6362646410737881886 +3190243207269413707 +7086919715942695372 +5550369740109207185 +515899414038 +9735523322323809283 +883367494244395739 +2652485274356287650 +6364097353136172764 +10591325139069899325 +16561571660103635441 +11844132458475174935 +11301006809186644148 +5458243689611604805 +1517854331937577182 +16222802744731642212 +15289397293744140215 +472907605322 +11921229948732379498 +17503960406972049846 +7299073358182155066 +14814059329512284991 +7462757623451565779 +7718319177568490216 +16574957951809709451 +13855837544643697172 +12441988990377676590 +16618104504962848083 +11176546812336162264 +2201358182893031684 +7017221506060727399 +7432602967203907917 +10532987966327964483 +4792614513982521532 +4239169847573503957 +31304310803352727 +18324613202815887642 +17093682152237637703 +14605853869620160166 +9118638263387903992 +175197369956052402 +4006951564624883066 +14665067898630741 +5249797159683644128 +933515215181071183 +6048677858865204656 +14010051110050555726 +17326365366013356891 +1808341863893970759 +6600298885808791572 +2073653179955024636 +15291935441368594316 +5251489253800567485 +11108455537719452620 +8076130078717077506 +14324052883031205424 +17956211270007862956 +2195247887786910984 +11605771851894296682 +10198717242429219845 +147027456461846241 +5303047116937702957 +6821858610298634709 +17404805271631432631 +3488055039053228552 +4176701084968819774 +15344674694092494463 +13615381930551764122 +5677488666789680384 +1873618458945063232 +2625039577295364612 +145053268557591102 +2828142038345468444 +2140067470700278116 +5831598115919052423 +15622539341328048367 +10069500277586077026 +12839861526724700872 +6081185451114715476 +12454108019635063237 +10413759970020320523 +11749368788646434989 +8281195205288014084 +7192573525355659895 +6101795942670076456 +17050559842468444185 +3401832833900240065 +18275681993330352537 +1842430228844260332 +2266136578109692047 +16430151157792986665 +9355199319007639131 +744911494472428143 +18343389461521522486 +5994450047737543185 +11563454792524716369 +11149120716834549688 +10935693924746138210 +15524056372642272003 +2520575733754110515 +16346251724134881070 +7645347347796282290 +7353733371655750609 +15288269318414158089 +15254252135143327637 +112033775831110546 +14101052289999415 +14142752370050885143 +12268190774771011836 +2322094249834524190 +10655733264458395348 +5882159696614656975 +878291194696196673 +2787671440263884628 +460010960530 +9763801130515196473 +5299098870103412643 +3586101984724006829 +31022281504473543 +1252732744548172463 +10427956700900051288 +473766133242138762 +1367151838874656120 +12881745539905644693 +15288269253928374057 +17901732962529459662 +9870725107578235 +5663430541438561895 +12923326087537570223 +417019140241 +9870725111444887 +9870724611404822 +9230173750303994191 +16094489533712977469 +8920168277954209451 +12268592236069284856 +4003053205776444159 +3750262322779274441 +2652027345649413847 +17369213304637756276 +8872175822845119886 +6097847768920105808 +2624757569490470191 +5600656801203579492 +2136949463181647181 +4289948930594468737 +1413892590848263065 +3364340290828179470 +2509440945 +7832374724669892538 +11119281408074927890 +9905574651248853290 +1042835199137635916 +9870724634604598 +5831598167508210694 +13199203610271498463 +2245985413502414723 +3251422716421232547 +15293909573384415524 +12413569004659162429 +9957100519350946569 +1873618467542404678 +5140326865109853453 +6814198459947818959 +6101795994259255244 +9272877412921593789 +5357842233651588296 +9325672081535221340 +1575334487943889122 +7345281306589678789 +13647449029431552348 +9870724653937741 +16490193613310533470 +11139832232910995628 +245051889885 +11965138075391500510 +15779458025647778639 +2137124098070491413 +10586519854003331222 +12356568389305516449 +9870724661671021 +2625321572202452540 +2928740603217473077 +15407565573754394792 +1997667691996147115 +29894155706252651 +1630794378230962354 +13819044485088539 +13907846419638730986 +15294191589786673082 +540214780 +5303047039555286030 +15292781555063812865 +13536993689560068 +11609088076772479788 +9388513441174723993 +547948069 +8127099841900146065 +2391653996915733494 +2342713540161574472 +17783567780504759670 +18062328983712841258 +5512098531457129252 +30458222904030347 +5153306075531842896 +15735927942591043242 +1146796978919455623 +1559627561 +10849580566319471160 +511600108142 +63374489 +2790985753443975231 +7647862184628930070 +11610664344709771733 +5941764153383128916 +11679300041473083231 +71107752 +14530733744791169888 +3691753447966267582 +14210563131035379978 +8109461463812031468 +6313103625981807460 +7349438249010615284 +27356059670961313 +4908932749447469660 +4022831255438035141 +1578960686 +2413245893290046413 +32432303330691962 +9870726208190124 +14584707747332307385 +8005028990823183944 +6154199846418138740 +7140469779641604014 +9870726212056752 +11439125141551257914 +5996988255549658237 +27356016679141214 +14428924804085193022 +9870724715803807 +7357329672251267158 +90440902 +9797759154703645848 +1023278175102988602 +5622264581817854851 +8484674795844738166 +6151097704679021754 +7032541701675417915 +6493812967717955688 +5352348814460850993 +10809573709943554338 +98174179 +16642718724439549810 +32714319732949822 +13526334602624314218 +2428928058356546225 +11575632813063815588 +1251604661740576052 +1873618519131557528 +10913604074625328065 +12568769870399157844 +6201204530839633304 +4290363207494739730 +6981547905736048935 +1873618497637607607 +5622836974676300523 +1994009825720082505 +6185740956063777989 +13940690380052044285 +10189735511971410353 +6151097640193241603 +15290525359354632575 +5303047091144431572 +2686971790050920695 +17839382098896515929 +2625039572996073307 +9029301367107049298 +6100103844253866014 +1251886678142818256 +15292499504267075714 +1840738130428054349 +3666742271342563428 +2901677911497989111 +2758644904015064545 +5803642704635843051 +7088047790151696886 +2493017496378677485 +17514477056034422138 +9761262978591439745 +6364097443417821059 +1839046044909649934 +1146232920319025255 +7691476948509799698 +15292781563661136098 +10280861171697593405 +8286625176226131890 +12313617313272459855 +6261263733545782814 +6660416816380137833 +7897479808313158918 +9870728774121262 +8483828720842050626 +8430474765433179503 +8541237495103964756 +8663663697331756661 +8348067735518780184 +5246976935469194576 +9845067387665259742 +15289397341033997559 +11264524322900492016 +707696598575758368 +6926041868848922744 +14551450938398807190 +32150304124329909 +14101047990702237 +16181999630601251545 +7831633610604486699 +12594295834993048683 +11573430836645538627 +13585652207185310121 +2624475548788944709 +455711657669 +10905173367761799428 +17092617325104294516 +15289961386737802796 +9193717817449799782 +17203588249717595318 +3277505925756572672 +13143886670509790341 +14360077379699556506 +17117511006548537056 +1518136374135704453 +7406197709859206874 +7511127039787088425 +7087201715149013458 +1304290603386040596 +6228513983228231437 +15289961343746011965 +15797441652732025163 +15942038960183192857 +12057566282950259521 +15967282251284038895 +15293909633570921194 +7196300228934450835 +107356700000259160 +11179083829641557032 +17884749925642293984 +17012439662870677823 +191950179678181081 +15288551266031320724 +1416148782256961147 +4145558199658421417 +2745565967795448742 +1597367391378290217 +7193701599564661409 +15292217474968199019 +1518602761089934032 +3354355623869883954 +13671784843788695120 +15292499555856226106 +29894215892733389 +769032610463772361 +6472853381670588815 +13282278299793573115 +1855301614453538733 +8818864591554683921 +15287141188316643042 +8101959404056567819 +2379954828121553017 +18394514571174959383 +12273668172022835138 +2388013311603598844 +9559664469313546761 +1873618441749140247 +1773865980548370906 +11388438133588125592 +1508108936621023041 +6194304829266353095 +28202057290041155 +15292499491370457685 +10372392071150650899 +240752597130 +28484138178071140 +16796739070715978531 +3935460153923680484 +1146232907422388394 +10983767332072941584 +11266287558165405854 +4717573181505345987 +6704175899154078257 +12818828396538517994 +14430173286646835614 +15120308795588238461 +9870725374375402 +6980701882322518287 +7211896323698017855 +11535289813704319601 +12068249584032159502 +18413392000885653590 +12500215995775666892 +160954452809486655 +9870726378321619 +11687699887225181079 +14428481201128427132 +10375505257801015240 +15287987314908488942 +5137506705381219376 +18052289815504296617 +6274490301166067119 +1731418086284935014 +12921633150132110207 +1256399022268901852 +2562028029510361402 +507300834486 +2487252134248656252 +5195983199717506783 +9253588097292968274 +7192855524561977981 +6816736603272978863 +5847733174659016997 +15422952951719617129 +5386265453423239821 +12173850546193509876 +13886301484332365525 +1746545628910856256 +703496194364499512 +12268511038490570815 +2509281739668856740 +1735084252230017436 +464308997441 +9870725897614931 +16880857149196080805 +7357338041604861416 +12301990937716008360 +2573929373462720207 +6152225697206382219 +16775375911062353984 +4454707768327286167 +4280223690 +5517738889605699135 +2791696649994248078 +6368045642960997077 +15330976455601306397 +7299355408977625932 +5832726168632909430 +5996988251250366080 +14383051496317608 +31022221316733717 +7241043887751895660 +8700494707207576389 +13507598357333634564 +7675960042656581019 +4585257123188182407 +1316357237551402187 +6014764344719120795 +2624757552294553714 +6979855807319834859 +6818097810163717145 +17230081976582608778 +15287141239905796494 +13941011578729796789 +17857876286936460348 +14153679155654055650 +6076994899955960850 +810878584 +2684715633035446950 +31586288514508929 +1873618493338300402 +799387631219316551 +14868332773240477086 +18271243459993288182 +818611892 +2819716777652655593 +3875511764040702269 +12085352355710699906 +15789667329844395641 +15139848467400579741 +10345794580260352770 +17279695936640199542 +1822558058 +3646692087368323860 +7086355691735482810 +2625039568696780060 +11270550177507013265 +1785514032560753811 +1873618450346478338 +3485224758199265483 +15948927642637254764 +8854886172739176522 +404845553720303096 +1580068669843705321 +14997000871559982227 +10913926882465550106 +5304739129371729122 +13070886371126479007 +16093881220281274195 +17467826082901599080 +12590347596756102778 +1915389734535564130 +15291089465244931327 +2946293164734225500 +9606749428600086489 +12806855167993986666 +17626633272741335525 +7298509333974942504 +1997667674800210225 +7860127107461818102 +9448011550697485144 +1144540830501329106 +7980262123708881021 +15294191572590732129 +11213716413893659426 +15287705242617788401 +13819027289162676 +5354736642869574219 +10195897056907305370 +7247515538035573524 +3166854339657938773 +893597016754164168 +1623790192146018321 +11777433560238014299 +5596696239185876449 +30458205708096041 +15289397315240731189 +13158388680245979733 +5888796259821173987 +14912242162891570878 +1146796961723531409 +1316305709524331734 +2381156568958574153 +10332418966049665236 +3760128365829638142 +14101043691411359 +17028024531363254230 +3416792183604724671 +1623790127660227979 +1956852058824708597 +878291186097611236 +2624475544489652629 +9948159316759942436 +451412384050 +7085509616732799382 +16436648502584614961 +30740222110346439 +7650508660710387266 +8486366937251538233 +12245079979069750180 +13670576049708995059 +9562777431589154528 +15292217535154695297 +8143013932113161441 +1873618544927451409 +2150364438542752771 +7344550964587882716 +16840215126092508566 +7192009501148447333 +11061539016898394308 +13889766540942386723 +10580074100703844739 +15290807457440018524 +16572875051796793532 +16904712944497921218 +1873618501935639919 +28202117476534469 +18145530795981084333 +9409295256684857941 +11961082158416466592 +7141015705209078353 +9696088671876497112 +6101795985660645479 +2995297343137728707 +5888809197909728635 +6389214875903685188 +13106160036035692807 +15229113601177021 +8373123327081850903 +16799863227903141496 +580719416979643660 +13671275447165063571 +7353169347448538047 +17689369426680502297 +1416430794359916140 +9870725056066908 +6235138234810847592 +15798241642875394718 +5257405381051639495 +14127376344190173522 +2098573305441185083 +1307686045666405880 +3549148492739669926 +8916318320892468458 +7563483959422761440 +11348511994799134844 +15287705229721151041 +15291089409356493227 +6224501813104814248 +3897700625304529580 +5197393273132878384 +934361277285878578 +9870724575344018 +9870724579213343 +8704274751914774353 +16741752748650163701 +11994369453889050446 +10904891355657615236 +1660632291351550260 +12753590887734779256 +4683165317527593050 +15292781503473399538 +5833854255738522120 +5425080494120913043 +10495881396304567761 +10526438020465314994 +32150308422367541 +10114691898813264327 +4230895610546695396 +9878610781320909616 +683601591743950384 +15231557775990528927 +3227099780227819147 +9501162962247559813 +9870726098679434 +460009723053 +235556858032248354 +1945545869137549623 +1456277662125216370 +11841602811682566013 +2945165090525177931 +15604668241884680992 +1709593881817539357 +9870724610153352 +6926323868055240830 +12292529139749312375 +8244000842282446212 +2210675700308732690 +6313103552897420796 +8538252898438747280 +5938944032347015991 +9236423853034064943 +7246669514622042876 +18150347534711723296 +9127481006616878506 +1996556160 +8743636762783398449 +14383047197022584 +1251322645338286112 +12750379368847128676 +10590197086357424502 +9870724625626144 +15288551291827205959 +4129797 +11757180057583313464 +11433970187063079527 +2624757547995260727 +9056218613256556854 +7996454 +2710531354671724000 +2508195760 +12163663686721433688 +9870724633355193 +11863101 +4014568304163775490 +4682429100742561497 +9034197821468843343 +31586284215213953 +12074504483824687817 +15292217457772289794 +15729738 +1873618489039016430 +10555463259816152201 +17956211257109996865 +18090436408231604709 +2359415917547958780 +1860700038481054141 +7985649352220427302 +3884763533836972256 +2947421187354076114 +5356297031201403596 +1873618446047187631 +15287141171120708216 +15741297269062071044 +8597424731401313014 +8309517628003018387 +15346930885501137021 +538969590 +38929495 +13226937370779017440 +15292499474174516615 +223556669810 +8925815691991336640 +6209987942698084807 +9870724668151472 +5246976969862442572 +1574206512613847820 +46662781 +13819022989868079 +45398647160839904 +17939640265148284077 +546702877 +12962360423422055608 +14525678258175626293 +12140808895952340606 +17201605079460098938 +17884482978810902171 +8766105625110517729 +9206049416896323227 +15293063541372303786 +12836930585685729138 +5572116839385935388 +511598879754 +9625506792066528892 +5327164702437699139 +828707506565436546 +5512098509961900644 +8192767926012228862 +62129286 +5353476854278091546 +2324661969940921751 +6054774376566248644 +490104910583 +6208295792693881883 +15945141114817701909 +11122727797707462358 +16213106141209502435 +4604702688229999834 +17194977454376563148 +1574206405136236186 +15288269284022294516 +288758653463313850 +1733392171009665901 +6980983881528836373 +18413674000091971676 +29048123694142460 +2710500877822857879 +5141454935018381845 +2729847578252628116 +16537607642072242304 +1251604747722962847 +15047343827619573939 +14900735768854939309 +9870726210811567 +11243723090649877598 +9870724714558617 +351107415670407156 +5622546684202456891 +10967469888139169933 +14156200557193210030 +5671848321539130096 +17419818910383689594 +4501637405001080557 +12452112158668240296 +8447694357264607826 +4668335877129451837 +7087483765944484324 +12693382407364624679 +29330140096382779 +5251489270997854978 +4682652064946011177 +6151097683183798392 +11831633449943849806 +5566476571519037962 +14395142952506908408 +6311975513081658570 +10705712940655520143 +2786543335961088154 +5868888317270842406 +5885976108691050986 +1873618497636338254 +12626161495720483229 +1876289204741227571 +27920062381714909 +4657106642463886828 +9042493923911228055 +31586271318580335 +2400818337641492600 +10266892278841102345 +2500897686785911934 +181092392229548359 +17418553073630533372 +98949053236142289 +5728764444738263077 +6156455943245808311 +10051564163130480269 +2625321602296384741 +3135316694092632762 +8694008325645420493 +8273396863062725976 +11858665818790711408 +2537448469785500347 +16712174081697140506 +16968560335088392931 +3076135121411313700 +4011944517417516831 +2903369984119684686 +18197450674983541703 +10546947034642074680 +17738155618413530751 +15291089405057184846 +14079863491765741773 +13166364162431524298 +9231301807315890611 +13882019050382365612 +8473905925669720878 +11257636670666140058 +1985760827161267565 +7086637690941800896 +6208295844283027476 +6031779104195832741 +5726358149067841760 +32150347114889915 +11284191008138612989 +6915698490297883202 +336639206863872465 +5461104765611674538 +162661725 +8036359402298158785 +12243195703567128839 +7958545835315456059 +10241156380278789028 +2606617942940724605 +10558226819440004041 +8160242860007569856 +16893287380996526696 +2211622227514626075 +6968326571703823173 +14101026495482772 +712839370036691681 +12057566325940833787 +13277179828830088726 +2945165086225870523 +150480202803719268 +13142408804399127576 +7465404271947625181 +15291935531649026762 +434216459120 +2624475527293727077 +2337676862271720863 +8876962128767833439 +5522619787666149176 +3841873322109320214 +5299098844308919646 +1518418403436020240 +12707325995277574357 +5245848895653355969 +30740204914425609 +15115560864343548005 +5882159627828333369 +6097847786117409960 +14684039612846652996 +1663089657258992331 +5995296127040907212 +9870724818957578 +12592885735783163473 +1873618549225492755 +14383042897729068 +15292217517958777854 +13623926451797452680 +16504856831747892754 +3361296132288369909 +2624757543695970087 +16857050431360938991 +29330127199746345 +17620986807278186256 +15603385639994484780 +5352348780069013105 +11277056612875784135 +1897969454688587986 +5405598728724553032 +1317178803569322198 +5778348214552114543 +3505218283257338362 +1043117224138656746 +17014826162511500250 +12918763910236890812 +31586279915927414 +9407321094576481006 +6783004000036990253 +1873618484739706467 +6101796011456555235 +3935460239906053117 +18412827976678441028 +6980137858115305725 +5972229159415463463 +8249591958531218761 +9352957117104860533 +4432466727995059606 +4385579249901390663 +15689510638968577958 +5727354418612747067 +4392017156035589380 +7268565939280487830 +15287141166821425104 +440358679437073402 +5648546902921260208 +1873618441747898051 +16876626885959493849 +15290807375758306842 +5512098613140196937 +6262673798362566154 +5778348150066319032 +15289115311733882562 +7192291500354765419 +4211410851928299216 +9305844401735622368 +11111222913818914341 +6206453508332796052 +3873943250738037180 +9039704835036025834 +15291089456646353701 +219257376158 +15732261793843263109 +7141297704415396439 +9870725369263578 +12271613223220242327 +8092838336437359449 +5727354354126952230 +417112835609403033 +1467988640301127510 +15289397371127940105 +13825821270231635167 +2530175340657839618 +13819018690573138 +9870725373130208 +10274127280773012774 +9126257806971387581 +5991347953290916330 +33560368941119223 +8075621789811551474 +8073247776171913603 +15511112807509015 +16701715496128957891 +6155327912028543546 +9870725384730168 +7353451346654856133 +16872667624306445324 +16262181890814463867 +15289397306642146909 +13030536866458378253 +31022307299116114 +5245848947242503417 +6979291783112622297 +18411981901675757600 +10644388936944669862 +11907383107978739083 +12167277673355696151 +12824792754120716978 +15665866458652498213 +15441701681700817837 +18147410470752696030 +827297424551466945 +4666917825444403253 +442813796897 +4278978501 +15291371408562797663 +5353476806986971846 +1318045064297522622 +5832726211623473109 +282527140 +12297463015905518675 +16485145185525779165 +14210865168132151150 +224909687267083174 +5881302580997524672 +15291935518752402256 +9676863164935064670 +6366353527348871621 +286393789 +14163281729483920266 +14739376145019984363 +2785071646027375742 +27638041680161034 +7085791667528270248 +5813899511977040152 +18086417565594170939 +8661371014377925775 +12363581407752430742 +17341038768065423287 +14312864964518021679 +1873618536328867707 +5533048425601441295 +5460499820832500235 +7034797871588901268 +5697191329765530645 +5202734322665524134 +15805298092799782048 +809633390 +6204347606046083855 +10623016643070079048 +1873618493337057849 +1313539797 +9046833027355710210 +308468588452913239 +15287141218410568767 +6426677826083628525 +11661747087386697114 +6134332588001006227 +2474798013503644880 +1321273054 +11555545862197819369 +1873618471843080488 +11058871887416461593 +10840261800173376128 +821233353 +7246951513828360962 +6297948185907634000 +1251886695340122541 +8681423713689755090 +4316759783249760203 +88027128063807324 +2428155107829307763 +2625321597997092319 +15290807384355641097 +14951165587878190821 +5949516568421538057 +14038183314499662485 +1464322388375138510 +12579117828039190676 +10534537747099039203 +9439886321921561510 +6155327963617697055 +1839046019115126196 +6759780578522242261 +12209625250763000547 +17395605973635721967 +6206603745866814058 +153940950685137781 +8139517951562233731 +888441834829140043 +9294580639848358096 +11532485104076730616 +6726231061287806581 +5726358144768543157 +9870725981435506 +5197675272338018229 +13108405724425309013 +15291653510947475586 +15289397315239490603 +4344823691378430438 +1251040684823241571 +17113993018971654643 +12826221827947182920 +494402937673 +15293063524176370481 +1168741892497888824 +1761997673788693037 +17090754617222957219 +1367672557 +12569524664470295615 +8155288057099402678 +8526711239344595300 +17364662051350852128 +18216242462685551317 +18159641260425093389 +9829701016400522988 +5598348119618174243 +12908144046487836586 +15290243433232815744 +8415243655831175334 +16385074671182940862 +2524806052879296486 +11848991023464409450 +27356042473771593 +429917159273 +29048106498199262 +2624475522994433578 +10165889801878452074 +1761151706263610717 +1254706859366831420 +11523184425139054812 +3188833116656766262 +8475642853493990840 +9945546346258635765 +5622264586118514470 +14665089393971784 +10479231126536346430 +7762829005246905467 +3435917027951334565 +7352605323241325485 +1410790453408643266 +14265238122439841505 +6770786097090925601 +14390322180835137488 +10755598245106033947 +16217390188924312524 +5459976678505998844 +29330122900450125 +1873618523432226443 +15830214090111545027 +5352348775769713020 +15285676480439594525 +6151097665987880218 +1361488794578018614 +17270771199091629747 +9347818902720819042 +15287141205513949115 +243555661719220516 +933797253078663351 +5251489210810132590 +1873622113232581091 +3630397427902998409 +6817300601685632817 +15287423213317666072 +15846041951231814295 +4563816462554643727 +2729283278899850886 +5674104465657899222 +1517290337824302628 +31586254122676577 +16735523999088843175 +17256051675370571842 +3016042400370157932 +2234239553823990224 +235395555684662829 +7526932862385402865 +16690402772992934648 +2560318637201249999 +15981943043688588940 +7349047731883807343 +13619391748268250528 +7031882959323143046 +214958082570 +9870724566354421 +1779588998747329968 +16135497067825285752 +9870724570220576 +17564225130023161877 +7084442110251452121 +603602195030235393 +9870724574114773 +13819014391274615 +7351759248238642057 +1019188102897017522 +10457150340041939622 +6153353762816812015 +7410216127510695995 +2643887743696907313 +15844891354627262390 +5782296371106157862 +6847384073334775503 +1574206439529474720 +481506304635 +10754463181178746958 +878291216191535826 +5731302575166811229 +15289679310146596067 +5849425285973241078 +32150286927152488 +10161084465222725026 +9870725101221221 +16039594574674268468 +5832726207324168210 +438514504661 +15980178279355273073 +12596269962708331550 +1479804686 +5299098870104805429 +9870724605047807 +2908457255494772827 +15268132249455061216 +16395966284759263865 +1254706867964177994 +30740209212484222 +2156289446560423507 +16147977269735330894 +4588138387685916427 +2136560116853861172 +3952271818178380983 +4909778994926397918 +491324891 +32714354124942027 +6151097717577040385 +1995310974 +11941637280283640207 +1692777460863410404 +103743344979355833 +7418687625813384142 +2884594 +5847102830955858343 +5885976143084274276 +2430948649855553658 +6751251 +10645863037991151602 +2529047210560335574 +9870725136020914 +10905737396268438657 +11234565534460024434 +10617900 +9870724635980867 +933515180787982685 +9700294587232637915 +9870726139967131 +7245259415412146886 +9005931427805733147 +12060104477863337529 +5251489219407469192 +7662399932478219767 +2696565072057164699 +16013808936578734898 +8300077830978164556 +22217811 +2992195201400050562 +1995983940538736040 +15289115337529768006 +9180319026196387646 +16051520737623168281 +2625321593697800095 +1784103993537359347 +9391897685297209412 +7397691523196985609 +956348125471591448 +1144540869192602308 +17945855709612611972 +5722409893636161563 +10613272003174284459 +10703589638926201421 +13938987391584770624 +9870724666913919 +11474015373474348868 +927164962729303160 +5572945699559984183 +1943289737916795389 +17951052353838195628 +7704688862763773411 +5499923848323417907 +9870726170900137 +545457678 +13355408513042684787 +18413109975884759114 +1040297124597678862 +6980419857321623811 +1574206491118625083 +15292781533567335915 +11939363345222087378 +6293435910568086728 +1188638058636861006 +4937017507177903950 +15289397310940208359 +11129193728552682331 +14096308485669804203 +11740202408460043807 +10332418983246965588 +17072716876704202098 +490103657760 +18016334668925595547 +18249294798171685441 +11040187364284242589 +5464488915154442712 +72484027 +419198082166833835 +13306508515026147883 +15751385920443469226 +10044825009625918587 +7217281392195425246 +13041267244531200236 +17269818383813195481 +1873618252584738327 +15287987211731562869 +425617868501 +2911326059916042124 +8989473043818571748 +4599743200770987733 +16595621733296265141 +762473640682735946 +15291935501556478445 +16563634790306888509 +2624757578089181932 +2624193798933584014 +16674297651552738547 +8930986358196739419 +1900779120206958578 +9870724724913357 +27638024484253376 +7771697831659062002 +103417081 +15291935458564646582 +7459729687815023747 +14559118948838741844 +7912370406166259284 +12219117535699152648 +7171766867999275201 +1414174607250698576 +18063174898316288112 +9386257309952712149 +6548876485635156900 +5703492432349319715 +12427562674559266417 +10042078279030807026 +1873618476141123577 +681145240220011472 +12061796602075431983 +2625039594491419087 +14424532988687306644 +2965365346664797865 +63936358548914674 +16849797729073459558 +7086073666734588334 +15290525359356003768 +10207847739528780991 +16639809534942530496 +15767162063494536350 +10225919150420461575 +5515200703288920506 +9352943110403218958 +6535372549218440134 +9185851942203036927 +1136798196293307757 +3398730679264687940 +30176172108699947 +16265367920604762376 +14364757550470663286 +2295646004956239866 +9388513449773438195 +15291089426553787053 +10375505270699021157 +7462267835439472939 +7247233513034679048 +14538194681016708174 +17709990174765048430 +13951205954302381941 +157549888 +1625947627399697307 +5672976369953683127 +13525196865560913809 +6911714086613696824 +8280922703389596401 +5565348467217402414 +2960499213716759858 +161416527 +2573543627316202601 +11310405372725705573 +4864887511235379907 +5423641518301263109 +16880857162094090383 +27356089763656541 +5194009024711258418 +477207009864 +32432333423380448 +9493723617013877727 +14820635579833609740 +17092728744939510626 +10259028607374862606 +12338342844405662483 +1730290029271998276 +14110783995741284924 +10990133642957569792 +14969859631361307981 +15878320034000876878 +3599492706464722929 +339483261160202220 +434215205453 +18412263952471228466 +12973380301214014326 +12824037281249573982 +4742067642791908993 +15293345523382698911 +5871208567141717969 +10474207048235295304 +15943731002711157176 +196216176 +17788557728461047252 +3460521979781528202 +14749920010802766644 +2098736640164052031 +1873618527730280387 +15876327933690651514 +9870726329431753 +12878345575739509045 +4859334315770257192 +937754980934763241 +10531295842117158960 +10370729796382046672 +16950883004540667586 +158207775634977309 +5522024736058649055 +3026423612622065999 +933797278874546860 +16160560181895194341 +9274447120509768893 +7140733680208183877 +228857904007634569 +3754574152170297744 +9870728841230128 +13146987887805686544 +17938730908242551334 +5889642304730060696 +5778348193056903030 +3629332477275302954 +13680096657878695637 +2211239741712002138 +15287423239113558496 +1873618463244494951 +1575334505139957829 +14947088600292323 +14192355746005783806 +996590897214025982 +9870724848645420 +13708108551856673036 +6988545966851758255 +7352887322447643571 +15291089478142926818 +29894172902317697 +12083133568301284032 +13324725761566596619 +15360120929728470903 +9870724860245320 +5458848591399105209 +18411417877468545038 +15292781572259856161 +5996142189145703694 +7826763666386332808 +9987061831489363299 +11076096039578844870 +16770597264898417379 +15291089435151117093 +15890644307060599424 +16549745340512096141 +6927733962966040755 +9870725375751671 +8123193139503132375 +1597022946175429740 +9870725379618323 +32432385012557461 +5515482706794530673 +258082202 +2549492329236336102 +12208793701351053573 +1090872780580349980 +13939868793082899160 +15349429428663313140 +3410549374345297591 +7139887605205500449 +17427577199299285236 +10405848068503987975 +485804368492 +10873966970211807730 +7030300301730662552 +6293435863276991643 +14221361191285899728 +32432320526773057 +1259909075405726176 +13502559669549880423 +28766090095909537 +16028738000198186943 +9870725902857812 +5366826267253631927 +14932478444660611254 +14320732808355386544 +1873618248285442526 +13760430362083747414 +15290243403140245890 +15665492572493588861 +1945545830446413844 +5112676103982622317 +10914772914477802164 +7246387489621148400 +14986615106605510852 +7143781120203189104 +12773134790148374135 +27356012381216849 +11737382248731404896 +15291935497257175747 +292881867 +2624757573789893486 +29330157293668314 +10563650164269851741 +9204262058052249693 +15290243360148433215 +1145668913309105568 +13619526460821619941 +12461723940949224717 +7359520805088813991 +4903631596662107477 +4713167435525209424 +3501516134063890553 +7071376553879691544 +1873618514833640245 +7595769061852002319 +5301072911837701700 +812254851 +1092418921661752689 +9336987527844929994 +2160237676197592679 +16629894574078693466 +1774230699994274082 +5421385417173064125 +5982845010607741385 +2573178846528035675 +819988157 +10369289972403561180 +6156455960443096349 +12507909061331411769 +1779306973746508389 +7033387772379005278 +14374489140240718662 +15291089486740288201 +3614677512770034705 +10608171860911928188 +17332394474630758108 +9870725956990563 +15266692603726553091 +2625321576501875121 +12799670060150321089 +7353387594672003863 +7360210704287283085 +7534809518348582844 +16148823263055139110 +1040166233004795846 +13819048784514567 +15836739578038606883 +7245541414618464972 +3590924555701079273 +17296692986962850434 +5826509159087032032 +15387963603965000332 +12477508139135623839 +4532853236636197911 +17945855649424896798 +1093547056057294185 +12376411630365915714 +879419204419603442 +5767631357003321923 +5210543144881186640 +1731418094883657987 +9669261225667490009 +7194547618679095992 +8561876806648738272 +16952214309670688886 +6013889919468113265 +14101065186755398 +613166273235722501 +9241910669144171999 +15900243832281263791 +17938512272622309819 +15288269309816936886 +12269921081812150789 +7352041299034112923 +11127650530064345258 +7384649264646929032 +8911802252947887442 +472907723685 +4829203845596535883 +669112164588807871 +7301047503094743943 +8686289252764561359 +13824860123673681402 +5299098861506209252 +1881933681 +16957192840682156243 +17647098720905550874 +13217980679449940080 +5725098295989334698 +936899437808337273 +10333327937035851458 +7942407836905444390 +2374936041606507995 +7511968970221312770 +16592324700377915382 +1333166986502091636 +15291935484360539728 +15288833334022915307 +5993604037221946309 +327914135727990311 +14659639861312833460 +10694233064381619182 +1873618523431002011 +5886107891858751650 +7139041581791969801 +10681576977139326636 +9785132970652686894 +6041909478096836287 +1714117073096956711 +15291935441368719109 +3577503648415551116 +1788767126380362187 +16878036959373645770 +3825849882297725387 +3571317472768713063 +11333843801102443076 +3233382516488212471 +12221091663415701629 +13524924529209056721 +4089901340553009864 +2625039577295495493 +3210917642460948684 +4094565860123304032 +18118866318777725827 +28202074486096671 +1873618458945205635 +17999268765105679643 +3306426227974958690 +5337229690844632517 +15291089473843637423 +950543019372127997 +3488619040242036849 +10222252851203359868 +15945825479404377313 +1517290316329087291 +7300201428092060515 +9870724565136300 +3202922851048560119 +5888081980883930144 +9524125248559795403 +15294191581189468907 +9870724569002947 +4541861655513418220 +5564049544093897121 +15420834744058331951 +1839046006217259958 +32150372909517200 +16922696043917956637 +9623613289364073464 +525512559217688259 +10168427885015885405 +828143409273854690 +3231058998890417724 +9502022867880069262 +1623790200744731000 +17945008198863312198 +2674042207935798002 +15347737330247080789 +1254142843756965077 +8920676095134337567 +14975681650483334179 +5991347927496395331 +14480951791731559034 +17503678407765807291 +7210486241685417550 +9870727092401956 +2573543610120277633 +5510538194714568500 +5739422628533395659 +9289441360305072594 +6152225714402429344 +15291371425760088810 +460011084080 +2986779679269668953 +2624475553088367892 +6787015431626369712 +10811668336293078713 +8540705002678719775 +6366071515244616433 +1415013408097571265 +9870724603802616 +1995137856937481084 +16390319169797504746 +9870725107709309 +10338391197844399016 +11256567291720577773 +417019284152 +7515799761807368329 +494696907127021209 +17464342816563290040 +17939521450163263880 +27638058877472665 +15556546393012978127 +4212103010529069311 +15992175662002018474 +15292217543753417741 +931541078866089325 +13568379163883083550 +1497892630 +2624757569490601035 +15568274597296807663 +4886440193217073789 +9183703291814092561 +8979689818554200700 +1362616808599284576 +11953202117102419091 +15287141235607874946 +9870724634735672 +15151374225306513507 +10028063337021333827 +18195698275541214524 +10167863869407234101 +808132802808791558 +6103488079777762859 +45968884299360444 +7082192198531946300 +6018898523005151172 +1873618467542550291 +4487145878198644205 +935489304205211271 +6101795994259359978 +13941464732324734624 +18104401478769457914 +1007582084889057147 +12267888773868104643 +14746926814522055208 +4991817542145479320 +1522366620176511881 +245052020578 +9185819973064408741 +1844100778258209199 +8611086590374323050 +2625321572202583438 +9870724661802095 +6156738015537875864 +13819044485221601 +1943289737915558577 +544212480 +16232392974776678134 +14203572002560224956 +9870726169654952 +2785415287546666220 +12472063665456507833 +8320301918971440071 +1093547051758004257 +11171834454139940150 +7535405950811859123 +3832333999151867780 +546101337650574325 +30458222904159377 +17464068221838907176 +16247734192862424808 +5197393238739784579 +5397105745613952825 +63505563 +12743882002561632552 +7139740716347051169 +6979009758111727821 +567412279 +5250643165901381758 +18327605802548145346 +12217235187456567749 +6152225722999783602 +5886953898076351258 +3438167358949053004 +71238826 +28766094393942319 +17763448248357490668 +13749155634582655471 +27638110466608958 +14694978023917490366 +1118323118388441271 +17630049038116467087 +575145542 +30740239306410669 +13560859926194891005 +3402960955399283611 +6928015962172358841 +8429692928904467482 +15291935544547040024 +4151361015346892986 +931541130455239688 +1733392171011027522 +12087497983987558341 +5141454935019761158 +1906986264008724580 +10756726237632149761 +11229760240794876721 +681011611083878404 +10488220504998021225 +15289961356642761624 +7198684663706688042 +4572017800037680365 +27356016679265142 +696271930738426452 +9992527074865663390 +10458005382944483757 +1600273850571254478 +435260026361240934 +436952068887820169 +5786652990377505822 +124657395210936362 +98305253 +15453620929460446324 +13598617575393015214 +2676033360337056065 +14454416634920314875 +32714319733083896 +15290243342952510989 +13657715402944293382 +6863925680637416583 +7034515846588006792 +12314601354656483933 +14665063599467389 +5701610638673931910 +1092700976755328734 +1873618519131695884 +6157866042455837980 +6478223379528837310 +1308238841621927366 +6840610687814808246 +3666742335828478121 +1873618497637726063 +1732546160494134679 +7979696626685139120 +14585410861575704593 +12508739422431232227 +11289225556530917783 +17172592526733359096 +7971012929093906332 +33278386930852538 +8969086886610104939 +11965380885748472482 +5193444991905501293 +7410231625909407456 +8563886248125024784 +16878319014468407682 +2625039572996203816 +5458848625792322479 +1873618454645921381 +5880605058071742002 +16591082850650774978 +14583143728432886646 +15637335605355352721 +1782138156891198263 +11734403095994317094 +1785804365828067265 +3096164546429082296 +15292781563661264152 +9870726266320563 +2785415296143990998 +6155045865532511231 +7198359957080393874 +14036340911857210825 +9416912527474634937 +12541491074063218698 +5247311336505289286 +152438052 +6098975825933387082 +7033669771585323364 +13674941638904719121 +15291371485946606147 +1839045980424006359 +160954422714439521 +6703493600512470004 +164037989 +16666967011313718235 +30740290895559077 +9636317266205479853 +846335125346347100 +14101047990837040 +15289679327343889961 +7666030179789456721 +9870724793267444 +3450640455353251231 +27638119063966431 +15620129942127983306 +2449021711964769281 +2624475548789074703 +32432311928176852 +1309126485043074298 +2509417099813654913 +17234998138415687702 +17293401422930922898 +7140169656000971315 +2146416174511245368 +3736453164312315978 +10142017398611984246 +984791066214163185 +15293627574176987587 +5724665977567194410 +14824583848163282657 +15384759274863216977 +17953567922356441617 +27638054578181861 +10676818910431813118 +14383064393064954 +194970984 +29612199490627507 +5812207387766297560 +3405734518778308800 +7706082920376051213 +7718319117380888986 +1873618549226877853 +5389874192312573333 +2230143550562314617 +9340781740412265449 +16860434610997647969 +14756240381612724067 +15290525410943913562 +1873618506235061769 +15292217474968335510 +7161375343728224060 +9260311924979736281 +9942444135735914575 +6110203078097461717 +15732561919051245669 +15587869280535209128 +27920070980412810 +5513226588470407790 +6927169938758828193 +17675072908219988614 +5303047099741906485 +5893869020147817312 +5574057256785745277 +1041425117123789120 +14292233483232701331 +6155045917121646620 +28202057290177739 +1732546104605685906 +7049388718620886100 +1413046619024008839 +9870724855133500 +1873618441749276808 +7139323580998287887 +1575616564532761938 +15697538660546333437 +15292499491370584164 +4940218967072728031 +5782296461386582261 +240752728560 +1571489717050223168 +13292402335039495937 +14105033447215934182 +18364433819292017730 +4585686704215314909 +9830100417878166430 +12994373673115139711 +13819040185927473 +1986666393029195385 +11231012565665256410 +12302836948233035049 +9870725374506475 +6153353788611432048 +9870725874546240 +5782296396900802522 +7571764908361193034 +7577362675405761342 +16204741214597042329 +2691780374684916132 +7245823465413935838 +9870725382239782 +507300966607 +5248951067485151722 +7103619292045067900 +5751162350517302733 +18218201858820759972 +15288269301218356755 +9761729058129654870 +9304031194051794224 +1240063138944727295 +13616847656467386569 +1735084252230151847 +29048140890192989 +5779476284463278149 +6098975770044926517 +5245848925746039052 +18141248253500666139 +11286969433908722143 +1874620259211224216 +12281373727635360727 +4182047870956804296 +4795998728011209795 +2469863980013023604 +10381427628052729582 +3605651160022600893 +7332738546017063906 +6242575413507994093 +17131100478880570968 +1293335412969725960 +2468171842904288515 +13690032841766806914 +18052731453502480383 +291636671 +7945959877263244409 +15128388696816369468 +13913621930043206206 +7032823748171792716 +5674063562281993266 +17686548580530216793 +6331026148282999174 +1731982088997070082 +11511147933886323665 +12875219098145352206 +5410231956402036046 +15291935475761945367 +8421458984219340205 +7815521824679287392 +1306546743205720910 +2624757552294683849 +5357143003025907531 +10166171779588379539 +5993604028623364536 +807143021 +10501085353026659039 +5799492984008497338 +2529047214860999373 +811009657 +17329663563731779923 +601381952041273232 +12835766005610914904 +814876314 +10929709102433264776 +1948084021061447596 +3109223125292307314 +5463642857349080439 +3671265574400234539 +33278382631578503 +6905809874916626353 +1693561390312282042 +7193983594471883430 +1893141935297142526 +8822812889977078578 +2100253976031881691 +5357989099525267953 +2625039568696911844 +9743112694134282913 +16940553195690135309 +15291089465245050690 +13237708526987378689 +13732836927786463520 +9603332665379286588 +13669583374543443509 +15287423183223871374 +13541690390082820291 +15581346388367012015 +14428481252717693057 +15169155012460899011 +1522366602980582455 +12205449418965537273 +2548891158697420054 +4085427941984065605 +1873619090912930856 +6044165609318989034 +12578042351787652594 +6155045861233204871 +12638469408653464778 +15083654577992979739 +16166329222668905868 +5565348505908695851 +17455890491691920545 +7317281017782883255 +762442841504245694 +6443907667319931212 +9714279561605172612 +12721702831074380013 +5841185649501418665 +17630638801202464791 +985919131825825056 +17573925580552936030 +2555880847050690414 +9504169244365699417 +13987828013161655539 +1780963011035742366 +7246123584755418796 +15288269309815698048 +14101043691544194 +9828008900787132857 +1837917949205570768 +8663192669256823751 +15209408714912186127 +8589681883221465724 +16316925693461608768 +15850359680816535267 +2624475544489783933 +14005723693120052292 +451412518552 +7872981627489315757 +6043037548006558375 +15291935527351099146 +30740222110468321 +15290243390242364142 +10049393462884910172 +3522810826906877892 +7679674771611279358 +11835599067419648637 +6620496035125860916 +3347279017402898015 +6097847760321664671 +880547317319950217 +29612195191335382 +5517738833717378850 +11457959405705238709 +10769578373240941806 +12748112291592888770 +316179072406332500 +1780155235552945020 +1783266201007707761 +16317207709863859557 +7299637403884847953 +17423767204508016520 +1342693798425548937 +5135803583547851857 +10750398672578677744 +15288551261732168135 +10585955821198915994 +28202117476650811 +1873618501935788507 +8901104167878344727 +400166564590863958 +1775922824205110202 +15456806089619894268 +9001997421526741423 +6812224306436920536 +1682680374277989351 +1039733018707578707 +16876626903155551579 +5248721461509825791 +5513358393134488004 +8433906131587582384 +18325349748710993602 +5780604362970368396 +12475063478969843953 +15290807392954377448 +9250915995743821411 +17390969192349121601 +4025969582498384194 +4029907647008034055 +13731426901660948259 +2308422113011377700 +236453433211 +5246976982759182570 +17304245516390979606 +11660754516412341200 +5356296979612397740 +11031641287483677090 +690631645675594535 +5428237393705393391 +11907271843828756623 +9870724575491042 +33560386137173145 +1746055167172760063 +6149598375218386844 +1996539656478534583 +8250327210023282803 +10222816969990219834 +985637059535130935 +6319246717100370682 +13669865326458706783 +7201342231718608216 +5440927979279245695 +13913370024715953114 +5557572763392946174 +7193137571058352782 +5197393230141202145 +15291371468750669547 +1254142822261742931 +4132669993251903500 +4407364868862332131 +293345736362980236 +4584808512338026933 +11043873737714383871 +5887104182900248897 +1730290055066643170 +14399488102094933392 +15515140772745448905 +9870726094943878 +16432982272152706522 +130892669640585247 +15882855708139392125 +14044077159593438080 +15199642164657852783 +9870727102756646 +12931665209780486563 +1667601868112862240 +8280067122480501959 +5459935770830769672 +10715070914043205513 +1913870154341565156 +16644468257489631229 +11404118041703748386 +1763208255305438875 +10593581330478681876 +12395414163197278166 +10833739905124355476 +6481871188466878976 +15796816026966495987 +9003210821223199782 +6928298012967829707 +11847386798519954485 +15290243377345731272 +9870725118064026 +6866966013877764745 +15289961326550194705 +2949113337358389842 +1998795753307461621 +14294005446368052997 +5296280548806910018 +14383047197157380 +15512482701174189129 +13605998671606326781 +106292516019772003 +5352348805862394759 +9870724625757217 +14267039342724253831 +17617602631942286124 +2432358684579796618 +15293909616375117489 +785983290289902712 +2624757547995393718 +2504460206 +7718319100184964408 +3445018729739989073 +4451375502035851822 +9301103273854319633 +10619901526976780060 +5350506396829035610 +7393621068155991924 +9870724633490478 +17264773178461983115 +5619162452978119064 +5301072929035017852 +8127528 +9870725133530536 +1734238289004278760 +16204231200463069396 +17247780946628644587 +11994175 +13410742806322030672 +1873618489039133624 +11412546857107804442 +3226253748217082350 +5513358401731838337 +27920053784486257 +5513226571274459710 +6504968775580070363 +15433104991841299219 +18275682023424408922 +11069735604463344216 +15294191632777375577 +1838763976917146120 +9232711897927338500 +9558534580536749342 +1252168771930237146 +4030203865610717748 +2396151281198721800 +14057775905550201721 +17488950423847769889 +9870724660556893 +829835524886184395 +9157293160736111604 +16251729390381328132 +539100664 +39060568 +9870724664423542 +15292499474174669464 +5354604872598823458 +13069073579652293251 +8919929881589600017 +7562235613619577154 +9870724668274509 +8245128912192352085 +546833951 +13819022989998772 +14930250446873368339 +1144540826202171285 +11912095569629300206 +6927451937965146279 +12596183788937233017 +9558026013781811396 +16106972707794721867 +14616956528988991929 +15289397332435548537 +1251040702019287323 +18058658402853281465 +2784225596819270998 +1143098876954482150 +10024345359443059246 +15293063541372426467 +217080530172593229 +16207239830843570561 +4761886186447852757 +17186370630874107103 +62260360 +878291224790252082 +1947716014106162848 +6443907641526654790 +5250643165900125552 +5623674702523228924 +4298414132915756477 +9229891721004007663 +7033951822380794230 +14101039392247632 +5458807795500806981 +8681213026302114947 +2624475540190483485 +29048123694261023 +15290243428934884577 +32432303329592178 +14638525052008554926 +5140044900295661379 +1200046914678451350 +8431631716592337694 +16659454807516214139 +9870725206996423 +15293345557774679959 +1730289999178194817 +2332012841373161719 +5240852582657494059 +4337170013166319644 +1894834111097238234 +29330183088311204 +882239450129394054 +1761151680467847342 +16431854262429431891 +14971589317369871628 +5044542787893160900 +2584893974043581948 +7942407811110956290 +10077282064862636797 +15197950023251003852 +1384023211736133624 +12845740672770588822 +1873618540628297709 +17373053078950977655 +8861613698626555511 +5137495716357288805 +7128703058323390007 +12929432397969446633 +17423211942229327457 +7621913163649599910 +11880218193470973689 +17542236467437180666 +31304285008968933 +109676682758466283 +6311975513081786898 +1133103310972786386 +5566476571519171130 +15288833286734436596 +5728764487730212802 +1873618497636469758 +16221687400139864086 +5871989498453189652 +12212827544315501869 +14581006459149302965 +12314414645940922187 +1251574455857989001 +31586271318731361 +15159186866890947381 +8556410824327315218 +2906754228240934859 +7033105747378110802 +10280579133800254756 +1769672202149124548 +573229920263742729 +15702724692398792342 +631899730 +15557278701187637051 +15725031827838167386 +1418817828737862717 +15289397384024698036 +12753199627454925917 +16542141154387102385 +5015996636573993926 +1413046567433615739 +5835546379949577916 +14036491233280661733 +11365181341790072590 +1893705985299015695 +11517440269816975399 +7772879542311334896 +5512098561551177664 +9870726276675257 +5837238474066511877 +2046106469058877188 +6171555223140725035 +13172983638970296139 +155059516 +16870693492290770074 +12235651944344271844 +17051937967390024900 +5941764183477192725 +3292973778355298623 +498702380670 +11205806960972548635 +3609094385226175906 +7604467390466450811 +5513817389218728411 +1730290050767346933 +27356089765032372 +12876737308331236361 +15998406944916508954 +434977997061098756 +6794048421009959290 +7300765478093849467 +11640717849549426443 +2329319468062435281 +1786360098964992662 +455710554631 +17783567703121203526 +16778219691295707790 +15102005417804657484 +13886079656139432480 +434216571438 +13672737712787960799 +1626046306172431627 +3040438293561881350 +936899463602985107 +16739161091967946150 +1312691032915387766 +11997375390319974297 +11049193772022588650 +1042835280820845218 +6406389097441593847 +6926605914551615631 +15288269228133988660 +17895122959532631444 +850596550537792102 +3493131337076918972 +1357540530546501915 +9870724819088651 +14383042897861939 +16882831221024319231 +122385036241081800 +13727196672816140534 +17551250931790261797 +15292217517958892857 +197592438 +7138759556791075325 +967443758300812772 +12893049762838874683 +6209141854798896979 +1732546190588064701 +2624757543696099720 +13726982080795195038 +5267137917481983512 +933515197984022026 +1440053985925492649 +15292217474967094174 +12593841123447548561 +15288833295331774126 +14528817031078043792 +7087765760851706345 +10692085539022707945 +5505241339298523840 +2383852656425575079 +5518302883719228849 +9870726346274507 +9870724846155044 +5992475971611681828 +17307420556298763328 +16398649213071159857 +2651921211458151607 +7404459921161532363 +12749251346227338939 +1728644945 +1873618441748025463 +12350988444867431965 +2108679791565161300 +17992659823285702902 +16323339814556356828 +9078366217257036700 +7299919403091166039 +5938014367975435237 +5783988525409776237 +15290807375758445945 +236258691 +14564181123593413135 +7243415019521384115 +9539521017755354825 +6925759839548932203 +10547295635315371135 +219257508005 +17952180354961579308 +14512708438227030131 +1522366594381983201 +11290355519663136251 +15289397371128074333 +12506268819843341031 +13819018690699804 +8852545540252396848 +6203069285705801499 +2782533498403045533 +14431456801422718222 +888789540238073073 +9800311730678027385 +5142583000630176118 +17461812021830358981 +3911601570557991227 +9870725884900941 +5248951067483921775 +507299704980 +2801821096146649222 +7032259723964580154 +2731539702463682083 +6362646380644222589 +16338691374403565099 +504901560953345887 +12480382642832673196 +1873618269780791873 +6981265928025211174 +931541147652541572 +17300923233003725243 +8434517392362839861 +828707459274453945 +17961737460734889942 +2321496553295659308 +4068664319224734911 +4279109575 +282658214 +14298576506808115698 +9358603280051813204 +27638084672122724 +17465760247169486548 +15124099716037499738 +1309126450651225264 +15288269236731340181 +4326349077500142072 +9193717804552053466 +2286684057 +2925174856428164041 +16222815414161202535 +103743370772771709 +7193419570264670868 +989867348566368792 +3439535456067013196 +14108828812450874842 +15288833346920931600 +16906298182510600633 +27638041680293293 +8284246656382409048 +29612186592757197 +15290243360149826972 +2440204807007903460 +14284319595218537821 +7794629221247622916 +9870726427473630 +1518418347547708715 +27920101074341804 +805897830 +5140326912398604299 +9180319094981618786 +17950206304630091246 +5903825491161276302 +13281827118164687786 +809764463 +12001697249412732143 +813631118 +15287141218410698262 +1873618493337200892 +9230737800304730396 +2842209283296859097 +15289115363323170505 +2053509872806552339 +15293909556187382936 +15290525376552050330 +16166775548975863911 +6360390270918666178 +6287869989401152310 +5412649134492761973 +1899651045998075857 +243555631624180179 +5938217001569427945 +10490356163379413628 +5170355050641375728 +5246977017152434979 +2625321597997223316 +5305355559708142053 +12903069678852202883 +6534205820915171740 +10570457972707113816 +9062428130096017485 +30176189304760375 +8661223270696577620 +488748054659353351 +18001510391656238680 +4161110871646413318 +4986787633482244113 +1518982380352197686 +6362646432233375559 +2352416671 +16316925779444003731 +1199901724427695586 +6153353775713552553 +76768722591314839 +8021450341214589153 +7263337749694861831 +5532932791479705802 +17571002197478427058 +15984970341926834871 +3602002394967517786 +2703128350473982316 +14949273699027978859 +2789363538680430312 +494403075027 +15336507519928984140 +7001542349734489147 +5197393221542614320 +7299073379677635391 +7299542694337136418 +5692765500615842901 +4441860038886778613 +1211499489372297130 +12613857801118618794 +27356085465715224 +9759732374531829669 +18208616767964668047 +17043213076321103189 +15368335131707911546 +6154199872212897726 +5336848458039635129 +1733674204609407864 +16130795063214818172 +4991776978859617309 +7449243090672305794 +10765335333603786094 +7537364793415920462 +429917278353 +11215879281815657618 +11530680413559800758 +5348008933354446997 +1953005289574068514 +5460499872421779543 +7241043917845976622 +15293345540578750625 +31022251410801493 +18334486185531826357 +1841584123747906582 +16526175391098287684 +10743316419472806846 +1873618544926352472 +13095305000938264250 +12133908888583015088 +10365486602168839648 +2624757539396796633 +29330122900577770 +13757953135961262599 +7600563027796236395 +16996310458143172074 +15288833291032490203 +13280608453224389221 +5785116591021434039 +1785796113450354015 +3784125305237866976 +6137698302350203135 +9784933783855589770 +1873618480440564079 +5458848651586965296 +933797253078783985 +10378117715444851499 +7408330038554999483 +16949958178448691183 +1256494820532118264 +813740659562600413 +11871386724049049632 +3284721633268429286 +31586254122800819 +7736166170195795653 +15287423213317794835 +13719626382719786305 +5855366851174681868 +419755570676453168 +1441652070212658100 +6365225453139920940 +4582661899707430948 +6285656664117098722 +17017082289434548182 +9870726558938861 +9870726058899074 +5516892801705253474 +2392267043374109297 +2325192619342704218 +12562775776235955060 +9870724566485519 +5303047030955590424 +2359415844463725952 +17089062574695330939 +214958213556 +9870727070578461 +11918547727788817309 +12344505928996036484 +6998719931675862047 +12485983435208928527 +14840910596114423391 +9870724570353728 +11232298379820689457 +9870724574245847 +11085135713045851687 +13819014391409576 +1413046550237693857 +15793159303882967 +8207049249448938564 +15292781524970125639 +17480875037442006397 +6208295848581204085 +12999522111801481012 +7353733393151230934 +4658361734735741084 +15312344744002939495 +16872949670802842967 +3164601805265245033 +16315146954142984796 +6600019782220398705 +11835684099239466085 +2107833776748973979 +7778920449755409252 +5302201063430497853 +7694696673418687441 +12597874196251629301 +481506443285 +8773391357768127373 +12313853487258882508 +5142858024084582899 +27356094063071952 +11785248268986625467 +2758840926409265508 +11320486140243172421 +5245848942943358316 +32150286927281339 +17494515130705786297 +17626356086458297551 +7766516328432873840 +9018208235494651142 +16678521331103379198 +1171291029146464857 +17675034304410564352 +15288269275423852461 +4078034525333114868 +3872570509714407955 +18289406713834311898 +2690034417606865986 +266642389084105093 +9870724609045522 +1518418407734196071 +9870725109085575 +6367763557772583890 +5885543833259674862 +8416935758545570267 +30740209212608333 +1987708794 +8568593699972083753 +13690146535500240892 +1873618532029709974 +17843934815554983037 +3015668 +2799105775752866096 +6882325 +1390094258664643195 +10425052701397369473 +5476681269618496796 +9870725136151988 +10748974 +10186528152264525247 +14615624 +9870725140018616 +6926887913757933717 +17686830614129758227 +8716401002755728618 +15288833278135836929 +530653668674249336 +6749680603453807256 +1873618489037884065 +10618847173402653160 +11285990229533799599 +1840738143326196395 +4047541379259828538 +5831598124517899946 +5354604915589401686 +7996937162556271149 +2625321593697931219 +17781311597693721726 +12637906923281005171 +8582815132800394581 +10162212535132624727 +2034108292 +9870724659311707 +11411381048697054784 +9876885857671208336 +15289115294538088065 +8975610360364492810 +6384455843948348921 +1414738695943776797 +9842826966098407134 +14460196276836835706 +7088047760058024431 +11442759979532358224 +9870724667044993 +6663236877230027457 +1996539686572486540 +829835503390967493 +6364097413324149873 +45548663 +545588752 +9116328294975039248 +13355408513042818111 +11732155529883572567 +5849955560047525997 +15289397353932153602 +5512098552952602362 +10165325721782983109 +17177069327929395206 +15167386733525284055 +3200373601203011461 +7033924864732638049 +6206603698575851492 +9632241780191803985 +7498670656683597407 +12737823250019929672 +13524078535889409043 +8653098689197516637 +5608897598720138624 +6388664954993576729 +72615100 +9319532425120017979 +5514204442342657734 +6305726908023380174 +4648156737790761661 +1201738978701618396 +1873618252584873623 +1371414832762915927 +425617995115 +11645035295070314568 +6366943767402079690 +1368312660931334789 +8910392170935313117 +6911687495934168776 +11075097790874326092 +17083411193129423708 +15291935501556602061 +2012231231910403070 +7032541723170898240 +11426056444572228073 +3383183339877917095 +1873618540627052796 +27638024484363317 +1108764208531321296 +7861398105913435443 +7563081654230408457 +6981547927231529260 +103548155 +5208949728437498218 +5558136804797399498 +12974919760129953806 +15293909603477238316 +7264899764736972967 +6101484093599211315 +12258258950024084418 +711211284439969455 +15215179494928288201 +2834870062606331777 +2477484405147110255 +15287423252010316106 +8700494625524747338 +2625039594491550041 +1873618476141253992 +7193701569470988954 +15292499525762577130 +7680096117698871036 +5727072329126253415 +10990637828830226014 +6206321733762759641 +15327427542729050585 +4948291455059191649 +3431825179470471636 +13823902024058498360 +2910437204093325428 +1785514015363720203 +5021379672069854543 +249849513631101958 +11567419905860127962 +6206321690770946704 +1522648636578937600 +4599795435970319437 +1731136039789029123 +210658920740 +15190571396680915096 +16039622184027696493 +15291089426553925060 +9989062872435743442 +16236392829870042369 +4597129739270760409 +10971700108385458643 +897743534098035383 +9870724775310576 +5139394742353927078 +9411879477661493108 +16003077546452738167 +10912798816855421035 +1720270736420384564 +18267072828871614242 +17202169176751951934 +161547600 +5510538211910620088 +15287987284814797921 +1898722222293589317 +9788358908483617731 +18372263615550941996 +30458188511072886 +7503895773261347118 +7480446255338297422 +1881294612915293608 +11312578691943512065 +9870724794643704 +2363364065503562320 +9772926989806014475 +878291211892380626 +477207136238 +11921229953031936752 +1256116941379671004 +9200007808832460112 +14319404355994404194 +34406478335978431 +1730290029272126538 +5890488336741055415 +5197957314536286202 +434215346812 +7087201736644493783 +8091759526349201706 +6280436236184722055 +9885582925391813887 +31022255708859713 +13841817523557509626 +12062924628993513876 +30740204913322021 +3251286420277243810 +15288551330518625574 +15453712700336979796 +5245848874158263560 +2192639892 +1167613856981467774 +7299355378883953477 +5232343688123065475 +14546547440901043518 +1407669396950958283 +7410944675485012057 +2185568528717140824 +1774602691397304421 +17326365370312908133 +1873618527730408248 +1841584106551989237 +17891699556299005626 +28166486445663830 +15292499577351721906 +9067117985047910095 +12819512501036161 +8486327009906794340 +1107456968073809429 +1096085143495399482 +16915376653771492149 +2576363834334854426 +14362669432091467952 +15287141209812115175 +10493899330525354618 +693451783907778915 +16279043917275741768 +15287423239113681753 +13652742121489984564 +1056883739421792456 +4952410902551142354 +2802461850370598589 +1873618463244626943 +5557008764981628606 +9870724848776493 +5416894314771390549 +16341147457515835792 +7903702108917095236 +5071732803364605583 +12841748902133264882 +15287423196121866719 +18390131773883357338 +15291089478143055561 +2625321589398638370 +16048949583630980818 +6045857707735386956 +1413046597527539795 +7086355661641810355 +7160449488865145644 +5780604324279236673 +3507365964462638803 +5483416219052285013 +15289115290238802352 +8787523062794442532 +5516892784509333820 +15287705255515941348 +1996539682273173371 +15293063580063707077 +13392707419519740245 +15289397349632841324 +1912255148622884468 +9302231382455376938 +13112992413210060359 +11615740648557515850 +9870725379749396 +12495289369411592459 +12049243684576969178 +1005889909089114588 +7192855546057458306 +4925669802297008645 +9870725383616050 +17517494253755970043 +8618954206935976801 +15290108271393976013 +17066144894714142112 +3711115253285598429 +7430709205550587935 +10863339467698227561 +11848796902029280341 +14600525102794418053 +4654977494912675057 +2397265941311077863 +18046770826235752892 +12266818901383319912 +18060955726130268258 +7003516464554388135 +12348736218027265066 +13502153632419560075 +10756726254828199088 +17277157789017246676 +1873618248285575572 +5815357128466849432 +3196729899697915794 +421318697713 +12748816074743700602 +17004781525157878857 +32714379920948669 +16919769403845463123 +15290243403140377330 +7354015392357549020 +18412545947378450487 +2624757573790023353 +15290243360148576843 +1156779955689757502 +6979855828815315184 +2528053666091381700 +15292217505061036472 +5885976147382463553 +14268731462635827932 +18173781368276861736 +31304302206278196 +18213474575806126419 +12542901203367258315 +6633107701255639833 +16875205771929809019 +825605274546164278 +4906279987000066155 +8994396775182658860 +14260179052966648221 +1873618514833775268 +31304259214444621 +18182688295015244373 +2160237676197720926 +812385925 +7192009471054774878 +12202104656846212312 +13416806523055515771 +16876897866046726854 +7751349835071770337 +1782138217079059011 +12178000866590463416 +816252577 +15279295921269924606 +1873618471841979484 +7064922337966840444 +820119231 +2625039590192257636 +3454016900026952826 +7141015675115405898 +10066330925397857755 +10246365371133802359 +12356568393605061188 +16683469352030118657 +6985684972259121747 +7298509355470422829 +11204987448696317763 +10260419056709935793 +1436145094782552848 +13819048784646377 +8910270495613591624 +9290028809211500706 +15289115277342161509 +2315401360925419670 +15196522894414002633 +8110757355753263225 +16636332169133043324 +16562086563947946920 +7247515559531053849 +2599235317102504489 +4759617222936916659 +6208295839982637845 +2734792040810826385 +2843337396197212735 +14101065186895045 +32150321320504029 +14108981681153796540 +15289397293744394962 +6272767949351832735 +15469516251686718079 +5888796238324839157 +14212253575230458367 +472907843589 +6125564953884498527 +2221348161771743297 +7085509638228279707 +5406726764242629253 +8138389933240493417 +2201358204387275665 +15197667989651615482 +11248024162254331404 +15107224894534131551 +10316347624636902910 +429916045890 +5995296165732296828 +1385891570 +17397964650095866600 +1571104267697939240 +18206110965885192595 +12445153428583694804 +3217536001876239931 +3862463871782173041 +8251104878595163890 +5995296122740500058 +3324580943442479408 +12855388246984582708 +16239270496562976120 +6151097708978593727 +8927653410928609072 +15290807478935503702 +5495810026726501255 +13147027133105653095 +7246669484528370421 +6138582791864017587 +1873618523431111313 +4619806171270376335 +5528340254170502808 +5885976134485822220 +15292217492164399387 +6588601354970885763 +12710123376153746794 +15291935441368847761 +775817256217764976 +17791918762976348600 +6028198910764007552 +5405437707650735593 +12359137386715894867 +15292499551558445238 +5511666277521099412 +11195951008859628721 +16367553670927421793 +10305743378007277338 +3415946130097518551 +1873618458945325129 +31586254121545127 +12747111051830108966 +13761216938558442715 +2966626551465393242 +13326120046233075732 +6185429174215927692 +3884829281455260968 +9031469484207258480 +7353169368944018372 +9870725053707599 +684134257893445024 +9124183816320278732 +17092164746525683525 +1730290515069725855 +5851982650044144428 +10277194893975960259 +9870724565267374 +9870724569134021 +16613707673610512436 +5555853011653436048 +10464824948131719942 +5783988478121286492 +14923044724379573906 +15385813621703717516 +16043006346467094363 +1088324864916724257 +1890321788466516924 +878025925123138211 +3225125699802657116 +5652457623480306256 +5888796289913995660 +2520575733754390263 +10441809148976579006 +4279680362438868716 +9426711950666392111 +8709168720198063521 +4264363504801684957 +14223898422488550714 +7403331834054582411 +5739422628533509548 +1720270676232642059 +460011227416 +13559180645580620461 +878291194696442963 +2419714185645138781 +15291371425760237367 +7352323293941334944 +31022281504720933 +2038711241953729544 +9870725103973749 +8910392205328542289 +9870725107823048 +1873618243986281454 +1411918510421855632 +4793744914108401702 +417015546822 +5570988833963445656 +6926323889550721155 +417019398728 +32714375621664240 +1873655521448258856 +192461576460776595 +16481687081228063551 +12216752074617208927 +16092841662109391948 +5725701970915305294 +12847295796399911074 +14383068692499342 +7042347284441145370 +10618847259385025724 +1494157072 +14540120362423767535 +2624757569490732217 +10547506079276549553 +10576074740845991147 +17601539498665272068 +883183489872502583 +15291935449966201392 +9870725134906797 +3114039617112991414 +2924288473891935814 +7087483735850811869 +1839892025331628478 +15287141235608010096 +8978914579626344788 +9870724634866746 +6151097653090127423 +5198521321546336392 +9824275679680877469 +2836347432574609682 +10533556670998393596 +12568778706007765594 +5249797103795464986 +1942600866810389467 +15293909573384684376 +1873618467542666519 +1788898229392259437 +5936122143277737207 +21103697 +6539591629328228240 +17087641439171518945 +15289115337528654074 +1413046623323441325 +1884114802737876556 +9870724654199887 +13835731758214956798 +245052151482 +993369602813683994 +10375505326586341220 +18029805427700686733 +9870724661933169 +5246976991357900916 +2625321572202714308 +4762041377741025767 +9183302404537141966 +16227016962321563456 +15287423178925954627 +15663852760867038830 +8097172674103107454 +9870724665799799 +13819044485352601 +5248951136270367203 +14249311570641633851 +236538746433595358 +15170248953810727604 +10655427086318126081 +15287705238320006149 +6206603741566404611 +6125359092805031209 +5431774903609945189 +6745049267550316955 +8366246596836813533 +9870724677399702 +14035970049831429769 +8321459293652653448 +1251040702020666262 +5512098531457378076 +14579759454216720331 +16014863264194836858 +1053111882941623404 +30458222904284463 +15915843526477500711 +1784676360404213969 +16365628939579169463 +13784303663910237038 +15287705195328185417 +12217235230448511277 +446711754671026153 +1837917966401617987 +6155327894831514103 +468604705530 +5890488371134287093 +15288269305517776675 +1399263698783459571 +3057445061938000065 +11984946347397506817 +3891032036572423684 +8109461463812286075 +8898725005986173142 +71369900 +6980983903024316698 +13128164418673579352 +468608568739 +1242408041073357358 +18413674021587452001 +9714916620293638646 +14629743686656812680 +11327137566841769608 +2780982495317355808 +32432303330970824 +15291935544547165919 +1873622633431265603 +15287987211730426570 +5629329310599029516 +1258091056199575369 +16633695839999757144 +5509410184991419260 +9434267504452903561 +10567986055556264839 +14186130719135644710 +9568723490388249591 +17424895205631413762 +3590231580044706632 +1894834089600767209 +11129540511026342416 +98436327 +9870724723799234 +14270423530958305857 +6097847756023739536 +16054777199195929242 +15290243342952634026 +103743332081618919 +5249797155384613984 +9914418921100491015 +1873618519131819302 +11775490430039497991 +15287141244205343516 +5142018959225852416 +8483264718130332712 +1863262418076309605 +17299513073606087926 +1682680391474032999 +5884848103267375354 +1624918257757985971 +4787251587801812210 +15949325364910969211 +15287141179719576795 +244362261851231045 +18412827946584768573 +6980137828021633270 +1873618454646033863 +4415038728065278714 +9953124464935195958 +15578876434901652813 +2625039572996334552 +5337229686545451046 +6100103844254129027 +5624520721638841737 +6793473961461815259 +1840738130428326685 +15292499504267340296 +6156455943247301554 +13134019694214278076 +9870724758598883 +2790209532000154449 +6153353844500012583 +10913240739406878296 +1005889986474162292 +11910386680860055227 +4206448621224618819 +1467988653199282056 +15167687298960071388 +12333122725714488342 +12132085556888224066 +8204080288372440718 +15291089426552677239 +1252450745340872785 +15732261763749585551 +12667953721599927118 +13571672302948787752 +7086637712437281221 +10754752208794749081 +5565348510208106744 +13337208633559834054 +15206052346267392201 +12753158788727190029 +15289397341034268862 +5382568464932038253 +8816997365064994802 +5833854272934725262 +10501118070476140796 +16865689102755785527 +1582324813964003190 +12411914213157251334 +2127002776273435951 +8971487688839664077 +15289679327344016783 +402592352509321273 +14101047990968935 +6920839824714454385 +1093546995869690067 +5623362810461569966 +14178085351775625122 +12451287838412705218 +17079023093991681509 +15829812712104870618 +5833854208448932472 +7247797558737371935 +9870724801131782 +12245940631988622075 +17740628179323350668 +2366626229466846514 +12771351434183990201 +9393600789933666871 +6097847807612888786 +2131405968625785152 +4722713861302991121 +17467452354184418316 +14383064393216234 +3878455513181271073 +15743156949551359147 +6863643608346878671 +2624757565191443316 +7085791637434597793 +6204347640438217412 +29612156498960748 +15288551266031593837 +944887022563846466 +4463543734349877226 +2332993943266085330 +2109187656261913770 +1873618506235189977 +5882723695027642787 +6101796032952032386 +5459976661308937534 +4791836802671784250 +15303708896041190042 +8070528080642444839 +15292499555856486978 +2917029403468842151 +7034797841495228813 +16139637609167857957 +2761054786507847811 +15501146095198478780 +1873618463243396833 +5303047099742040834 +15287141188316893358 +1007582080589896634 +12864384740147405323 +7192291521850245744 +8865452070350316904 +13887711574942765706 +3189961255353128909 +1732546104605809358 +12036253157767325789 +1873618441749402214 +933797214387653738 +240752858586 +7141297725910876764 +237634956 +7676326001635167180 +9870726363117260 +13307149191448978163 +13819040186059730 +17785259861724128221 +13275684189377539550 +96809633337581766 +3897700629604082985 +7409299924681690275 +15511134302986307 +3812850738665253569 +9870725374637548 +11705421198335413903 +6364097387529644390 +16101055855214333674 +8862828317998524784 +3445982126355517333 +9870726378583766 +7353451368150336458 +10861968196538553629 +256968084 +2358158792696411786 +512241343558346028 +9319686106503383650 +5462796868327448350 +18411981923171237925 +6979291804608102622 +5144036706252955045 +30740277999046240 +3007579288618485597 +7920022920676785688 +11737100232328035483 +15290243446130943404 +464309261814 +5261190217318416256 +15885957841278601295 +10758418391935683406 +7180372086949573504 +12927193975764819827 +16871539575890972470 +1256398957783358912 +3703818828207571539 +4284352459 +8360314415069545558 +784074337 +32714379919716361 +17952508192438242625 +17944716877657040937 +10691227790196765264 +5386207961880672840 +5350224414818709194 +3891732840317913376 +12292529144048864815 +1201738952907113960 +14362448674145702264 +2524806022785625975 +7140451650908193336 +4451323545700406669 +15646220663009260561 +27356012380114399 +11472543329080990888 +13012130909130153155 +11742458543980361372 +3652559214678449535 +4454707703841762382 +1987794462939090697 +1788616195794101204 +14665059300282550 +8143564249694211276 +1040306627113533950 +6282363583088434333 +13553803778815451878 +15287141239906052878 +10206308959848635570 +13730273772193125387 +1873618514832538449 +29612143602312956 +11475033789476584216 +11183855665340181667 +811140730 +12643792495862625739 +12608349063078373308 +11425304743223437863 +6562480060685576737 +1873618493338558301 +933681580796757046 +12676289072218642508 +5458848664484999772 +15294191680068612177 +5831598150312530541 +6803771475061513250 +818874038 +635482979469435917 +1628020382298483917 +15287141175420265621 +2625039568697043404 +1732546113203157391 +1873618450346758128 +7397691548991756100 +2480754767962074303 +6206321707968235495 +1687633383652210561 +17610742277697650647 +313548357409393025 +5304739129371998163 +9870725959743077 +1573642406723810009 +5063839133985811984 +14125453851780129617 +1467988648899984343 +18315351454877633902 +17441659893659623732 +15289397379726774349 +13033551064391618765 +6981729909914863852 +585952578006557109 +13850362576807929008 +9870725971342956 +7095406249883406614 +14243906671211147724 +6364097396126981370 +12568505768681695033 +16904182278412249756 +4448157743373634123 +13762033578708642256 +11437230683233132423 +11202456194679531896 +3190243207268414455 +6669896685198666072 +515898417378 +29048192479487834 +30458205708378528 +456122699108794601 +6487611298597066839 +14274356095872954750 +9870726486849250 +13495476665398817457 +10199563295936953671 +11301006809185657186 +10481987692921179285 +4967913279473270741 +15132481516176105870 +6429121193278531038 +12999620585941962106 +7246105460321157859 +1572796396206909066 +14101043691673448 +5546278741478162311 +11246066976182529252 +10866328332570863241 +2901086003357956672 +13889517661244569111 +6490821282007106670 +451412625363 +27356063969249230 +2624475544489914134 +5940072072163037146 +408053471422981277 +17689932811754827908 +29330208881714554 +2437381602884409707 +16479243799568462603 +1380779760 +7501157356506459681 +13514760923892903638 +15288269245330052156 +10183587777134293660 +13173976643341333190 +9130453325961579579 +15292217535154964767 +12919095062694400568 +8477811091809980303 +17680342613405756282 +1950279995150445111 +15722045391529516528 +12880159659225072120 +12395940537799766901 +13067141397934586029 +11855352697066244191 +10285392484460618804 +8552319687958337066 +15290807457440278399 +4271541608539432313 +1873618501935895179 +6520857582409176654 +933797274574145484 +28202117476787177 +15213058827192916653 +4607651442236795385 +4826277603759320671 +9448824793222625139 +6206321759557389187 +13553803722927001029 +5357989108122728257 +9608971514272879832 +8551191639545230449 +18159419390874577779 +2022770915872873492 +15290807392954506273 +33560450623100325 +2431125416 +12103881278437665908 +10305085813919854704 +10654574963171861556 +236453566144 +5782296457087423557 +17976521840277869387 +1784103963443681594 +17562557465928747859 +651404368115865204 +14953813045747919824 +13819035886755796 +9774054990929463684 +7351759269734122382 +16983917293218524354 +1148207048035821921 +33842436932850134 +2343872394433215199 +3987538481976725459 +12536734750423408666 +6322334160684848621 +9726821003425236214 +15287705229721426379 +3098695055722031672 +13516171053196712590 +15292781503473660288 +6250589788160084886 +9302231356660868172 +5890488405527506920 +5097395804919372006 +5833854255738801234 +3558529647035363327 +9126223058424237730 +13543274307735524840 +503001778277 +15291371468750808493 +6208295805590775961 +5423641501104231139 +10909696679416980451 +1289442601154386052 +11719664095548743914 +9109352897699209450 +11408069428259070581 +10591607185566357455 +13889891833454676696 +16778219695595129235 +31022281503480957 +10469575575568528876 +9370859833366679931 +11340219378265101396 +12881745539904647102 +17620704795175490453 +931541121856794573 +32714375620415116 +11343333327046714532 +8987866256879803062 +13850666904018116255 +8191639847504197118 +9230173750303026132 +2332012811278107576 +5255980322690972109 +6760344619925576975 +27356008080815152 +880547325917418106 +15771460177937787617 +9870725122061725 +15289961326550343602 +14383047197288323 +8647619234969441830 +13012951802393595762 +4002320314711809156 +9870724625888291 +5504436110766645146 +1177608934696496745 +8035231345285287834 +2624757547995523281 +3532555537066242051 +6033658086902407963 +6156187872936204731 +4548309565419817107 +8258602 +9870724633621551 +5301072929035149893 +5778348218851680890 +12125248 +7623863292059734142 +15636771529559117323 +15290525393748109092 +15287141214112800271 +5356966968269677825 +17258512310888180132 +13600768700763346617 +13382562873017384222 +4092671865166566108 +2207210695286917955 +5837251394960517869 +14450142173637908850 +2625039564397751755 +6974459570491965848 +6365225461738637517 +1873618446047450630 +16967797193504667335 +7397691544692475220 +1575334487942909046 +2730693653255573222 +4753934500331268000 +5831598103021431394 +4964401910911277853 +5722409915131627937 +30176206500795117 +5992475932919286371 +15287705281310564034 +5672976447337600061 +6762882767550042180 +9870724660687967 +3648903859850324019 +18413109997380239439 +6980419878817104136 +1630794378229978273 +5411239052480161496 +828143439367901061 +43058289 +82405218317592081 +9870724668421261 +8127099841899143945 +546965025 +9450919282812469695 +11404871128947508748 +2308422057123069285 +1550911271 +5780770817303008934 +4000515045254372493 +5105457491326880579 +5250643208892065795 +17591137707033063028 +2054817674 +947561152284408111 +1546476616450653730 +9265158806365352638 +16807289281417467836 +2838947274101186791 +828707506565688446 +62391434 +1894270065393562475 +6054774376566514854 +30740282297113842 +17205553326293471103 +9443989419749099080 +14101039392380515 +880927358651743126 +17357547399885563434 +447113337210 +2624475540190617085 +27356059669980493 +12551718261818273339 +2249641152251701337 +15331258510695152881 +830399557690797862 +9870725207127496 +12075580116663744035 +1201738978703011262 +12061232577867093867 +7587760856636987506 +7140469779640626123 +32996413519321008 +3720158282632291055 +18412263922377556011 +17335214655854897860 +6979573803814420708 +31022225615034676 +8481290616208452465 +10992972178292814688 +5569296662462885736 +1597310772 +4758135139739065965 +7705538687087483696 +9870724726420698 +10598104538955389245 +5674063545086188488 +15290525445337274881 +1880166564500877689 +14270423509463101892 +6151097683184075383 +3921035718384826381 +14924276060583187184 +4528905006999362826 +104924427 +13518427137128994837 +5142018980722460545 +8453377129058739212 +525107869847732509 +6524370298441503860 +5249797133889391811 +6978558297828115787 +1836789883593975251 +1873618497636601250 +1148763750796117446 +371941276884364764 +15588524803373231181 +5831598154610595008 +17842057182836120235 +11555545866497370339 +1785796087654587965 +31586271318837766 +5900503424683173070 +10453048286686957027 +10547011290218049341 +13730025380299357091 +8266413341714575734 +7058976945723482222 +6101795981361634133 +15479439859683973424 +7636173669067011920 +9405911029758713894 +7908445715160188495 +17800857886473327612 +5893683338815555620 +6155045908523192172 +18005850164247996445 +5610806128989055011 +3454680143887363452 +6414940924439773741 +1149335070655657213 +14553586164479374808 +10248057448053550425 +745740842898099533 +8703842248362246376 +13728164708410733206 +7247233534530159373 +17490170188584258801 +5303047026657662267 +10375505292194509452 +8037879886770420005 +12551090655171211561 +15291089405057443844 +151323935 +155190590 +6833161505063579278 +1009366474452584145 +15289679370334582787 +1256117005866848259 +6206603707174558760 +15226013478378682004 +162923870 +5022488231488071944 +10701502195652186362 +32150304123324785 +6056466500778599974 +17298949100988032438 +12664851558365611563 +9870726296139459 +455710700023 +15287987241824373418 +2469864014406373877 +13892033721375335909 +17304882408674444985 +1683466373830611247 +7034233817288016251 +3980785683180559919 +4923765278341033771 +16510673542151236071 +15782158822290178296 +31022255710231330 +5671848330136720444 +9870724815353096 +10111511925103077036 +12325680916634492701 +3383183348476635313 +11525142969195127198 +651499399329753876 +11267527389334617288 +1309930957234397851 +5357143037419285160 +16159658050454637563 +7246387459527475945 +13663177753338591498 +16522655212470038539 +15292217517959049337 +1873618549225756359 +14383042897993774 +12539898821926013609 +15291935467163502741 +8386818981010024699 +11075097734987254464 +2624757543696226382 +5887800011770444570 +438763253562154669 +11061538999702736151 +15288833295331896584 +4311555937266189279 +1713309514 +12762680273203524232 +1078354239129401469 +1873618484739970633 +937694971682038132 +14947110095772832 +13282278299792582603 +9870724846286118 +7352887343943123896 +16591082880744844225 +3169683337105056653 +4227200374479474302 +1300970856318988818 +684134283688111461 +15287141166821699430 +1873618441748162674 +5994450116524249598 +1252168767631075224 +2678007758899985093 +18411417898964025363 +2785415326238058018 +5831598098722152276 +15291089456646604003 +8643738869199629127 +236389764 +219257639280 +8059135517526531939 +15716296135804012310 +710425467876225240 +28484116683119238 +15289397371128187796 +1467988640301408290 +7831113200962914606 +6322351693369975515 +6927733984461521080 +929260878924967320 +17151619313115089628 +4764015496858970559 +13819018690835173 +1028746712054055760 +17662551860641031526 +9069229091868850711 +3188551156143255888 +9870725377259011 +9870725381125662 +33560368941369458 +16876333854737584094 +15370149844931527311 +7139887626700980774 +15418151011735770061 +507299841931 +14855968372010917123 +7659237507184987098 +17088989650730819833 +9135420137394870831 +1686568524167082506 +14878478015520070379 +16471989692638565161 +9218778974764098092 +16688455482474714223 +4744952786409559901 +14101035093076273 +9083528104337937526 +17121086937487984051 +7352041268940440468 +15287987228927727627 +3197853692207786073 +8815638558025870967 +442814051954 +2923958282541808983 +5569296722649358247 +12214133062914872150 +782829152 +282789288 +1643579383528384237 +7301047473001071488 +13174660965460688066 +15291935518752662229 +5563295851210940995 +27638041680434060 +2273253019856675359 +15288833346921050558 +7241043887750912262 +3428442719139207159 +2571204766102858083 +15717218084939710047 +5878200460756537674 +12813567607291390386 +1873618536329127029 +883931539947150454 +4462111713977781006 +15291935454266868788 +806028904 +7268009968829875392 +809895536 +1734238293302461629 +12192034692494203719 +15287141218410830768 +13802551532558436588 +1773948670694220853 +813762192 +2126950250258702963 +5831598150311303280 +786775059350627266 +17538999360685417232 +17489329782737551898 +833749216326461965 +5192673801081085411 +3459393948561915520 +2625321597997354352 +9870726958577424 +3844089032834233200 +1118144208449197729 +1479528444216158433 +7245541436113945297 +9642601730832557391 +5992475915723370077 +7023333414277158356 +15291089443749973042 +15788257230634753516 +165635790806196117 +6155327963617964740 +1359796614478917505 +5510538272098491657 +2325192589247651709 +1521238576060323386 +15292781537866892963 +1001690339922301155 +7194547640174576317 +1731418116379144053 +9870726974043922 +1455946291701162370 +1197790757661912574 +11884431389557002916 +7680993515557837338 +13064755378373084846 +7797015921448283930 +28766163180534168 +9474187975278019851 +826733365951292256 +15291653510947749053 +12542055179952410733 +30458205707110771 +13940729091866574845 +494403206272 +1427463126435503786 +8487494934077185629 +17465760298758780018 +18249294802471235836 +5250643148704338279 +8565874746418946183 +1730290046468187097 +17264892917827332340 +6890349946557762199 +1873618983434208347 +16423593172652221112 +10811668349191214094 +15618641120352996056 +16963614270420312670 +3849280189159125664 +13464164554474079819 +1776768834720901269 +3662794063199823072 +6056862527838970390 +934643263595825674 +2791055589805659897 +2624475522994695578 +3575875050819498104 +1784958381107145231 +11474227163622436104 +4659274830459050020 +10803332050175090369 +2401985079329050450 +9162277401029393761 +1254988910162637306 +1254706859367098199 +12189320918056839244 +15635717929499580631 +2786543383251193844 +14264208133785217430 +14666376624573862860 +15287141269999992551 +1042835233529883350 +18198700987291166800 +1843558268660510031 +2200282337706465157 +5138352754589657621 +2624757539396937880 +371996013021700685 +5717788221838659643 +2442391304375849088 +7853619318854676419 +776533704493452104 +918014392041164682 +13941539566152470955 +33278412725621925 +6409380678150995278 +9413007521775495934 +933797253078936013 +10201269960172852836 +15287141205514220091 +5408982882566888330 +18280772498690348327 +9870726551336682 +31586254122913173 +7300201449587540840 +13832769579460073448 +17103490140330927645 +6045857724931445050 +2097890646843351014 +13329769966461154003 +879419277504225384 +3082518526010875972 +2250769226459527275 +6582516930419051308 +15229092110094197 +7528330190111772201 +16481554245638166233 +684134236397004664 +4292439666353856369 +5883005685635360065 +2303192474685826070 +15744000533156661691 +214958344800 +13814567094182624911 +9870724566616636 +13731144829370327605 +9870724570482655 +17636993876761457770 +5943174265490056953 +1573132436952926962 +1372824966366170867 +9870724574376920 +14152025650749140656 +5199085337156340869 +13819014391541929 +3815198782365381944 +18115296894471115512 +17709990179064587183 +4248871370831719404 +2429880022584539859 +11663374006463445269 +1466296477399406988 +17690426914457401925 +17575525470440939392 +2528483177756102884 +6321502891313293119 +5570706796064751361 +5991347906000081073 +860090351023572744 +15116355218574751893 +17047598680933752849 +6444189713816226511 +14425661084390614527 +6443975449313563810 +5245848942943481643 +15289679310146849214 +1777050894113782499 +15998836229705068137 +12555384483650561769 +9870725101483368 +8900230326182748565 +1127239881800642570 +9870726605469429 +1685158442153087224 +6767393152337645295 +1200046906079990188 +337192052980782715 +14173938996056977343 +1041143148010283227 +1254706867964435400 +5570988812466999184 +12162783502519984532 +32714354125182327 +3004215200300482960 +1156159018693182632 +1756819563673298071 +1786650410737099771 +5723537976442822269 +9870726117029526 +15290243377344639825 +14425661019904806122 +491587036 +11529664935751015087 +16607536221675927886 +882239441530925459 +3481112672057237789 +401820771277497856 +5357143020223336233 +901973780138836225 +5623956688833028779 +3146742 +8416561291349675247 +15967564293481176775 +7013399 +12944621759895448872 +1578847559785726924 +12537862871922257426 +1839892025333008444 +14878410640417182640 +7034515816494334337 +5512593570613176598 +10880048 +4682429100741569670 +12189191090870576793 +1198918814675060527 +1873618489038027888 +12187448730858836304 +8401933513408988940 +2189418872080330532 +14943464741387183468 +14152890882399550156 +1331604907921588479 +5357989095224839900 +26346580 +9821766011289486400 +18250203736178513517 +7093579697867336521 +2625321593698062078 +17403754121918826230 +7022345251720876114 +537986538 +16245610700080812298 +12037736283602180992 +4825924017323380084 +15289115294538213358 +12637664220529495818 +17802290221379497676 +1414738695943890756 +15291089439450675375 +9870724667176067 +14713357318707622616 +4159940184527760977 +41813094 +15894028490995487253 +6427690700608858943 +545719826 +1839046014816117850 +1095239137277915912 +17620140779565630163 +6489643093264717558 +145335293558801592 +17201605079459127993 +15292781533567596436 +2785415266050325793 +15289397353932284513 +10739423712638747735 +5888796298512708669 +32432389312107412 +15172821388704969446 +5565348480114297318 +3227879712119999744 +10436529559778643205 +8210297708918895469 +18411699898170343449 +15289397310940475592 +3104131065037544189 +6979009779607208146 +6876602157456694070 +11912481615777833131 +2365056215509069854 +2600731003843928704 +15291371455852915262 +2157660070237326065 +15866601967913540866 +17072716876704471971 +5514354684174938091 +17194977454375580699 +4935175925304405873 +4561962166721335614 +5517738915400599573 +15288269284021315841 +6928015983667839166 +72746173 +6815044500557664372 +15290243428933791031 +2789363491389444518 +1873618252585004538 +5813899559267162897 +34124418943224508 +5509410206486762628 +11062667009424764646 +13052995842842715589 +425618127443 +14749920066691472717 +29330183087216041 +7140169625907298860 +15670057095931911980 +177074650365324290 +2012231231910526474 +92079314 +15291935501556723722 +5407707525201268551 +9870724717442223 +11437390640164794848 +9067541064426464886 +12919891971549517140 +4713167439824751354 +6157380795525847900 +18167404309274053379 +103679229 +475082804681644190 +16893381723416249432 +13849484769990891551 +4654131488695196225 +5460499803636850273 +9561085320276485980 +1873618519133209304 +8561938633303876897 +31586314309417579 +9336987532144480020 +11129919386604487556 +15168533287980527534 +10842237335486411859 +17136224367152473005 +4056396827994562299 +5969680712418613928 +1873618476141385298 +2625039594491680925 +27920040886759832 +10815931410234104529 +12103608816008837945 +5633406452177247402 +98949053235148287 +7028044196304658623 +14655309148374721523 +9208536704097134206 +11751060869867201907 +9870724759975147 +1197790804951787011 +1872174764761641189 +2946293147537328066 +210659051882 +15760372025019280227 +2434595999427594854 +8697674543179833043 +15691697526684666279 +13819010092244686 +5835546358454489223 +17104122556657396878 +7033669793080803689 +5969327292404337229 +5780604272690216950 +16547637327384153799 +9230753948926544198 +153945394 +12542601478514687126 +12332399388406459913 +12642214096204617864 +1414738640055446330 +3121445287022504006 +1147924971445773206 +837357024961580594 +14277274240823148093 +316743057922474868 +161678673 +1839045958927667645 +1519546473346001214 +10427824641686398448 +10324399502378359307 +15515478115210901688 +8437901606391518033 +15419324624607530449 +2462658616946150082 +6093937505709866976 +1731418056191405437 +7245823435320263383 +1995137917125475859 +27356089763897975 +32432333423652471 +15291371442956293687 +5353476841380455911 +477207292458 +3402960985492114407 +13058301027258686561 +3459957934077996405 +1730290029272262795 +11570046635514009705 +5569296714050766988 +237419273278592241 +7465404271946633007 +848960295933204334 +10157982289092096390 +6272538193942160609 +16684272605542105921 +30740204913431938 +12062924628993662001 +8258032047767053090 +15741464833937984976 +12592885735782183448 +6821858679084099389 +10576074758042040765 +11110494887593913986 +5884133751245842138 +700755957085 +3172873343893835573 +1873618527730535171 +11066048138937912938 +7032823718078120261 +5885976138785235841 +17177780796455601558 +16586331478767267507 +6275924038228911556 +5349649388690805037 +14750878608300510670 +3505218283256373581 +6814198477144151483 +9870724845040918 +9870724848907567 +684134283686857806 +7139323602493768212 +5783988546906500348 +1727530831 +5303047078245580987 +16276013091688242933 +10401598182215588020 +17941907415488668393 +15290807375757330357 +6262673798361581629 +2625321589398769394 +15287423196121999729 +1413046597527669677 +9870724860507465 +15292781572260118590 +16414620023533891795 +5831598077226929078 +2754754908433631275 +2181845644246994958 +15291089435151391404 +5399451562199289666 +15225297409718313101 +219260280098 +11849924920350019970 +9753238190306912675 +15287705255516069622 +5353326642538955021 +2820589624262089752 +1005889952081057788 +9870725872186939 +6570062128880310863 +11700344903086705595 +14426789085515294420 +7300483448793858926 +12751507455954464332 +9870725379880469 +10503529180571323465 +12922430063285530206 +4257363433439062764 +14417056387933035413 +258344348 +9870725383747124 +9870725883786826 +6661826795216203545 +6364097366033182329 +5250643183097572805 +12841033000937284278 +4079072023780093579 +15287987271918298423 +2861086850443913811 +3817204165566027707 +12414579355504832353 +7399947658718688437 +3236071028859365708 +13725437689975300554 +15288269279722027217 +16871539597386338025 +9870725903119957 +17016498674549153042 +12488239579327838877 +13044533530008639921 +4801022813111996882 +1873618248285705184 +16349719711739367469 +14610453684522670967 +285410737 +15290243403140511709 +32714379921073057 +2232150464650104249 +6595020204969323504 +7872981597395619995 +8710197104969454316 +7634253624112607124 +32996387724813826 +17382925585909956642 +9999924291741037478 +15942320976585893442 +15290243360148707857 +2430620139577293230 +1806610859089211100 +32714336929261421 +7470262532006959105 +2624757573790152107 +5533048425600462075 +11322331317246432593 +18247967092210291811 +6204347649036934875 +9870725926319703 +3121353141353476565 +1308238858818117932 +17998704710804788315 +11020586642936980853 +12162857194684745850 +6664224291765687538 +5205796391235297817 +8063047438522216323 +18383714950999655862 +288475931845539533 +17417263047611535594 +937181467107482959 +1735930357325653997 +12881008057796342661 +17852636614813573526 +812516999 +16096632096226295702 +8258313999682325203 +3392492803767998800 +5248105044070440765 +14458654042894259872 +7193983615967363755 +3256722653717473065 +2625039590192389083 +6204347584551147065 +13043583327731475804 +17606420371222383838 +1783548230308088177 +17061252354607695530 +1251886695339144977 +1824196460 +15292270897821261366 +13237708548482859014 +4468411517671121615 +9945828332568584500 +7715048190783211965 +6476519556214639847 +5374001325769374083 +5195701170416411747 +206359760802 +6310847468966794730 +12994192120810321889 +3229413760895292489 +12057002297434580163 +11065533352813154818 +8697674538880541529 +4311837919276592107 +6245583177832864205 +5939508026460614814 +15281207274226793529 +5835546354155200604 +4889753140553204446 +10646033996819341000 +10249982755298109280 +8176552852973565809 +12137496750341515430 +17104122530864112635 +5943456316285525888 +10615766825721739787 +10869660245044513228 +17605145422753907057 +14448078280950376785 +15293063524175387658 +9358905561036638397 +14101065187028455 +14748002060019921744 +10866857471471275324 +15289397293744524153 +18216242462684558257 +7193137540964680327 +5353476837081165954 +7880607085181409193 +3933043905561778671 +5341295408426271102 +1798557717608422949 +9567543198176062317 +7852905094728539092 +1262701579776454130 +42353829286653374 +27356063970625639 +3507502151412766043 +12419459183190354860 +5302483041141809971 +429916180315 +1886062450 +2146416170213456847 +5725098295989573224 +694608387276418508 +13683916910788429376 +7299637425380328278 +137199582214045715 +5779476207078476327 +14987448612269525521 +4187198244195017190 +5352348818760538408 +15288833334023177411 +14661280238232079451 +11027293669015772382 +653191510643978564 +15295896322673747644 +6605958307242400935 +449218114068178576 +529568485530101521 +6928297982874157252 +5249797159684023653 +1368876753925116819 +16526175369603198283 +16257233937394703783 +6991773492734148053 +2396499577215075749 +14476820361327634283 +4288400957833289319 +9547417246534754980 +858962259618577677 +2077762687573577609 +14492490145478546387 +14604797433968672794 +5348521357472384007 +6817300601684650802 +15894267689351801519 +1734238258910621236 +1992881803100621834 +1873618458945457468 +1884114815634656781 +13834461643483256618 +14947084301265235 +8195299660451552676 +13369405230387248048 +4929214082307147459 +16582895391733271216 +4445946672738930502 +10017283030214854490 +5461950758931666010 +1785796048963456780 +2625321585099477375 +15291089473843900996 +2432501673 +5994450090729739580 +15916056822279729538 +692041701893954800 +4645877093499356250 +6206321673575139364 +5382561551670904867 +2785415300443550906 +9870724565398448 +6335415053626858471 +14399056675416470066 +9870724569265095 +11553148876440345945 +879419213017199054 +7298791350377644850 +13079931275337543065 +16044698410491644303 +5565348514507538765 +9416912531774189522 +8484110806029785700 +16846695548644693443 +6152225778888481286 +9870724580864999 +8443717593546505253 +266606364701111241 +11076507902982383016 +17203579194279012966 +15289397302341866931 +9199201286704420017 +16294470476861875833 +9429706753489591226 +481505335619 +17565104825770122800 +6992199499018821790 +14107087945230463513 +11998383052401949392 +5510538194714842518 +6763446783160043749 +10052892219695049614 +1995137899929552119 +10167581917491052340 +5195983173922010263 +30740252203305147 +7033951792287121775 +7299373550608330798 +6275161907604048228 +2366626233766252676 +2341393813528056962 +14144014052517291298 +11192165972973008730 +4736154307999980841 +1873618243986413434 +3069894846806906920 +417019529187 +13518431211333838553 +2191439168619025920 +16915128496853966935 +490341846 +10676818914731366759 +5245848878456440851 +10627282602772420687 +9230455831192415836 +16908076133050363692 +6908100892141829186 +5567604611336458944 +11941637280282645612 +2524458012876026196 +7867619042724816374 +17205017676797984660 +2624757569490859659 +9612643166216529345 +1559163972203862278 +8818864660340162857 +935489368691262401 +5833171446177740158 +15088171056968001670 +2339592758377994078 +6766783649575685488 +8959417923879578104 +17595811302774679095 +10114659545786239044 +13513662561523603817 +6812224336529747754 +9870724634997177 +12261029722881659904 +13701595356116684681 +17330360441647944999 +8856014216854637014 +9106532699279412465 +830963573300811456 +17301205180619763281 +3648384168589088920 +2332294827681716734 +16674492331423000633 +1836789853500172366 +1873618467542808111 +12929409143044388924 +4544359526476831851 +4501213782891776131 +13727196591133318819 +1249061871705597294 +11064574270466649717 +3666742284239584975 +8371550453039263339 +956348125470595355 +8693557137333185596 +1536821022 +29894155706643262 +15287423178926091389 +9870724662064243 +12806893037197864749 +13819044485483185 +16644853971074567175 +927164962728315619 +40567904 +6927451959460626604 +3685782031326924871 +6310847464667500343 +544474626 +985637089627950962 +3760292773055453665 +48301183 +13765165172495046204 +6313949593507285723 +7073611506224294406 +10895941260599718025 +15637617634654492379 +11939363345221103214 +5941764217869306839 +8107633101452898717 +10702965397904831095 +13774681046469393402 +7139605601700086298 +5570706826158678123 +13829667330244826007 +6208295835683457385 +575630498357071667 +11906173445941326484 +5837238443972841560 +15287705195328316536 +5141454999505822688 +32432367816894764 +4301146397395344997 +15289679340240793929 +11630357923075865436 +14101060887730603 +1400104083384967323 +468604842373 +1787770146585996334 +341380979977236299 +15171084126529599456 +71500974 +2624475561685967037 +468608704034 +3413980006980273277 +7141076139664958340 +10779787610829373521 +14996177237533019157 +9870726704756478 +1782984231894142265 +16483453074211932714 +425616873515 +2796071129848161820 +8850604587316815745 +882239471624872276 +2678948519328751808 +6795216411028379862 +14753222603358481570 +16929422191486132233 +12899647259444192625 +6926605884457943176 +12981572156189650426 +4309804531418150139 +27920126869113236 +98567401 +16917706574212716023 +11499096412339246871 +13080769801446120073 +7129204380106650301 +1836789905089316692 +12315494074414994433 +5111714948189538033 +15288551278928353501 +4552271988952737536 +14665063599726706 +15601595588513124033 +15288833308229919787 +3419276518732406722 +1873618519131975753 +5103287355921228351 +2150364412747266419 +14951848861293491234 +16633278779510170217 +3666742335828729557 +13421658540802329954 +114033949 +6812224323633112080 +4101212277907141576 +338635953521256696 +16203767216246236268 +5619444469380687914 +1780164054970804411 +7033105768873591127 +17170441321857040751 +6370301735491101851 +1693561394611823541 +14628605590055882950 +3384591734000399405 +2625039572996465485 +4909899654639405018 +17788079965564445007 +5455705524791627293 +6595009189439296101 +6153353844500162115 +16985627896901098783 +2790209532000288310 +9254124587655903912 +1839046044910049390 +10588235868611613850 +14426789119908536031 +8468495303965872071 +17944163559606279324 +9388513449772452491 +7194265615173681841 +10980977185397687672 +684134210602469501 +6110845085391395652 +15291089426552802267 +10760853579219882047 +17899830361464783058 +1095239124380054116 +14961595670132045391 +152700198 +9946392382570436135 +8875346350189140597 +7329667560521272277 +4227285979208166135 +15287705203925664025 +5462796881224209099 +2455331839440218592 +405777490924748365 +17752869452711811384 +9463915751678816531 +6728054235607036488 +7084442041465400054 +6868482976761262257 +9828008905086670153 +32150304124711193 +8756710315742553877 +1275246496069267492 +9870726293649089 +7032259693870907699 +4635000312440316251 +2361671979984035006 +12109395139072756075 +6233210769351648961 +9308938138266842515 +5716464859759120480 +13516453065301051842 +2889033352725025216 +1733674187412370276 +1873618239687109755 +6981265897931538719 +5196265155932475214 +3391090887056643093 +14691502919679374007 +15293627574177251842 +11848796828945040661 +14383064393346278 +6921374708600412038 +8865366478519732882 +4961015189234130765 +15293345523381724576 +3458547834868094359 +7138759578286555650 +18161909144966815222 +4335731566794789764 +6474545510181177411 +13071884203512374709 +2624757565191571456 +11952920104999665594 +13496035427580276987 +31304293607821890 +6993028404949028168 +5769186692612318710 +17150669604793427760 +14095018724633156452 +7087765782347186670 +18011369817164902630 +1023864266231737249 +31586301411540100 +13548041863730971624 +6684816020734305563 +9942444135736154179 +7299919424586646364 +4562124351240801655 +10590553434274599683 +6231595112432941155 +12534760674296144950 +2673272213187139864 +9677604642131439803 +9870724855395646 +16432418273740273311 +199075413713237296 +6818319265163930923 +28202057290443244 +6925759861044412528 +469378718330468701 +16847961023182303649 +2359415870258498772 +240752990648 +17400385404714175844 +6209987959894391033 +1314978509747543254 +17413758803381671275 +2477370536737730793 +13819040186184254 +2025173575021718026 +10530167729217284356 +8824679608280027599 +9870725374768621 +3005867732945740626 +2561876449470730647 +4387881809899646130 +16580568122706236368 +2573543657410402457 +5994450030541998965 +5782296396901072176 +5835546345556623685 +5137506705381601730 +16041596294548426920 +12455200623997698463 +5991347931794706466 +257099157 +15291371473050234489 +1873622693617879867 +12668812598284860723 +7086919707344503242 +17205553343489521982 +17939922298746853183 +12716605781588708941 +828707480769946813 +17626345367404292157 +12814290618553094236 +6260720179123072342 +692605760494321572 +10758418391935813831 +14561685619439459768 +27356055372063664 +10184983795144471391 +14295133425996407556 +11669272592120221954 +7882137511871530134 +8356442842754085171 +11791459571951084724 +3437833049140979225 +291898817 +9130770121003901542 +29330157292694305 +2938682705183918728 +31022221317129043 +720410650557368595 +6995388108545920353 +15236272502867506473 +6419603433014246071 +2148672314331050038 +2676033356038015177 +17346338118431170708 +7872140323230147589 +9870725928941145 +14665059300437392 +316179063809252074 +1873618514832658439 +811271803 +5251489245202359705 +6796532143492245019 +16590518779153956022 +12133813307910934098 +15777881992531091194 +2521073773052971967 +5249797108093638893 +728157601923733339 +5303047108339516163 +15288833260938812669 +5304739172363936306 +1280298130509359619 +9195226522645969579 +1517290350722572331 +17333875493985531489 +9760038020658707504 +13388567694091514437 +2625039568697173857 +9228351519787133027 +1992881794502051967 +619898924219385180 +2785415334836790991 +14807346631528951298 +10479655241544968947 +1330644708 +3875511721049272372 +14720147863527501902 +14909987968229452179 +14804381690165614868 +16262666567264189170 +9870725959874150 +15287423183224130577 +9305858029919209529 +7192573516757467765 +3413320919524529603 +5782296448490212559 +13327291319013230218 +15289115277341057907 +8710469508138547504 +1892295967772330070 +14964329801459326425 +14582861630346497493 +6095905489813913381 +2202768325092649903 +16258001084132912477 +5565348505908944090 +828707532359089868 +15289397336735116849 +14171682847640259699 +6152225770289909460 +6314795737296486511 +15936300577150743861 +11660037246995817966 +16405464933736933594 +30458205708510474 +5371825572388218591 +7662890525169292981 +18336495713222609321 +15288269309815960134 +7353733363057558479 +15895039144349470742 +18213996499704943431 +16872949640709148343 +2014710471177341899 +4709504560342973746 +14101043691806712 +10585391818487186258 +17445466366832677974 +13901606567053696657 +5594649039492114637 +7563927647550267439 +17467452414371053872 +2465915698785701190 +5991347875906260827 +15087607024163431325 +12057566343137158089 +3296928269378724535 +6387412631503773230 +7475080111803101071 +3581851302813388047 +30740222110749634 +3478881230198937912 +18008106256778995884 +5812207426459088224 +7146883279137157521 +3458829954448650838 +1580452225838688050 +2374936041605499781 +14383060094054086 +878573172407759501 +18328169852550257844 +6209141871995064664 +6249688395151849654 +6478049101493319717 +17943317531894614296 +2624757560892278523 +14287232994676273248 +8879891212090103272 +12919891954352345651 +933515215180222865 +16873513716505451304 +9870726529513190 +5882723712222452124 +13782056800287026619 +2930117073648439395 +5940179888249719023 +10166171766691992371 +8552319687958474590 +5950730294649429193 +4201030116675960225 +1873618501936023743 +11667100445717180521 +939705269658073240 +5147552749503070492 +11876914045001077562 +14753586224037892477 +4025888122526784843 +11821179236913728135 +1873618458944214139 +3881727131120384254 +13870893533125483307 +33278369735209813 +11303826973212482494 +9145669343139360815 +4657115645993176735 +10131837242266041235 +5257405381052016683 +236453697748 +1235713816549159072 +5878764450569410130 +6264671913379849992 +13819035886896552 +13086907642609295746 +9037837838336599857 +13759961812146328078 +13124256980473288556 +15292781546465607967 +16165083386072685680 +14889789230389603081 +5197393273133271382 +5195701136024563203 +17571002206077261560 +2765528462252333060 +9870724579619814 +12910411188229654067 +9870727083685665 +2713838510145033166 +14347147217487157218 +15291371468750929876 +15126544789913025819 +6671286404421658822 +13726350550523846907 +14364395806088712972 +16474962329897420133 +8181842680775250325 +492722805205379245 +13450515573114622647 +15663892257852040880 +11865746456183650316 +2787671440263032616 +26404778160383749 +15287987246123786766 +4863651628558067051 +11855470331474557209 +11026052076657011458 +16739631691611004482 +2308641272449142379 +17798486060942889832 +8093487961642642919 +9870725110592916 +933515266769380952 +5995296152834555480 +27638058876476474 +18149915482419457100 +1693170535549249299 +16949394141343718932 +492963299 +12642724448455714117 +5993604067316152347 +17790217324792007487 +2677161709691876426 +5631282936789348178 +5226968278523865413 +9870724626009211 +9870725126059423 +5352348805862657010 +103743323483153175 +5909703694071917200 +4318600137717194285 +5998667686485710062 +7560088764967897411 +9870725133792682 +7136672006190289820 +9870724633733205 +1873618510533380726 +3191089256477966812 +15287141235606884488 +6926887935253414042 +689908916968898121 +10028063337020333091 +6384132939295240816 +2012415874 +5301355009923306885 +9870726137738905 +6231189996575467630 +5511666307615173088 +12256322 +10690133606679853673 +456898937282451804 +19989584 +5831598146013367966 +16393361744449118926 +2972474798403511275 +2625039564397883626 +17369559103529756422 +15061665846919767797 +15412641890497600971 +3665614278817033643 +399917131913710813 +829835524886452757 +11866143662182904596 +7088047781553504756 +29894155705407730 +9870724660819040 +1535575835 +1839046036311458864 +10323710994698870536 +10770155859627544609 +4828955760075289804 +539362809 +3255501078082439965 +2043348873 +4625053112113644914 +2531585379680415283 +11558293645137102240 +2864533464314636199 +1413046558836537363 +9870724672418960 +12067395189613270758 +4154626294015092732 +547096099 +11031722156509443746 +9870724676285589 +17198559071664221472 +16294361197781730121 +8006157009142945688 +1214077050265015166 +15293063541372703903 +10595566391331073313 +15287987297712958400 +4253979236606568459 +2801821100446206077 +2252206275958949583 +17163055132003888867 +6926041860250730614 +62522508 +8478393692625507358 +17871042561419600257 +5538416922717151483 +5623674702523474570 +16881311723980130406 +1629148490900913649 +2924009083864430585 +70255772 +14101039392507297 +15690867497329056415 +27638110465635023 +14725557237865990305 +27356059670107594 +447113479610 +2624475540190747573 +2578188220 +12038614413742717929 +1197402941616759961 +11508394745026462542 +5140044900295909142 +5195983139530168996 +2683752149432866185 +2576669006339066356 +16355715749192357360 +4791893803070135746 +9870724714951834 +13679477551202845986 +70272372060533836 +3008657914871621524 +17450775173671448384 +31022225615166084 +12665415616966167035 +3880024017885400934 +16431854262429705004 +18240825841224262688 +9870724722685115 +18220457951349467991 +5825995788685746152 +17083693200934636573 +295416529576544174 +1873618540628561788 +15524263743247823118 +17423767200209003339 +9870724726551772 +9310258592310321208 +10885643415219871341 +105055501 +1836789883594097937 +15615144977144833402 +5887800003173224527 +17624265186421583336 +6476237595699525627 +108922134 +5303047134135413043 +15463390673087044897 +5728764487730474714 +1873618497636737782 +7193701590966469279 +3069899191281862707 +15689807388408882954 +15292499547258034526 +12910129232013914850 +5354604945682228616 +31586271318975276 +1850077800486021306 +829835576475611597 +9487740897869451461 +514614295391065500 +1133620930477296040 +8774372107664186810 +15287141179718456812 +7305705821919474004 +11063795143821696055 +11572584753044660391 +5277294692147017863 +1464040363373258988 +5516892818901442738 +8605926113043622563 +16092233475575730004 +1335101624596783448 +232154404799 +15291089448049389442 +1494902044662903865 +2140014479 +5300810506424882950 +15289397384024952248 +10455832258799277214 +3554388240579365604 +8054758354584014102 +14036340911856224857 +1977664097636934454 +1392309479848110553 +6980701873724326157 +18413391992287461460 +11852154363429939705 +4736709352635188876 +17574115452914131490 +16122823596835413120 +606084411966641295 +3602002399267070945 +13959261993595973998 +15289397319539177167 +10819616670215050146 +3952626688514284387 +14223270091406602543 +15509304393542084269 +6288511205539515484 +163054944 +498702634345 +10372956108256260623 +6843808561223064596 +10161366533214591594 +32150304123478856 +2876336716665927193 +6154199898006445171 +17665894460891927569 +7192855515963785851 +1519546451849530017 +11134401824785326744 +9870724800017663 +9006484411264815021 +11231170305611929721 +14417620468028829004 +455710817253 +2509417099812674010 +12237172509275332086 +878291168902069940 +4454707759729103488 +2400461242866947807 +6766227450202051510 +8838364843547438876 +1518418403436423959 +9179881776659178871 +13522668423781757731 +30740204914804777 +9870724815484169 +15528579576819886043 +3876639846847438746 +17953567922355440079 +7299355400379433802 +2150057907012581692 +12239544579276216338 +16092197751302724315 +8260985405216398775 +9407593762612399734 +9319360668615725594 +14383042898124456 +15292217517959173364 +7007386298569992501 +2624475815336285831 +7429691915925399710 +12319211773115589165 +3428442689044175916 +1665256071440720752 +8912304241117899235 +16451702362173230596 +2624757543696362373 +5645276744311121821 +13513350828982410979 +15292217474967358771 +4097538467887861991 +16896582888638319014 +8110193322947579393 +2213480342 +11130039777759856948 +1873618484740101283 +933797257378343118 +5458848655886519659 +12424056059810437502 +9870728842868535 +2359415913249064824 +642440258133758951 +5354604932785579577 +15292499534361413915 +6368332585585895605 +2625321610894117705 +6449657694314449684 +2979056014524681391 +6526103308831309253 +1359796670367479794 +7086355683137290680 +10935743012918995350 +2625039560098590218 +1873618441748287822 +10754470179494764950 +3466724790784914158 +5998595681496088853 +12834602285347991495 +12864601799299958873 +7587858958072626402 +236520837 +12057002331826555163 +6206453508333192330 +4133714571339323069 +7405633737241555482 +9919647247048991075 +12302836948232064331 +15289397371128335469 +7298509325376750374 +9870726869776137 +15012525532018786848 +587991170931584251 +11439579601193476197 +13819018690967594 +7617894369384798679 +9870725377390085 +9870725381256735 +7247515529437381394 +13232126711630361053 +11190191896847018610 +33560368941526562 +9870725881296455 +12086191970609810594 +2924671999076290692 +830117536989393522 +6155327912028943231 +4098372813060259460 +507299956998 +15274732230144258721 +9870725889029712 +9207277965930683284 +16842894282723975689 +8648103698601817662 +1264386645717171661 +9183456023958280318 +7409103551699377191 +1582324801066249259 +9729444427091284247 +5516046795487905948 +14101035093215815 +63648239916574030 +34124436139296544 +7401639701246654385 +10371546039138927250 +2756486165604344732 +5740436588716955471 +8387635059763999363 +7354015413853029345 +442814171263 +3945625297867718489 +14434787001301874274 +9787880004680691009 +27638084672359834 +282920362 +5245848904251096062 +6621124925339027668 +5521344724254673202 +5114271650928223578 +11719741672025769587 +15267897136105021250 +18412545968873930812 +1786650415036508112 +14258849822134191621 +16042442348054720176 +1693052306968941934 +4536663217425567690 +9162578985868610340 +15291935475760970007 +2473460300997028880 +1410790466305671479 +1308716931166202461 +11785584444493540734 +2360543918673038901 +1873618536329264818 +12634045215106553383 +14318753429552454534 +17324399805683342247 +4035408920763064011 +13040476687605833019 +806159978 +9161450958949454380 +7192009492550255203 +1310066385 +810026609 +9341762833708175024 +1786932431438755519 +924633388858940078 +4645667113710455143 +2009934836734319817 +7141015696610886223 +8052459688593610019 +1317799640 +16221687395840840065 +15289115363323433032 +1939216669978012484 +15293909556187648615 +2325612446 +12588077379430726451 +515902454655312203 +168228931236688705 +15229105002994745 +10246365349637465542 +5356297014005860645 +13671275438566876556 +7353169338850345917 +15586729198849104402 +13121288528131740341 +1334994379287501033 +10011340650318805771 +1652992377389194371 +3345494224882645227 +5992475915723496262 +864091049375971250 +15236920398243178091 +12309820192572778517 +2331071794039255775 +9218653897916231421 +7322075253637915788 +30458248699055082 +6208295861478106434 +2436095436955086691 +8615963981148934859 +7130633574103784699 +17572367682666375953 +8443742313901281382 +6639116847414063525 +1251040684823625012 +15292781494875213105 +34124487728453958 +494403323917 +10735236183147687394 +15716164858010478655 +8981821469823954948 +15293063524176769153 +5833854247140337680 +2624193536685076689 +5046514566388722557 +15522876928134297044 +451411530555 +9370260837314873981 +5662352865975418621 +4648156742090301497 +17305164455170809900 +4677633221616102584 +17426894917853857260 +29048106498594309 +5353476794090724200 +15291935527350136281 +14851060135220744043 +13730298810256203098 +15293345540579014097 +5725098295990964473 +1149886558087294156 +5995296144235959007 +18141240613009368032 +4462642824626204877 +5945568394671970936 +15655911281441920315 +7529998377695251264 +17279716321830442331 +13889766583933359951 +7983693352627148985 +6311975560371918422 +7246669506023850746 +6946528258783666584 +10544854594598021661 +38835486525713703 +28202160467495034 +2879479979997991910 +15309116058145019156 +1733956221011912517 +9715965029733981721 +12344223977079859901 +1894834050909760459 +2624757539397069945 +10671334559102736379 +10492168756132065804 +7379797596766021629 +6101796028651622458 +13688388564074785205 +33278412725751566 +4964620524141965761 +16871821557901520137 +13561711261508395249 +7699639293511154656 +14268731406748904043 +17664709615786149782 +27920045186176320 +6458752725082787462 +18061764950907439980 +2964221686879118758 +1734238237414152607 +9870725055214937 +17596398020674599208 +13521137851733521706 +10863790172048665128 +4922099011032716218 +17718289034605707868 +15291089452347441907 +7582142304298877156 +9008581883226631916 +16084518517580635924 +9870724566774715 +214958475870 +2442648426814389978 +9870724570613938 +15292781546464355633 +6368891619085264892 +11286425114966501884 +4081144042642297890 +3018298531592738568 +13819014391673448 +12074216556992401064 +1736212317840828377 +17490928898013879571 +9870724574486073 +15450587005391541998 +1895398083714232958 +18281048796564304054 +16991694984925308910 +10594427319500606660 +2361672048770511375 +11484370901403579835 +8616321467542671897 +1519546477645420774 +3823394587252239744 +8484110763039333774 +2450713874868422747 +13759084790651886989 +32432337723072574 +5353476845679891370 +10048533331875292118 +13524078527292331011 +3343621948189119279 +5726226331507445721 +1972504441 +7352323315436815269 +32150286927536159 +15288269275424105306 +15950055742641344798 +931541143353501982 +438511029861 +13728324673941083869 +12931665209779500258 +5799336857792309164 +438514889525 +5542674878521169264 +2690034417607140761 +6980983872930644243 +9870726605600502 +828707433481448840 +789016306621181332 +6040763102367518403 +9870725109347722 +14835653469557497889 +27356029577543934 +15290243377344762649 +491718109 +11025111609202511507 +14762938909627149216 +1491797775 +5301072972025847726 +11659535399388778931 +5715261395240313996 +1944417820723599894 +5996988225456246827 +6908465288063237256 +14194830928449711283 +9232147873720376975 +14037531654033141067 +3277816 +12474564753552837893 +1873618532029975812 +17956211300100959057 +15672251876763839146 +7087483757346292194 +15292217500763231986 +7144473 +5944020284604433428 +6151097674585612835 +27920096775320493 +7934098198614847751 +11011122 +10905737396268840327 +1734238289003303764 +1466306005709776179 +29894241687786642 +1873618489038146059 +1735648302232194010 +6879811782694229901 +15292217457771425506 +7150833857266128047 +7758150819716277022 +14646126953278625989 +11835120105125078335 +2700387955009467842 +5246977012853377166 +14880882624768252691 +5566476498435058429 +1709856218598091377 +2625321593698193157 +13879970276934899553 +12428612685635996213 +12285248091340433918 +538117612 +1349355141338382238 +6105318150360735955 +6206603763061895704 +3422020469081202614 +1804226529458282590 +6153353814406350551 +6046302865367253577 +9870724667307141 +6813843502384089854 +41944167 +16756399206176671948 +9078366157069559369 +15479439786599726367 +545850900 +2573543683205056127 +45810809 +14855968419300924964 +5512098552952862938 +14089643702110921694 +8106204001714653075 +14504740908775986553 +11632078233413882615 +1752265183322588675 +32432389312220191 +9231301798717702057 +7086637682343608766 +10927271592001355473 +8926052536804313573 +5461104757013484795 +7316232528953942141 +2202768277804173728 +6700459465055540951 +32432346320428533 +5833854242841062609 +13188782220665628659 +16367593172210445051 +14047179318527421464 +860891621129471740 +72877246 +17011875630065272849 +12334008205326238248 +16854238106389715678 +27356081166682460 +16118290484606479821 +11310518129084808288 +7666312252081785862 +576783943 +2576943035 +32714405714473560 +8344857136586044598 +17522009527301586396 +5075826107042504595 +103743396568909190 +1584596783 +1559288237147314144 +12306053729923981244 +425618269810 +7973733311103651715 +11266915032714841381 +15291935523050828808 +4560073991146462524 +1854737581648122501 +2820562770972775791 +1894834111096254185 +2994969191263072952 +11391362031143292868 +8779011389703464547 +9870724717573297 +17787173786700891536 +92210388 +15474006399145701227 +7978466852158784181 +1099656237843508478 +9142309226578518163 +258168278732916639 +1569830315893923795 +5679036729566693742 +9870724725306577 +14423493287242705679 +27638024484621587 +103810303 +15291935458565046704 +12749642744079140296 +16097636049106512371 +15290525423842192454 +14559118948839155452 +9386257309953100378 +4094363937787234418 +12337048699809911800 +5838366535377967596 +3675469967329161038 +5249797112394287359 +18412827968080248898 +2625039594491812043 +31586271317747122 +6980137849517113595 +28202091682427662 +1873618476141514351 +6103488045384950482 +5123966563938617587 +7078617526390248953 +16089088430329106996 +10667292758003117172 +17986050518452754583 +1652810939277511173 +11226550812567014962 +17542466454213576008 +8762066054130180485 +2474797953316293567 +2857298615696366876 +7192291491756573289 +15291089448048139952 +17872958533288026216 +3189961225259474412 +17759993951221608526 +210659182865 +5922965043981996378 +30176172109080981 +17859691850682798065 +5467243183464065003 +7141297695817204309 +5895235296822633132 +2207492698791414515 +6261263712049718344 +13819010092377672 +5991347944692735816 +5565348488711792064 +154076468 +17211249521736486628 +11131448449823092959 +6471725260172232751 +9113587964965435465 +15287987284815069000 +17714387943175770698 +1839045958927788564 +3019470435717959303 +6098975804437177155 +161809747 +2465915724580334207 +5514354692772414564 +3750722974927104593 +7604467390465458506 +30458188511330903 +7221367551042334649 +14951499805157828373 +5888796242624391644 +9286174887626690209 +6313103634580922061 +669582942 +7247797580232852260 +6979291774514430167 +109394696450435819 +5299098887299863862 +11812496720744823126 +4902017359603971852 +3459957934078107585 +2125501255296174806 +15801863620037341370 +15945141101920203411 +14707193670476121784 +2092381607087192047 +15472423880903045333 +15595660770879564469 +9442023925637995351 +14261951985367190598 +891093980794018443 +1232886696290118948 +5995296127040037226 +15293345523383079392 +274650075244209350 +27638033081969105 +17701533366717403242 +7085791658930078118 +6151097713278144283 +11945415094352875577 +1413892608044715986 +5942328186188204314 +14657154954176573724 +8290313614069079088 +1873618527730682522 +5687300831469712579 +5142018967824718784 +7034797862990709138 +1733956203815979279 +882667241112695255 +11397440162344026293 +16134779739252154045 +7717191090463384325 +1712195401 +15287141209812378861 +9870724845171992 +11168985090525897274 +3341216939837384542 +10069199474594232517 +1464040393467187519 +1873618463244889855 +10986956829741957503 +15291089499637309900 +9716360990393457418 +7246951505230168832 +12498251711624253288 +5887757391910480661 +4972010266952473681 +17329280681847629018 +5354604911290374028 +16904086759706422553 +12826485628248399800 +3529735398834324639 +15290807375757460524 +6893126722435427391 +15291089478143340572 +2625321589398900026 +15528338683745415999 +16736394471391371587 +1413046597527819913 +10375505322288568778 +5245789596497154025 +16644853988270629041 +2073238781901421863 +5698698140605239993 +9870726364624590 +9242938543921773221 +1996539682273447487 +17461812064821201162 +9870725368411602 +8389357128633363440 +9870725872318013 +16849904662683135252 +7820815413033635963 +11434534163980961390 +15289397349633104804 +9870725376144889 +4797028137500755574 +1466296481697586908 +9870725380011542 +9435254525858226963 +6976151595822696769 +1839045967525140675 +5247593352907983549 +17792598838709987800 +9204802053286079351 +16275197394076902239 +485804755328 +14959692054351321604 +4982278684596389601 +2117937786109642800 +6242575477995421183 +3401748230520915018 +270075293 +1521238502976079497 +17362157216814941663 +15290243424634625930 +17561285692512691426 +14084953958763292689 +13022269349903430354 +2152780467316002119 +6470597250448957923 +1873618248285832923 +421318969579 +11995964232607543157 +11225812687234944817 +7140451672403673661 +285541810 +12482638774053915635 +9101505676301396865 +18114324094698606880 +15468982935875297884 +10838626363614649506 +14425661002709010691 +32714336929385102 +6366071455058495494 +14665080795768924 +100077118846932378 +7352605314643133355 +596258693554519217 +8206203200242409449 +16096830904991032892 +472638067631000521 +5706434729109436898 +17538313257810275452 +85629353100796502 +11823326492944717030 +1873618514834033446 +12477914391756487147 +15312729249366948643 +6814198485741605520 +17302344291142867131 +9679119274662437943 +6196571971008288490 +816514724 +4256306398286140509 +1873618471842225301 +14268731398150296806 +883931475460253059 +8389902452401773197 +2625039590192520012 +12485701483292660037 +15290525376551067039 +16847032589680319684 +5938217001568447763 +3744441722886367689 +4134785464241572551 +1412764525237134704 +1166485804266627067 +8790289859117399901 +17415379285319951917 +7397691506001466876 +12754891687179066344 +1660929119291724675 +1736212352234058130 +15289115277342422942 +5512098578748741127 +206359894057 +12676331488113080437 +5565348527404295833 +11393575257692859842 +5354604855401919940 +17627766198566468468 +5246976952665638906 +14964329801460703780 +17228618169633164287 +7401639795826370903 +1893705980998731770 +9870725972850287 +2573543666009115561 +11347748985235132806 +6045857651847229751 +4759617222937168423 +15293063567167344022 +6379095519559183492 +8787523006906259040 +5885261881343424566 +17946137657229000160 +15855427852318034545 +7534510998261995807 +8758866611300162556 +12495122962811273568 +14101065187158592 +3417860786310091729 +7126669240441462380 +5290618853138060221 +7246105481816638184 +15288269309817349847 +10973761725452068254 +1890603817765653188 +6811649306842328733 +472908128658 +15287987259021805854 +16874641756321431568 +11761069964220255806 +14107087915135405575 +12018998408246796123 +2278900652359826597 +16213479450562941190 +330734248165912976 +5569296709751606107 +6361518319333476699 +16860280519949439780 +11340219348171432044 +3205194910044020067 +5996988259849478461 +8471050277131805471 +14232129873619152030 +5461909885649686802 +11973438391925229095 +6106446224568557671 +5779476207078611853 +16595492902878933280 +2061656954403241824 +15286031891551824515 +9939529031510677020 +2669883121337375887 +4472979847181972679 +6318825272108541567 +5527589281160644719 +15292217492164646958 +1873618523431390398 +1732546186287793472 +16075433655998600 +15291935441369124232 +6760908700021509907 +5884415806340734608 +2786543318764299002 +814173546822711631 +2792885553806660007 +31304246318085131 +9538952392392065481 +7245259406813954756 +7235144330384651008 +14328734114439776921 +11317855090737897838 +666275479867510247 +2889597432645572537 +7374139833057107726 +3284721633267422029 +1873618458945591929 +2766571059291958499 +987047180239391267 +28202074486476782 +2209547651894698853 +17515158695334393121 +2625321585099608641 +17092164746525943420 +15294191602683825132 +3572810933135300946 +1149335053458620339 +858842159115357342 +13049217287768076968 +9870724565529522 +8343160331044937787 +11326450378254266262 +9870724569369025 +8738473378077812491 +1996547999138325151 +17785259857426331799 +28484090888740603 +6980419848723431681 +2603940956036555177 +18413109967286566984 +3445610551068333388 +13356775724777611130 +2300411992884265446 +13153439128651917870 +5672976374252114900 +12860589340109840726 +7462267818243927454 +8816997369364548705 +9944700249761144532 +39608547845366551 +1522648576391462286 +15946107495806999188 +15087567025575846897 +28766150282774485 +5459935835318194707 +30740295195242249 +10161084508213693412 +13871671035276979150 +4844858397045640927 +12984363592243504220 +28766107290967280 +6640705649441402749 +4081176587746819218 +1752579563187358542 +7404505641536090231 +6877319166685483008 +5299098870103938457 +5651329605159949724 +3056459253786565433 +9870724608062474 +9870726108182164 +16280933446315284463 +1873618243986541593 +5832726185829359483 +6478233478710767874 +9870725111969176 +417019667946 +5302200977449761452 +6427815650386462648 +15326505426505638475 +34406418148520514 +15292217543753806739 +12864153007022948067 +3524535802145097729 +8043267345977000953 +9657336766457398145 +10282481182444173694 +171951370383017781 +2624757569490993099 +1759667877374684313 +12354587136294741989 +13785750462992773624 +7513570824695916474 +3611730387908645033 +16478367629248707297 +2521421795860690230 +1444869123744602828 +1038041006273946663 +14193702923027171508 +15291935449966463714 +9870724635128892 +12279042692635978030 +4508571147808351612 +5237921233376408092 +15287141235608262161 +2312934349658805482 +2521520202677368423 +15288833278134851439 +6365225483234117809 +2625039585893227780 +1873618467542931168 +15287141192616471987 +8211561456005114165 +7086073658136396204 +13832941318105216649 +2231273845409340981 +5778348175861371439 +6474898267999972686 +9475221718899890327 +12075320830535818985 +9870724654462032 +9941138681622841457 +3052033735649816500 +12353164505103212873 +10808445661528282103 +10162212535131642859 +1684594469535164594 +8759785668822382479 +11617490488535422280 +16053975465678550429 +9870724662195317 +14820511377841526842 +2272905061487348557 +11957793163459912868 +15294191589787184118 +6384455843947358516 +9182575157417754064 +14242239340761868873 +6364097413323166429 +544605700 +13944990587222231306 +1197790774859344318 +12318365723907537132 +48432257 +548472359 +17088205536462053108 +12904477846150130700 +1892295941976580685 +10375505262100812940 +17177069327928412346 +30458222904546691 +16008494395543149840 +14567707826358409809 +3235754288507214183 +15287705195328455967 +5353476875773829300 +6062336577242804713 +3655854534109178565 +5301293456086542731 +3641178483243895977 +460175421415637962 +14101060887864224 +7921261106565894271 +34124461933947079 +27356081165453907 +468608817139 +71632048 +11184417800625870612 +11041534506523258934 +2624475561686101966 +27638110467003237 +8565090366461657835 +9870725200901572 +11366435697098968749 +18287350848540465235 +11111966300070241046 +11359026223535905327 +4106370589627000964 +16208689444235859017 +15287987211730703207 +425617008907 +5995296161433274847 +15992457721395308820 +5229764572094663268 +13513612221106364100 +14580442361856795699 +5280077592109786014 +18328169869746326762 +18412263943873036336 +6979573825309901033 +332708388779069611 +10194769012791333899 +90965194 +17499978031167062760 +5640826309532259344 +2524806027085154404 +4451323549999958244 +7036226056541180483 +14184058584951496394 +9870724716328099 +14813064176842656648 +2430137667171539952 +11914033385203066401 +957876187625241465 +9870724724061380 +98698475 +5671848300043055139 +17168749270732066398 +1589413738607241450 +9887461037680036721 +32714319733476878 +14665063599860607 +15290243342952898385 +7572519555016300986 +8025114494734850949 +1873618519132083412 +29612147901883683 +5304739198157338018 +5251489249501790730 +7140733671609991747 +15102633365988183566 +1773948653497178099 +2531400574590274774 +189362329485271519 +6156738067127431218 +5778348184458693257 +5675796525382196079 +9870726751287040 +5619444426388998897 +14947080002100147 +1873618454646297584 +15292499504267606902 +7352887313849451441 +1840738130428580014 +1517290312030181118 +1990332636357069920 +8877665288439154197 +17427971148849834999 +10375505313689989643 +17415379268124031727 +18411417868870352908 +10370888492408598939 +15292781563661658848 +6012130086348592455 +1466296516090809800 +829835490493353990 +9206049446989406216 +5242386906302790144 +1645217598 +9960543895307947288 +12210604017650118327 +1649084226 +5476138965309071257 +7509407467459276968 +5246976935469729295 +152831271 +6927733954367848625 +17012295529387284218 +16938953305224076172 +17079203553796643865 +2676597651091633656 +788505299329820367 +6924604854981828216 +2956623890106505594 +9573472878263029863 +15154021028157939886 +2784507613221973587 +9125677675348652952 +9612968043659291466 +7571980732899141676 +30740290895950490 +17836201875985084227 +5618598394378149798 +9870724793660663 +1729888224461087660 +826733327260271533 +13614115152358567967 +4644563108626631860 +31022298699685283 +12984915175632349769 +2528765232849774542 +10909696653621337881 +9838723920135090334 +7034233838783496576 +17600054209644940996 +13940478354871817979 +2120969840294698277 +17389050617099280902 +11115547993979558979 +11490321501587393606 +17960694635470200779 +634354464864934905 +5268548016692269216 +1873618239687248757 +1744698334901447597 +17938512212434969989 +9870726809286406 +6195844719251704028 +7409863940290584732 +15288269249629614626 +7063168837434757206 +7609869710022485343 +3598538847361701372 +1778742962436323665 +1042835259324655526 +14383064393476981 +7246387481022956270 +15812659156985665386 +6154199812024190128 +6995794499111752118 +5570988786672605661 +7601906463523227804 +2624757565191704893 +15290243351550253842 +371494508100541543 +1571386258306001653 +6204347640438466222 +6134861704878050902 +11247389295286557642 +1597536180772867559 +4211148736 +10266892308934193038 +1873618506235449771 +27920070980812896 +6100103895843562732 +15292499555856751364 +2525663005130906820 +13556553195569833982 +31304250616125272 +15665247498475619813 +14735012445162909253 +6862797640822044165 +12315980817073584449 +2251878150159347001 +322394392196172167 +1575334505139088189 +15287141188317174206 +1873618463243636886 +3042837083625583354 +5831598120217617780 +12050419095235862496 +5893869020148209375 +85348920764998737 +4350138122305689139 +5574057256786147168 +6155045917122044124 +14979133050723903824 +7878068928958516913 +7033387763780813148 +15291089478142094560 +240753121622 +15292499491370963418 +2454407151718767696 +9870724859393349 +12663073838025023572 +2940293779302127299 +17461812086317785375 +1329912745018483082 +5780604324278252199 +15574411472783241494 +13819040186320582 +5910722419484012893 +932669187468773967 +5512098570150166824 +4580983970120684227 +9193446454560895713 +16263230647358740402 +9549391339858113880 +10647665750038631455 +16850361761879758815 +763921374562563822 +12500215995776187682 +7958545865408519721 +14016191709940903693 +7403331881344705248 +5623392638831498832 +15292781507773218716 +9870725382633000 +16895966821381253084 +32432363517723351 +8618954206934994121 +11704293171416551159 +2842331449438711079 +14101056588559804 +10046052043019407672 +13411799180233562697 +6570315963541228504 +15234578649091755770 +7352041290435920793 +1812372989648453878 +2834824896675911520 +18406306752988607003 +15288269301218746919 +3919367422828027262 +1646408675199704158 +7396235467053295956 +2068681175348632862 +7451468154385610910 +6098975770045321493 +2616099190761919966 +7003516464553397827 +8247724729662717470 +14396270988023964891 +9091855447660378019 +1786642115367688572 +5570988838261772069 +1177436725893355973 +9900655957280045533 +7755952950315992612 +7301047494496551813 +15290243403139410142 +5299098852908025908 +11303263004895090449 +862062044061248054 +5725098287391126389 +5215705044857741538 +10158546386383947418 +2528053666090405918 +1268434292447138862 +8985097601317026970 +3932922014897081873 +6770804071406897959 +882239424333887569 +17255487642565169948 +6022138487475217635 +2676033356038146286 +12433992920687982907 +18213474575805144868 +9678732647555539443 +11116958009328487031 +14665059300565253 +1873618514832798289 +7139041573193777671 +15287141239906325369 +3274656301082041437 +13050400918396093469 +6156456003434056276 +1997676051852188034 +12202104656845224509 +17284393169295325536 +5831598171806770775 +525102955160282867 +811402876 +13223925594885344547 +5344573059049000655 +18197008871679081141 +148437482586656385 +1815349093 +2026931258905421901 +5197111291121790623 +5461950793325030374 +33278382628103933 +1788936369720669986 +6153071780806930421 +2935217514147240819 +4211410882021367479 +1732546113203422399 +15287141175420537703 +7241607911958396677 +2625039568697304779 +1991460658976924124 +1413046627621754168 +1873618450347021714 +9451389795433145006 +14549447925366219408 +12823383486510756458 +7300201419493868385 +12461042340477995674 +1334642405 +15291089465245448460 +1573642406724063624 +6101795934072038528 +4712201260475827863 +5909364179964070870 +8910270495612610069 +28484125281972583 +10363781489462487194 +1075386992618250603 +14594451561142500361 +14426789115609368795 +15289115277341179622 +12548813974946268741 +311384720475768637 +4242482915514854606 +11918973787416958851 +17952462371364277838 +15530925085275077983 +7722831397021554453 +13623094662526816431 +12346762094610499966 +8579829263013853000 +13762033578708900727 +16778196032097769531 +9353507151806868026 +16874641799311992001 +7032232753418799986 +1691470668188045402 +29048192479739551 +14071726079227083142 +10399694839059584342 +5514354709969718042 +15756227035312516048 +14506997065792843184 +11587671796682473405 +16860152654782291469 +32432350621091638 +3598785155088851613 +1093546991570669828 +9407029712610683446 +12928040195430043376 +14957326798095998295 +1523025257700082254 +1222848853591549727 +1890603796270432707 +2624475544490176128 +220421203678071266 +3344902947084985277 +7646567114842646426 +30740222110862041 +931373894990323435 +11015150991840857405 +15290243390242757638 +8631928107028402725 +14383060094184610 +5456229983590048114 +8270789183731736608 +5697191359858611896 +3068049055497457962 +8243595443602666455 +6097847760322044081 +627510695322860368 +17391487012823308648 +9870726025737848 +14701924893678792844 +16373296403455220005 +2624757560892416160 +11239731202191799470 +9386257335747744094 +1773948700787039172 +5352348797265459821 +15290807457440547210 +6978558302127657853 +6046853964382680034 +1873618501936159937 +28202117477054511 +5127215760155099457 +13560019145894997601 +1446716679021544035 +1785796091954146032 +2130819859438201523 +9970931136116773941 +67325673392465857 +1873618458944348554 +1170593922858360044 +15290807392954750099 +1399021262405058418 +7248943748782494952 +16922913474155528906 +2485278019430737689 +5357989065131175691 +13710077672074467901 +4783114155788935810 +1839046049208211336 +236453828610 +5972865477549437977 +8703842252661804783 +8566292374548012343 +1490657475637829693 +2147544240122112902 +10284111848541070551 +4500631810714048463 +1573132458448416737 +13819035887027735 +5947788564576686003 +13514226555637166707 +4844422007895958079 +17174064760732601037 +10518075094313558067 +7937011839436931380 +103179363763096537 +15292781503473930801 +13310078522289493878 +1012105306262626628 +12912385333142249265 +15291371468751062430 +251835139282261142 +16108156291045551289 +16699857309624907392 +942630908539258060 +7271679108734001647 +5726226353002797290 +31022324495576351 +4813834798409870731 +4123042238911429527 +2623629766128179178 +7931231880446353972 +7560543476512403623 +4282228004784846714 +4469799173763959744 +17618730671757286451 +11288259060278173866 +15882855708139790643 +15291371425759260084 +16880857144897332308 +9870725102990705 +7094707802169238644 +1945545869138093987 +2008078727273649770 +1201738991599901560 +14117387478315321332 +1870891592944916094 +13520119278536112874 +9870726106936978 +5458525736108306277 +5299098848608718161 +14258849839330236135 +3956156455528651599 +2840320970871167964 +6169020295152280790 +5302200977448514929 +17416014895911416360 +11910071071167368658 +880547325917675901 +16804082559294726339 +661063542008268189 +15748598726515506392 +493094373 +2880374771936352485 +17661680509823577300 +10508045930744260426 +3008657884776565129 +9870725126190497 +2676033351738853784 +5560110984102091227 +9870724626150438 +5704579467834502367 +18155411078871985246 +7034515837989814662 +5665932420161028925 +31586327207571982 +3055331162380385294 +9870724633877877 +4745234755522215943 +16465137950992454481 +9870725133923756 +8818864638845061266 +6783922856078625185 +12387396 +6013924586872912939 +5463642874544130489 +29612139303277223 +1873618489039543602 +16254028 +15290525393748375719 +5992475997405322041 +2689242209864936909 +13521137881826220357 +5511666264623508200 +12884708026702236548 +1873618446047732662 +2625039564398013560 +10756611444464046663 +9870724653216838 +12046987579149665119 +6594097420567776979 +6527795407247642752 +1535706908 +12644080653953537224 +12754891704376386623 +9870724660950114 +15287423178924958528 +15269831728623802141 +5638800197448385328 +14825005661988024426 +6045857690538494822 +10669233925293497603 +15289397375427752122 +16755866031951057224 +9870726168802982 +15092941910517687522 +12861554725722085221 +11587962219910351911 +1197790774858099525 +47187070 +1241710799806741014 +5250643208892326002 +18411699919665823774 +30458222903318393 +16014863264193848163 +6616724738934186906 +14527608124574942750 +2520234166831694255 +5197393238738929797 +14220804979016014522 +13449826880135711207 +15544102942134399367 +62653582 +5517738936896065804 +2376064107217304636 +70386846 +10644085317650823478 +2686936121665676716 +14101039392643841 +15286820861249874481 +15289961399633729280 +2686125779534499609 +32432303329987080 +29048123694647379 +16874641730526913199 +7454507809487085125 +5832726215923284885 +2624475540190883951 +11127907887198400725 +7140169647402779185 +4970491751558114798 +1258091056198585822 +18279521768686566429 +13679477551202987665 +32714362724050857 +6902531945983732363 +17494852654111017359 +5168067017089116414 +12902749409780724524 +1945545813249640676 +17504242440572117995 +7834037490036073146 +2222529875682160263 +17619294726058415389 +14383055794878338 +13131763575890403906 +2996806038868079911 +5996988234054978079 +2181241488241930350 +9870724722816189 +7971624072491713858 +32714319732233340 +15290525445337534120 +9497099967956270678 +8757529537601624688 +29330140096908442 +105186575 +15373149465900166049 +5511666316212636459 +13355672496972055929 +16367545837494289468 +18285594085833135006 +18067928165930848164 +5416037699767721066 +12621564515514063074 +6844258633305442260 +18314527054315530169 +5635231170725949836 +4787251587800829699 +17697692971886146234 +6927169930160636063 +13815527001955700759 +6103488045386319694 +5461950776129099152 +10967349376607587931 +9956242218935389242 +5602580852767788374 +13167492210845183707 +2103571860712263906 +9870724757615839 +12235826804110991901 +232154535983 +9870726261601970 +1335101624596909800 +7139323572400095757 +18005850164248268469 +9088103565209904396 +11180753484911428983 +15576486110068356902 +10835476287324503419 +6206453478238147471 +8035430061115069052 +5849162576298137458 +2481036810160455555 +13819031587733648 +4519726896874480933 +13151687854617135404 +15292781542166447859 +1647839041 +17624664052529516011 +7447272838844916582 +5103722365903780656 +17336458496534127373 +15287705225422383007 +151586081 +15942884970699377526 +1256117005867095050 +336639206864406221 +12056017070647621503 +8484110780235401832 +7245823456815743708 +6370865789792314096 +430868391431705759 +18211693166464163253 +27356111259382914 +498702769346 +5833854251439771873 +1519546451849647566 +28766124488289056 +15289679327343034947 +2146416217502215065 +8663192652061289232 +32714414313179136 +17154120132161662338 +9870724800148737 +4228046406490596809 +5245848917147858460 +7010582259828800477 +5548133654234816353 +7121956618369833874 +13494546388563811757 +5517738881007642546 +5887104135609519867 +5299098844309427555 +8461370667472475958 +3973094888297738224 +2902523930611492062 +32714349827406665 +5863606022259491307 +1446788837522109353 +3205194871352864387 +1998795749008552062 +13491868288391598042 +7032823739573600586 +5022064819923859747 +5885976160280709351 +6209141854799280618 +13069142238259539043 +5251489279595718423 +2624757543696494082 +9654763124270243826 +14729052460444574540 +16481969114827859537 +1378362890422532141 +10811950326901199219 +8697110475982377000 +15831401131450125565 +10808848155069607214 +9667146378956269785 +7504185030266870463 +5619444456482949061 +2363524001746985990 +15292499534361546661 +2467175488938056538 +8108333368108268703 +9456758062656539676 +5303047099741061931 +285938493736357021 +12578234003375210501 +7193983585873691300 +8985794395457013981 +2625321610894248745 +14880882641964324821 +2625039560098719346 +1873618441748427470 +18276979644936030894 +14581006403261258959 +5783988525410167736 +9390205616975262860 +2250769230759076393 +13678484518713822204 +1414738713140088332 +11688076868545372528 +5537648138550140207 +5303047035255269474 +6545717972540525695 +4742860620108744511 +3311536089200934913 +11839255158488264336 +1144540821903267575 +7300483470289339251 +5248951110476109951 +11253445050136948427 +8406163815338370831 +2785415261752543366 +17776290961586271784 +6853599500602329147 +9870725377521159 +10578330811880646245 +9870725381387808 +6718250187864420391 +13226684591937105650 +255985042 +1519795087594118663 +11644549546703853502 +6476972182067942510 +15288269301217499898 +4267231879396668922 +7033448275620071813 +6839491151715508844 +5755891984757702735 +4249311151962281562 +10529039710895551332 +14101035093347583 +5565348432824719828 +18290600291679871830 +13060229400137130689 +9236164609748775414 +1256398957782385828 +15291371408563319448 +5245848904251240253 +7238085209787035812 +14268449424737376181 +1252732727351519754 +2528765198457901974 +10213320350798193085 +6366353527349384294 +12057566291546886743 +15288269236731718404 +5995296135638766267 +1329150524168695161 +9054951104626435667 +11228068150976327729 +9148988306963108899 +15288833346921327358 +2146416140119791912 +17941625429179250541 +5408700909154032540 +3493443078837190313 +31586331505608088 +10891020485448651932 +7299637395286655823 +15582192398883047243 +6474545497283430611 +5459976691403131894 +806291052 +11851052968763477256 +3427679821694721402 +8682551762103374091 +11251542888998525797 +16005333608888816888 +810157682 +1785514075551844960 +11508077306068621465 +5778348201656008106 +5492707824801366752 +5831598150311549559 +7398819554415960264 +821757642 +10329634847901966016 +7533479715470988726 +15287423226214838122 +15293909556187765646 +6360390270919060411 +5303047086844417564 +15958527223745617971 +5357989099524401546 +10165268275579085052 +7990307563599967477 +1147642972239709196 +5391068105015963369 +3743762997122316259 +227855239873 +2878633960883893980 +15291089443750237905 +3523407702141513290 +9870725970359914 +15281207295722273932 +7935271783416150110 +13487370603128647853 +30458248699193327 +8424279191236987065 +5477831076623296242 +4955573327226348689 +3475071577772609544 +14104912965778159292 +7761581441878608639 +12258209558853783127 +14941153557571192273 +14462452390860897511 +11242798885672083056 +2157660074536874454 +18063913043561551657 +7193137562460160652 +494403458418 +6415250479732515736 +13078006574768988212 +16395493137680185781 +8758912533449496720 +9870726993639189 +17345010118786555640 +30740265101438944 +12484965687538560131 +9839046461843529360 +451411649229 +7348007916474030131 +5406444734942685030 +14738481361679706757 +16222815465750731117 +5725098317485071494 +1956288376179936190 +878573215398456356 +985919067339188147 +3437045076364957294 +9379282676664377863 +1945545860539503773 +12931665201182294344 +5569296709752983607 +16376396894565974912 +10585885967639451492 +13944144538014196986 +11344414726101219814 +17368417748487327005 +7354297408760251366 +18324503622118304969 +1413892625240773330 +6928298004369637577 +8484674778648102089 +12021254591056846665 +16588826745223592376 +8321120651213354647 +8103087469667507478 +8285653427958856490 +230274105911103060 +8340515885408199065 +5701610621477129120 +5672853414445929765 +11706805043137558025 +29330122900969373 +9870726036092538 +9966383549812714041 +16579436683666002520 +6206321759556423805 +11175145852358514657 +1734238280406099069 +6020728396862655021 +1418462980 +6666914512528829733 +5969680716718154848 +1682680374277138234 +9947990315894794901 +7202350821053523623 +4904404316019509656 +4547181581492693672 +2625321606594956366 +15291089495339395601 +13745677960379192045 +29894190098753039 +14427656477939221396 +17362817165257939572 +8699084625194063580 +5323352204763932004 +4517143220465781445 +14472667508302298649 +30176197902492539 +1779589041739677706 +1518050107044554732 +1701463016462248659 +15291089452347577351 +651404368114879914 +11565678536647857984 +14311414805250851761 +5565348536003031419 +4123042324893806481 +7298791371873125175 +9870724566905789 +1302200594041499439 +11703729099918230020 +9870724570745644 +10574355727626678343 +17496113460347754496 +1158209155089723534 +6927451929366954149 +9870724574620109 +13819014391804579 +17792510766490468922 +9226507597256276806 +6579627558481909550 +14930532519163210904 +18270887714484414595 +1974151389111793466 +14301995912913178320 +1915314009235721647 +503000813992 +9676581144234038631 +1406696323580916006 +15456419287057442640 +11456836916282683119 +32432337723206060 +1851484117265835185 +13193786366007583276 +7033951813782602100 +11381506371093665520 +15289679310147118267 +14101030794054435 +32150286927669554 +14239554260952112428 +7291036772040202531 +10924362274963207255 +9870725101745515 +12271130050193527965 +12931665209779622127 +10167299845199169800 +16949394184334438111 +2149273943170765685 +13193833999799114297 +9870724605572098 +2624475531592294083 +9870725109478796 +159826357104561829 +1998795796298421668 +8976976526060174691 +9297801894190782102 +1041143148010551734 +6113028127645117766 +14264208142382805505 +9870724624890128 +949993974453257207 +5857541263545233265 +12641894410681986916 +12163139241182507605 +3408890 +8972984118757567052 +18202071738965568319 +11057351737720194627 +7200745020877123675 +6051786206797047496 +17875217632177436838 +8259178616901490415 +2861650900444587468 +7275547 +1836789874995648043 +11142196 +29894241687908086 +7406761759860330817 +3183268292350587998 +15292217457771553367 +10666446631412568621 +825887278052231409 +11889784335340611231 +1251886712535347870 +27920053783652357 +7196582198047545610 +9168364367443083399 +7935180019804499485 +9784232549897226736 +5674104474255774752 +9413007508879127416 +6103488036787744956 +12620665301150285403 +5327730873329919596 +5831598124518279236 +7033105738779918672 +12273023305233473743 +14225672646178530948 +11986541553781252160 +11753054607738028032 +3905480084311657830 +1413046601827240468 +16857200238495480844 +15289115294538471166 +15292499474173804060 +538248686 +9870724667438215 +42075241 +7837641043528020886 +15289397375426501054 +6364097413324553561 +5356296966714905354 +5884848008688052687 +7139605623195566623 +5780770817302008483 +1467988623105729949 +7872291577486781617 +12607757948000032844 +15293063541371577163 +10906513561824595527 +15273884660262767788 +2789363555875491317 +9714916684781063784 +11200974433965008434 +3240294201273225923 +16520632460564123694 +12859808742850832578 +5123125151186168934 +806894235232915758 +8793606454115246678 +5512512369720108134 +5860516583380235156 +9125974856828079818 +4651906966372099828 +10708867523106718763 +7373655750280030028 +16979823887004676702 +3713477366780281037 +490104189556 +2543805385922513026 +16073122410785425706 +8207049193560888761 +1945545899232028103 +12916838897079444020 +15230075394122596546 +573048387 +73008320 +9085283401181979312 +5701497137720419570 +447112352940 +7300765469495657337 +1576994605 +3822589237543248406 +17874833014726222154 +5779476267266480490 +12271685324778657742 +14479306195012236340 +10640060419764855299 +14264208193971972856 +5196265168830600629 +1122939678162435512 +10628792761042474696 +29330183087483845 +1042835272222657906 +6926605905953423501 +6205475680255622079 +235077704707302885 +9870724717704371 +11073003220413792890 +5342057710557283714 +6099821922431809119 +6868254539065794955 +6604811737535037220 +13787094270562147924 +10911952827834046385 +27638024484756463 +7032320240103528093 +18022289542760842908 +9870724725437651 +15291935458565189538 +13518427137128012390 +8779602290022963746 +103941377 +1378952147494256837 +7138759548192883195 +8453377129057750322 +5251489270997129474 +27920105372807065 +1607927611 +31586314309668537 +6387551633764997385 +15292217466368900518 +6103488088376872080 +14388630039427630780 +16578628686914275337 +12685785363931942476 +7087765752253514215 +6068037335015567296 +1091290920536393179 +17360925867609167160 +5248105048369990605 +9437519285693006500 +5111126076477356806 +2625039594491942934 +1873618476141660243 +28202091682540866 +16936549352757608699 +447360420122266723 +5461950776127855231 +27920040887004399 +10547011290217068414 +1785514015364097496 +28484151076595237 +15915403598725077786 +998316150366084651 +16410037266265216479 +9732264573922189530 +13728164708409753097 +5407290749757648113 +7194265636669162166 +17463424374412552604 +15693612750414038365 +18182996233199172076 +6925759830950740073 +15228101343791105904 +210659314075 +13847260430771234303 +4820981883914315330 +13998401902284713607 +4168960405349487697 +17508019195330237549 +13819010092507690 +15287705225421135187 +5835546358454763944 +5060600839239193810 +13569930533485567436 +8677926849941695909 +32150347114158423 +13016629051942656592 +6206603707173573591 +5305637558914849093 +17122305285394414273 +498701512353 +161940821 +599078861880638297 +16179206301763909762 +1811826159652466407 +7032259715366388024 +9870724791170291 +10277476906080547265 +15913750286224278390 +30458188511463797 +3675285199721413678 +12623424624422494382 +15454994402857262944 +11613165301442873460 +477207550484 +15291371442956551896 +15688212475568267748 +6678552048861397690 +12651296915322449066 +1730290029272518946 +15763960878931337116 +11313741854588163039 +828707450676266798 +1873618261182598529 +4052462105812281594 +10754349667962737046 +931541139054350601 +6981265919427019044 +434215738785 +872370568738387505 +18106614720225303913 +17256118128899604675 +3026644748647349826 +14268291611706527119 +7193419561666478738 +10576074758042313726 +14295407460658529975 +195728855029989490 +15859000273728777976 +1251604691833799594 +17225894676196580599 +8386818981009058570 +10652362076083996328 +7758478083289189433 +8856014234050824497 +17621843811119142941 +28202143271706702 +1733956203816118221 +6488020650427633308 +5235456286719439000 +5885825845363041485 +16744055248286982598 +5426895214129139320 +14666204015190089396 +10215782083327823913 +830963590497005367 +10389511585066853910 +1788898246588573530 +1783548243204982343 +11745203609402429083 +6194279471740573196 +201405393344685157 +9836098812192575328 +9870728841754418 +17937064730768978489 +9870724845303066 +5944302339699319209 +193555791363511385 +9870724849169714 +5995385294646888553 +684134283687105543 +9520658007113346357 +9560283092819269550 +2715060458215928188 +5330701959385781285 +1331604903622546151 +5303047078245828832 +13042703118959719715 +501165545441399797 +9391897680998441166 +16089517929515996807 +15287423196122256941 +2625321589399031718 +1517290320628892149 +15218444595734520602 +5722409910831360014 +7893636167883368559 +15287705277010306020 +8314921679875878917 +2483651899439525132 +3205275690303573601 +15294191606983246608 +1413046597527942599 +13331692090551242271 +4904492277816652013 +11017766478910539575 +1996539682273582826 +2635977056725856995 +9578899180366163269 +9870725872449086 +12632736833808781688 +7767605443550715399 +18035221455120189901 +13370939011252235061 +205241209771483925 +1357371525692475116 +9396420953962007824 +6078575874687443797 +16108320817807690970 +15287705212524520216 +9870725380142615 +15291371494545698735 +5207941461657457765 +7086919728839983567 +9082058240847142778 +17173019005713125829 +16875143922971971559 +14471968401315098924 +17300641246693115838 +11203378729712569805 +7596890219191742466 +4442408875329874626 +17900665953303356120 +7395266559825293831 +8075772944734760876 +830117515494321691 +17757265882196420245 +1766459227 +2845029503211149274 +2040219294663912041 +6879842073353196592 +5245848947241803434 +2575517759332552583 +1379700696478259147 +7299073371079443261 +13397929319343812812 +8239983520268841759 +15288269279722296198 +8761676844884301273 +2840921393219382080 +5517738911101577495 +15287987228926744164 +4278257602 +7696965337512046621 +7571764822379338579 +15325015632819605323 +12091006119579689949 +27638084671264372 +285672884 +4330598031175282753 +421319102918 +5844238504773242552 +6436459668631934146 +11340219339574241407 +12482638774054038689 +6053028419488738483 +16897312575039362357 +137207334228943293 +15290243360148963874 +297272784 +6747869491765126625 +11000783251845887005 +5249797172580911197 +5894178515782692174 +1873618536328156380 +17651881376765861663 +6887529782530083326 +5357842302437311877 +1836789900791531307 +6097847730228239577 +18371639724268655489 +1737013595702515187 +17299513090802403490 +15290525419543018666 +9420097755978882650 +2412156292642455751 +812779145 +12484258567449106886 +4445946728627654029 +7565159886615630914 +816645797 +5193445009101963178 +2625039590192651025 +10588786991446124121 +1873618471842356351 +11077353926396157937 +2785415356332257229 +6529487497066736351 +17461812116410481651 +4930631980557602302 +527217468724489193 +6874698970945955815 +15510432429060141756 +7192573538252948090 +15284420496859353365 +14632358326651744666 +10211084715274603964 +9870725961381480 +7620385028782319544 +7086328669600819604 +2932283198727145425 +1339885286 +3825221725456711986 +1969772432002323208 +521947290604561478 +10284111861439076178 +6155045882728943250 +206360024784 +15289115277342563956 +614294321649357527 +17082847164623382405 +11563660941193386881 +9375882715240667600 +7791039443921416928 +5611802251081954131 +3886136478444496175 +5835546354155473311 +9420185788507099933 +9559718133693762312 +17171464461123401053 +11479305196399967047 +6461201948627654381 +7353733384553038804 +6614769327816393277 +15288269331311445267 +14101065187289704 +5657220616276287306 +15785973014643101538 +8697674474395021126 +18390735680858955949 +9870726992394004 +1731418051892370297 +1427463126434521764 +5991347897401742338 +1550126047950753983 +9094209631738283451 +17578034881156428624 +472908251123 +15293345583569718107 +7300032638222873107 +1951690094360732187 +8393534168238138568 +17226423312241275304 +15860561610643614412 +429916450288 +2778018941863485300 +18413078431218478904 +8084900147561130968 +12914359404969070299 +12287601267178474260 +29612216687078299 +7507416457453450565 +14892847696200341564 +5779476207078750060 +1394018037 +3232799673214778996 +1894834093900452377 +3021726519649178959 +11405511344019413941 +5111714952489089187 +17783605070231313971 +5993604037222481836 +5962582003719886979 +628943014827088914 +6746177341759775790 +10165889737391951148 +6787307048611954727 +15291935441369244065 +5352348775768989718 +1164695293425183771 +1785240324424084516 +15196731271015578570 +14698926283648942907 +17325759479524769370 +918014392040164998 +5412502251425126768 +6926887905159741587 +1873618480439693116 +1179275495699994973 +12805200955977844996 +6155045934318096354 +1873618458945726512 +6153353870293666690 +14947084301526037 +10824222353964555828 +15292499508567023053 +17049995732279511686 +11401612930191007388 +13065116362012434384 +17578627655170875130 +2625321585099739619 +10315133626017015895 +8594986363552415481 +643567211612360700 +2885985010410086068 +11065487220741573868 +9870724565660596 +2271060374755230577 +15292781567961091582 +5883005685634389890 +8959988790532127469 +2695321185936893019 +12004529765984521236 +850088361543928133 +14607325578284117131 +9870724569499694 +10721161424573376023 +12881181537194284482 +6589811804398828678 +5409264877474156963 +12874657562824216916 +946825488890283076 +12260183733860182546 +524497404470 +11869124831344398762 +5411521030190360352 +5358271081534805965 +1371132807762499345 +3103808844949035550 +13304414708505260641 +2340885180733334875 +15289397302342130130 +14263644118175595980 +3397787842937168849 +14907899546381661340 +481505581799 +14429909664532092619 +4039694191486045184 +11997174049628113345 +12016961784973246844 +5245848942942492964 +14505034101877249039 +14844217472145517087 +18278813472452273166 +27356072568236231 +15287987224627470822 +5699317859939724191 +1519546413158513166 +13942170423195671930 +1873618243986677618 +4947940146537649514 +5942369916282023916 +16778219674098941229 +9870724608193547 +9870725108220630 +9444197051638170461 +878573202500562018 +16425048613593235454 +417019801410 +337192052979800046 +27356029576423695 +5302200977449883230 +15326505426505777501 +1777332932012879269 +7571955457723473162 +3665038964208922595 +7032541714572706110 +14982980764324274736 +13838434914856542974 +12121015432604300215 +8026150991294183148 +9612643166216790058 +9870727127725864 +1873618532028845551 +2163687 +6979473808788298830 +10482079439338557579 +1735648345222884803 +15288833321126801453 +6209141837602107621 +3560777249688004318 +11183855682536477014 +5248105082763223865 +2830312599839917921 +16672819197306999420 +6030344 +6981547918633337130 +11475033806672911468 +8856014216854898868 +15755410586754947638 +3099205763721989745 +9870724635247640 +16873513682112504024 +8046532080153354176 +6476237565605863772 +1893141952493600692 +6204347580252114375 +2625039585893359036 +9821766011288488511 +1997676004562464918 +15289115337529047558 +11774080343727893628 +1842148156554230005 +9870724654593106 +829835546381933565 +2529429430 +2927330589989236561 +14847109066750384962 +5884848051678638399 +5303047061049918141 +4608457496156910971 +2812188657392952768 +18008952305986047175 +5246976991358305642 +5356714206733085353 +15287423178926341667 +5684480658844551848 +5640012633996351049 +40830050 +9870724666188773 +701227632865388170 +1943289737916083312 +10839375724248242288 +9558026035277536518 +5845663956482418596 +544736774 +13689993689416878425 +17215282683679216314 +1467988623104496917 +13672173679982567447 +1093547051758546244 +2713566483735398530 +30458222904694391 +4303542368191393294 +6926041881746210939 +1575898585234829135 +4277348121211059848 +17963415050392115160 +9240218570728498199 +15287705195328579354 +16287902975626980014 +50011031689890876 +6262955797568166390 +10585794204026549051 +12011043047629803316 +10529039736690196531 +14101060887991569 +5510538203312427550 +16932670336295903349 +9200864239601914997 +1829157115266870064 +571813020932192288 +6616250477895183238 +2159352185851113030 +11998133734300808096 +71763122 +468608944800 +27356081165574067 +15158598919265149576 +4561962166720340696 +1284455533177084567 +8910392213926268194 +11455144817866398885 +15611911946388048997 +10440328872292255740 +17756407197952208882 +15288269262526373671 +425617137764 +1074211402240510042 +7087201728046301653 +15287987211730836525 +1895962116520307410 +15448636417986538510 +31022247110667261 +1914732269202730705 +32996392023111821 +9870724716459173 +8534473599634075244 +27920126869375941 +7299355370285761347 +98829549 +9870724724192454 +8591940797953634054 +5924189828468650369 +15290243342953041491 +13569117044463050183 +1606682426 +1873618519132215863 +8444842522800104148 +7561389495626835168 +16509564814676269146 +11009224574020765596 +16873513669215864593 +14457806711539569382 +15287141201213937870 +15290807410150812891 +11704790003199078143 +2170878889691527354 +11205710403273432336 +1873618454646432118 +14947080002232150 +3701508675985160878 +273958936419178805 +28484151075369064 +17762008144299307831 +9870724758992102 +15291089469544871722 +2625321580800447253 +2730975669658276820 +16264358665680677791 +16981577484988140454 +16952631352965017186 +18413392013782941785 +828143426469058818 +8084408095356359730 +6980701895219806482 +17441800153596830472 +17309267256018537200 +15289397341034665816 +12332399388405472003 +982204588270490496 +9870726782351109 +10090314555033671234 +6366030573177934658 +7192855537459266176 +8556747548505692813 +15293063506979741802 +16795745821907564805 +14578349385099791373 +2960542591583591766 +9870726293911234 +15289961408232445886 +9546289116437490292 +16305822396991357018 +11151193448791287759 +1146796923031667556 +13778733782702636920 +9870725309298125 +15578923778216897051 +9230173767499345405 +1627738421785073962 +14464130526682098483 +848960295932212598 +1873618239687379339 +7354015383759356890 +10989495787934662369 +6184915202276021353 +7527382810766416658 +14093965299185638831 +9387385366966312206 +15289961343746647505 +1644749190601006054 +15943731002710441217 +168849237244054920 +16881139105411316567 +18412545938780258357 +2624757565191836670 +6979855820217123054 +6988505140584265843 +12919891958651907523 +6419453204079001265 +6665603611953614748 +882239415736686867 +15287141252803080366 +9411230538297527584 +1703348037 +1923721613081728479 +1779024948746207643 +12593449824476795087 +3642015247205025529 +14861876048013049807 +10911952793442192816 +5872638509966829283 +1102095384688071128 +1873618506235590609 +16511122746743607222 +9086129493381961095 +5352348758573082181 +29894215893413792 +15287423239112833644 +10269743533867814022 +5249797099496562299 +11023259834649102214 +15290807418748167372 +17087641456366597398 +1836789849201137678 +14021601819555607840 +10528342604607197464 +7241889975650693905 +2625039581594066065 +14420158594156944221 +1575334505139237372 +5458848634390199133 +17788079974162058541 +12020684574737586618 +9870724855657792 +230294908 +2393930398991923875 +5841774633530060935 +6101795946968785173 +30176202203153737 +12061796546186255448 +3805996701580677666 +7081065208486769272 +7298509346872230699 +12000123328105421241 +11849924920349035033 +15287705255515078560 +13819040186453847 +1466296524688283431 +10904894610203875092 +14527810898352744290 +953645941584702321 +6208295874376239834 +10423334948494797440 +1992024717577515132 +1574206486818614664 +6156737968247287411 +15169666149850772175 +7247515550932861719 +8618954249926939363 +1733110171804002571 +2594159064844545689 +3308118261904646345 +16646682880171058566 +9870725378897419 +2200512120787570495 +7911402859616405737 +15292781507773358501 +12551372671573897849 +3350348129897814086 +3791701430868647930 +12592603749474121813 +14101056588701351 +13487493291780737188 +2974323816123993242 +5679882735783205685 +12848973732578136844 +13458105217770269334 +1730290059366458733 +11037919517269649339 +828707480770203315 +16474695943565635667 +464309658248 +4133802667862551945 +7723302382736449822 +2624193506591385707 +7085509629630087577 +3305379810951123478 +28766090095170910 +10073651711872149081 +15473430069178624030 +14263926160373729777 +15290243403139535565 +421317859661 +6473669550920643402 +830399553393148828 +6368045642961655911 +9116642200131151566 +2106423660343543282 +5871895778191885508 +292160964 +2262736868094464945 +9771025726725255382 +2150364451440036857 +2676033356038277397 +5728200394737084405 +9181763852457755606 +14485322628916323696 +7246669475930178291 +4867379493292372130 +14665059300698921 +14319322709146018540 +8698802600191998019 +1873618514832941512 +15287141239906454967 +811533949 +3878895965170641138 +1311573714 +16590518779154212536 +2914631493529984631 +18110911350818677639 +10209197843192373551 +6101795998557937636 +4769750103251108832 +15288833260939073872 +2575619841982229180 +819267256 +754689218597373498 +6153071780807052127 +15229126498475400 +7353169360345826242 +9836098777800721703 +1873618450347157655 +2158545569184509711 +12579170400201283402 +1005890003669224772 +5726925958801531850 +1587112819500011563 +8964862679611038275 +6365225423046536418 +6155045882727705018 +8663726823531171453 +11672558548109519873 +11743437156022762298 +2631305799724044878 +11378236832929373002 +9870725971736173 +12895405287573834766 +9384393054003222437 +15210536763325813460 +15292781516370690041 +754060946354952238 +7022272817292866169 +1465569262171809901 +13297153724119725165 +11515585087059010353 +29048192479877312 +1623790192146659424 +8154081321495508321 +5888796281315790656 +32150321319667308 +763245092587843434 +14958319878224363013 +2890785419192834322 +12912667353842739129 +5890488375432723999 +15288269309816230032 +16404630304092469654 +6742621540469592682 +14318758693537398290 +4747653742013059890 +10654852030096688658 +13513390315283555617 +14333944798802766813 +6927235182091329645 +4534407021717883718 +949370018900110173 +1108582913422403056 +5582375653048017209 +2440417245444775939 +13295743603413247837 +7352323285343142814 +29330208882107792 +14264783202905230553 +1873618235388082366 +5932136316345662089 +4134926167463771621 +15288269245330434093 +6926323880952529025 +14866462842593414500 +15292217535155363401 +11366272409954836742 +14383060094311657 +12826909658979572485 +17295846911959438847 +6097847760322188401 +29612195191864981 +16842569926204276634 +2624757560892545089 +10380820297057655956 +3632094463804522871 +2183217404597917924 +9386257335747874065 +5622546645510608715 +10913644874661327680 +5403791111229623339 +29612152200060363 +13461987956028742698 +12060104512255826936 +6500635606105806537 +14712930642215587165 +2372569380647405950 +7087483727252619739 +28202117477191360 +1678535306338508606 +8320063730434258647 +1873618501936286601 +4798202644785010020 +9148492468824006434 +5138916843283032920 +316179007921072618 +9549109340650684663 +1873618458944475442 +16373637883993923991 +5356297044098689639 +6100103848552567224 +12046060055529211933 +3655028339501246621 +12825132176711684620 +236453959811 +4835469262017941581 +96258212848688931 +14054073294632399944 +15292781567959836815 +5246976982759708111 +13819035887159474 +14802689540160500058 +6812506322839672032 +6155045869831089911 +7884436482636523144 +200191596416994992 +8109001260751274153 +11002936678134535954 +16846695548643710170 +1996539656479057308 +234223946399114137 +16821893970015894696 +12778621592049114061 +3444172667634475729 +3305725656990757998 +4526720883860196160 +17363812233662516121 +5782296392602045443 +2720223265557924054 +7453876520354585099 +12694510481574348158 +16294470476860886879 +18178458048973716927 +16356337363313898818 +15291371468751186688 +13395281824280703893 +6407362343787708898 +11496041695137061043 +15043322321877089681 +2787671440263309824 +18413674012989259871 +6980983894426124568 +698165752660237995 +9870725103121778 +5991347863009905794 +1084617945697046608 +6538994922516329481 +4662360103555718707 +11619890057073089835 +6204306685474773234 +16155667916530073729 +9572779804176180252 +15291935492957160870 +17448309371147738033 +880547325917800680 +6995848693710144878 +12275078297028025791 +6211116025505142160 +527560919568951683 +2676033351738984926 +12226299794625556052 +15578923718029153337 +9870724626281512 +7340385337625366862 +9870725126321571 +17595811302773695698 +13522950414391068782 +3678171710286219705 +8912304245417453068 +883931514151661403 +9870724634014769 +11211871615329849289 +11108455524822236392 +14341909694997488790 +18337904078964077599 +6544871850248125421 +12518470 +6100103900141737959 +17863879857806254425 +7930103797640092238 +27920075278984891 +6097847704433744053 +10078708046770301185 +15290525393748515218 +17848838676548887727 +5976453840464931807 +6784952888244856643 +10911548679683577560 +1485299202679331534 +16965018239810425658 +15294191632777894581 +9870724653347912 +2625039564398145557 +1873618446047843300 +1531971352 +9232711897927854097 +1375850649136278544 +29894155705664514 +7533094932733453611 +16484767890339211102 +9870724661081188 +13713461911897596379 +5195701187613963650 +16167625211035598299 +5248951136269503046 +13517299088713586459 +12341216666987343674 +2539784120 +10940245256426776127 +9390205578282879336 +15291089417954477818 +9445722595595459943 +4416647812426771771 +12973796087988575910 +13735950183222349290 +7086637703839089091 +16876908906661681657 +17708849407224659857 +15289397332436085933 +555091498 +5517798644040224309 +15198796055262399316 +6256189438951187027 +15287987297713217939 +17250601175141651021 +18115578910873817112 +32432367815897203 +15274450506083756132 +1837917966400764189 +14921737912959136505 +8861700295377830954 +62784656 +1780153074544355126 +2368935519853614683 +6644145974623758915 +13304414695607383688 +17785259801536762801 +9870726192133803 +12904310774406713244 +1546925423577152241 +1784385966949690623 +18001524892029046964 +14101039392775304 +70517920 +1168553459834244873 +12757504337486308452 +570558008 +16801251410543403101 +9141261708597157361 +9387385422853514898 +5781052833705636077 +2624475540191008773 +1971938164852602563 +9616471278155879119 +6054606349327281437 +15291935544546316252 +7247797550139179805 +6924604781897600803 +5671848343033764653 +4228443699424617193 +16881139139804532618 +7753244037492647867 +16161820259100397665 +14383055795024527 +3531133647988137149 +1945545813249771161 +7351694380232218047 +6520704059412540211 +9870724722947262 +29612190892574015 +13521401176293190563 +11444274190499408542 +97584346 +101450996 +15290525445337673176 +32714319732361603 +1710397005500280130 +5329684834211676477 +2624757556593255104 +12001684524694721185 +7085791628836405663 +17626237310166195021 +6204347631840012273 +105317649 +9840570834876781106 +29612147900760141 +3174142914383080681 +17063697111067681854 +5134111493730672360 +10798758842576623528 +477658896783980261 +1873618497636994606 +5354604945682476297 +15292499547258298089 +7034797832897036683 +1044809331152867059 +14338844047743260362 +8211561486099181094 +18103065826041145666 +66093704493221941 +937181428416605704 +14863889077920998781 +9995749965818580539 +6204347567354243445 +1873618454645197307 +6101795981362008865 +4085427989274451254 +7192291513252053614 +1256962973392334915 +10946714924666463333 +15291089469543621236 +18000100242212155005 +11841889356580144165 +232154664379 +12967490521444924920 +7875519727823180584 +6206603771660751080 +1840456058137954757 +30458274492592616 +13545545199287940580 +7141297717312684634 +12877339478002837226 +13819031587864902 +644023896 +12914036661615991821 +104671971731926792 +5780604294185818304 +8378659008420725900 +16355799333387189060 +9870726277199546 +15511125704795369 +32150347115533408 +8445260837540081108 +7353451359552144328 +4736709352635442829 +3832076563905585634 +15292781499174759035 +846986163917827316 +11589943904033337005 +2449021754955871866 +498702879366 +11909706579500095545 +18411981914573045795 +8333149240508034120 +6408081225952356818 +13702827714901708122 +14108981663957016067 +6979291796009910492 +5623674689627113341 +30740269400863048 +13819298136067083 +5734323617267265433 +14681117629873534431 +455711074211 +9870724800279810 +7165906625193929293 +13248430393916275378 +7561320048270537297 +5892269654353719067 +14106887050504256894 +12550602817490809765 +5628018632356288117 +5133829485925764439 +2837265620944643207 +1691478437133292796 +15290243394540948169 +2786543409044852529 +10970169540634426696 +747829823970021344 +1571386301296701484 +17060688321802148173 +6043037530811151195 +5882441708717031644 +16138819695825589643 +2968185489195545794 +5993604063017122547 +1357540530547027909 +7140451642310001206 +29612199489922389 +2761097031836109840 +3838791148951585556 +15292217517959436990 +6595419905013471813 +11330177587868222537 +14110356907953896434 +2329434378204690902 +8921240145136670470 +17802959724584837197 +1873618549226150588 +882239415735443170 +11034437435298441848 +4776295121763987316 +32996357631270657 +933515197984554345 +1987794454340905734 +11706178989343196278 +15292217474967621392 +15288833295332302078 +1713702731 +9950019064427711383 +11748150913867600941 +17489156252859435690 +5778348214552779628 +7876195651955201037 +1873618484740362945 +104025378578178950 +6200238171345459877 +16392015933512374390 +9947520430985256470 +7246951526725649157 +12663073881015724592 +5910883915778910592 +5831598141714354177 +257824245644089751 +1873618441744706629 +2625321610894379746 +5727354418613398596 +1873618441748547925 +2625039560098851553 +28202057289451853 +15691341989058142778 +9548423176096538679 +15289115311734536197 +1564161993477470171 +17952180354962120724 +10030000340710012885 +7674038465364711737 +15289397371128592691 +11224688244129935841 +14932201313632477462 +4386668156755525698 +5195701140322854424 +6906911136156953140 +9870725381518881 +256116115 +15411231786989920501 +13460494288513419136 +2036363812201112995 +33560368941774356 +12629341436292386436 +1519264379559104497 +507300223651 +13773433712857532747 +17173772775954337388 +11921229983125025615 +1784668013445930268 +1148206987848478255 +17947829764244063458 +7246105451722965729 +14101035093479979 +15804734090088421783 +4947704488212245646 +7728957598346269765 +442814459409 +15291371408563447307 +2624475535891720994 +9402235489654036327 +1783301981 +8382349310400925692 +283182508 +2012231249106853341 +14750116422475731841 +730895392316136045 +12565884091408669925 +1251322692628792208 +5249797194076262909 +3985586538674412533 +7352605336138613680 +6157866081147643631 +2884033186131034093 +7172128103265880134 +15288833346921458960 +12083429430260417871 +9420558769965583071 +31022221316152001 +6588965755190791000 +8309452141569985313 +1410790466305937572 +14935260669128290269 +13044533444026657366 +1873618536329529330 +9731164704471978302 +16642773989029323216 +13563403359923681834 +10349954665368219716 +13396276396879196240 +11075661853774602958 +2637684351025963502 +3043188858128003525 +3901910077209972501 +15287141218411223657 +2521073773051975539 +13247866421298286504 +6985875272338713816 +1873618493337718272 +1043399313624678565 +12674888154218378600 +15289115363323703224 +5251489223707406931 +5463642857348356719 +17809189036286176336 +5887799955882383627 +1321928415 +5484156184771906594 +15292499521465039138 +8298139671732504589 +5352762562442315364 +15290807384356305865 +8139518016048679754 +1838763959721734255 +14033389121636099519 +7116009405336473346 +227855372912 +15986098390340471781 +3874225267139747695 +10003084053115964246 +15060052268358380296 +17567900090133148577 +15294191572590158538 +7529985804651410812 +18297946943827554953 +13819027288564094 +18131365454489933342 +6208295861478382453 +30458248699316835 +11916519789515393673 +7351759261135930252 +6487611341588016865 +10906583484168421245 +7975509434649169687 +7401639774330038120 +15291089400758545807 +16323412087919631163 +17292034690817528186 +13893161786987404938 +14024884520280018511 +12258209558853916407 +1251040684823878554 +10379453534728696883 +1864501104 +494403591020 +29048170984651074 +13328681692701999025 +525267382265079272 +5634896889029408674 +17629546554121863107 +12163099675411494795 +16797437933221801354 +286257514616541035 +10720425910717913074 +7401639709844261743 +7532645307890423512 +9870726501463779 +17205553309097925125 +4336172252441693479 +451411773457 +5208260076065793908 +1776768834721288437 +5307133245656295418 +1118323101191772082 +931541113258598839 +6201941232991219343 +14737684059501056029 +27356042474429382 +1410790517895094168 +16305449486689457790 +5786674574883448167 +9386257378738449813 +12615549852244255805 +688165077222762198 +5885976155981548211 +6659288707779877066 +1873618544926859588 +5089721691875851317 +9870726024623735 +6339470721423973001 +3225577932054211833 +17423767204507310437 +11403275119319064849 +6043037483520049206 +8553630178781191049 +8429910788516486838 +4928375806343781207 +9392472737220403964 +5804263942124888426 +2624757539397331657 +13991391226545779384 +7245259428309435081 +12163139211087466885 +5405598724425912880 +18159864630189634360 +102333280161970014 +1232853195853620893 +5359117135041031952 +10276510444219410513 +16881421139010857925 +9811925733550864125 +5675796551176949357 +9654763076979265247 +28202095981976861 +933797253079323225 +14462121002204465820 +3780238050272307626 +8117093398383322948 +2625321606595087484 +8245891699519397332 +3091655093374633792 +2625039555799560314 +6155045912821630998 +13642614608784341001 +10665867361946713537 +1469680721520911334 +5992475924321093282 +5246976982758477596 +10971297649236723061 +14686192518692563229 +5845649209709173816 +6980419870218912006 +15348353837155633996 +4036522300588560308 +9870724567036863 +18413109988782047309 +9870724570875956 +15292781546464618072 +369024847117243304 +1893500283777937093 +9870724574770138 +8774519406181757182 +16596897767247142853 +32150351413598211 +11844539297854221723 +6992901584139530372 +9435617308852820034 +15289397302343518458 +3890792205434441997 +17092728770733435487 +7000024672066936323 +569434363824922376 +32432337723329373 +5920540899190515711 +8794768871099930416 +15289679310147231957 +9870726098089608 +5516046791188876124 +14101030794186155 +2027401273281703743 +9870724601836525 +6470597267645141116 +1873618265482029963 +12615549903833409510 +3506237898852665639 +9870724605703172 +4394741386639714068 +2624475531592429029 +12270241411263108066 +27356051071772307 +1998795796298540144 +10169273990111778740 +9870725109609869 +14479306164917183741 +2796504294126350334 +789242300058720234 +10370135957125219552 +6979573795216228578 +18412263913779363881 +1495926548 +1995966335 +18212326332966264511 +9870724625036313 +7564330021528214623 +5996988225456520848 +9057910677280410997 +3539964 +7398819614602565259 +9195440111775792811 +17607182983839491112 +5944020284604680202 +7406621 +2507605935 +15861049122876117888 +6211340306813030328 +11273270 +14934762739410736259 +16364556117062983968 +17781311662180017127 +12801735476481372387 +7498048152822102540 +446328147764269084 +1873618489038409301 +15290525393747257196 +10405394452257188810 +7086073679631876529 +16892239439269465052 +11777272272100991552 +10217900751511711477 +17933681651523926943 +15455877103673689158 +9870726148355744 +9202545917764903746 +5400939667408952833 +3677019719062004209 +5566476498435326289 +15292781598053781419 +15218444600033946022 +6490048146395972954 +6368861820809862058 +933797197190869951 +15292499474173934676 +17201605122451313736 +1544372109263388836 +13525206554210542824 +17866909664428956430 +15289115294538623417 +13939914291973664751 +1120363941559159057 +46072956 +4911408705643891477 +7247233525931967243 +546113046 +16926509157610828050 +15291089396459262363 +32432389312486737 +11170480721379020818 +4386668139559595637 +17447639780156194351 +17012102176444985002 +5782296379704153811 +13208783365851913435 +13851254574720697870 +6647209537894230859 +15293063541371707103 +16520632460564253195 +5277061796181537592 +13515888989503707046 +5833854242841300401 +12975962075634812932 +10829621153868638609 +573179461 +1778460915940397492 +1148489051540574998 +13941243479815833477 +4999862633191595096 +577046089 +447112495451 +1201738978702150084 +7034233808689824121 +5728050170101043288 +14904796311579222872 +15291935523051097363 +7259530027764769468 +2783097505413616509 +17791354712975036831 +3690879732733599959 +3426195335842376298 +13267938307966398739 +474330230533280692 +8627823647522383843 +5249797176880338595 +96339160 +16247618866747562896 +5825995788684773869 +10010212520221548630 +1873618540627567448 +1731982071800414822 +5931938921483164753 +4643874909529785096 +104072451 +15990669684775925424 +14241949623417461844 +31586314309814339 +11743532295834133648 +6209647271312053571 +7140733693105472072 +5867018717571467694 +16844544045322217792 +15463390673086057845 +6204347610344808635 +10106558980070858899 +12903780683973473069 +7446140880148637983 +18169457873000670950 +100641190344268405 +11471243239402729216 +1873618476141775283 +1958135294232440991 +15735363948478410214 +28202091682676862 +14947101497578259 +31586271318004624 +17621268784990000837 +27920040887136934 +7352887335344931766 +8507454653825496742 +6153071763609886856 +14809301323776875987 +8110899722842362754 +18411417890365833233 +7888059800440418763 +33842475624514007 +17781311584797599688 +15555573908070032775 +12301880565312663314 +6206321690771458068 +9306301723346165289 +14830323918951825657 +15291089448048399883 +5782296431293303034 +16374905227699110601 +210659445227 +6927733975863328950 +7728603114666338364 +15292781542165341022 +14522564277077634451 +17106628117232303904 +9870724775834865 +13819010092640566 +13547746171706490652 +15793155005115402 +16210341989777805805 +32150347114291481 +13689507212922791857 +9570985786226327382 +13492849616059046839 +8454130924349970529 +7139887618102788644 +15179971149767525060 +498701654463 +14089029404555040561 +15913750286224398453 +8127438033272529069 +13597987859076575595 +477207669968 +13296322039520650267 +32432333424060614 +9944982283359577084 +3991678734254102194 +14320931619024166936 +9894352443289847580 +9317408182901677424 +14101026494876863 +7660974197664791767 +10608900034458829440 +434215853749 +16880502174436764254 +4001183637361742659 +31022255709379237 +7534792945879501817 +12202304929111499509 +16956861616201752691 +8253013539602959944 +5567604628532763180 +30740204913836334 +5881302572399610048 +2152498386425567870 +13351546068602876214 +5095261602623132851 +10662960070830926069 +13515325016885695701 +14260896784227322409 +1427238547443354826 +15987071584761896140 +12797441986456865133 +3348032312319620923 +12591757708863408805 +1873618527730927839 +6205475624367300113 +11287403619712896005 +4227200417470436061 +14903698664765353204 +15288833295331043528 +4753864405445973498 +1774230712891554374 +1893141969689659599 +212338040 +12363581356162683844 +8964432326420950152 +5688992925586898433 +6793493828125151735 +6814198477144531619 +15287141209812643027 +5162541778422546061 +7026070059989940060 +9629908783966066323 +9448824776025840497 +5831598141713102467 +4668531667285391575 +15370995855447582958 +9870724849300788 +7033387785276293473 +16699231963845581018 +4656105577719620780 +4011213668588802143 +4267449658638483583 +9480521367486342575 +1359796670366501256 +15290807375757731632 +15287423196122403251 +14024511452629257296 +2625321589399162869 +7603903374857092567 +231671168 +33278352538283492 +29894172902965386 +5881704967873704316 +3224843666202389996 +16833640656039595289 +6155045895625709224 +1943289755112138039 +2197615060210496695 +7245541427515753167 +5565348540301197260 +10154483230895248550 +14418748516443624712 +5831598077227314261 +16884131853615250381 +14659363209701640058 +15291089435151777774 +9391897638006769647 +2515699716192694048 +10209313030264673896 +5780604281287949337 +17007398772982433571 +6362646423635301420 +7194547631576384187 +12411914243250342134 +7863418588154261667 +9870725380273688 +2530175319163284785 +5996142146154555331 +1519546481943722555 +13303889903241482290 +7407889868462773966 +15625721628276957786 +30458197108943886 +15235794570491032359 +11513033584739709465 +10681922109302072442 +1668925422262432562 +1416712772071679605 +15287987271918694381 +5199649387158590156 +13642648098285957936 +10781951560498488464 +5885412028594853547 +5299098874403503964 +16226199636787601084 +10862662093540571635 +16884073780545605476 +12532327154572610410 +6470597250449234570 +1325518094907368979 +6157301992454635985 +9174086388610718747 +6925538300593187070 +14815093945352265609 +18118845014944789628 +5707451689703714761 +285803957 +3062899443326529594 +11434288507026092730 +17750984710026849081 +9859535332657810837 +15288833346920205552 +1571386288398820908 +17632116823678087039 +5108094061965623984 +89551741351239622 +644498444287697722 +32714336929673318 +13831923444270048167 +17587245658421541500 +1200046845892650484 +9870725926712920 +7139041594689257996 +13522668389390158175 +7440511606793389808 +11871755854141800974 +10255262013521801406 +16358593412853159043 +615140332166385463 +7871853600569384624 +13209471093094567255 +15484720670844008207 +12799016813872631599 +5301072911838356476 +9870725938312796 +816776870 +5566476545725185918 +1873618471842502397 +4146446263661375026 +15287141196916014313 +820643524 +11202783305103926434 +6155045947214860161 +6879287105447206933 +2625039590192781858 +4581098863734365754 +5250413516934940904 +5246977017151691622 +7300201440989348710 +11788921454419592415 +10756161196621900677 +17082847207615302798 +11865320555827840453 +5843037688695294649 +7938532420313699473 +17879906935043136961 +17968144200870877348 +14848239906707279242 +4000906973558223898 +6153353818704648218 +10331854920347883825 +9741420587119949299 +11762200424231028606 +206360155773 +17469317084066962475 +9870725973112433 +15142404136401970619 +11904574145983433326 +5246976952665904412 +526674426737808782 +1254142856654234794 +14758160535381889275 +9198263872370143234 +2890508296270408554 +32150342815003323 +11077917950602272150 +10912798812556632012 +17088031212435738395 +1262922236267419932 +6599737765818617388 +6702109864571727138 +10735236183146699939 +5261190247411509262 +7953753204275615601 +8858552325786961965 +12396824202220157664 +17940204315149555308 +1890603817765911409 +5426480827987071496 +472908387888 +27356085464996379 +11184417804925416489 +7593888507932713768 +17568491447002928331 +1252732757445593399 +7560543446418734159 +11382142034855807858 +17415247587990578146 +15291935548846993270 +6096473198892445419 +8316320782878323646 +4199805580057524191 +6729754102968813631 +429916559736 +8981039660885224755 +6971710725545265525 +12300297158579526681 +15289961360942699339 +745855674757038823 +15727504891592251730 +8018940475328649017 +17608486146476040591 +1574770455137508974 +1496635744753239718 +15290243347252459694 +16282840666836123396 +5675796594167519586 +2501143638002329096 +1732546186288055513 +17557492350536675544 +1873618523431658752 +15287141248505172047 +2034512956225496008 +1009252357147419976 +6699693882226582656 +12422839241108434504 +3144139388416896605 +8298936022927352875 +5415911483048554958 +8486366851269947961 +12957163783496613353 +6204347593148864093 +6378421771660763249 +1873618458945856647 +12918763884443034474 +4547181581491573706 +16910582413616692266 +28202074486759751 +7241607920557254986 +31586254122072140 +4009970419794318781 +987047180239645104 +879419277503369179 +17048117256962784734 +831245572507575577 +15292499508567171597 +15666430405475448547 +9870725054231890 +5303047073946668107 +12671965654747590743 +1041707142124087183 +2782533206060846767 +5727354392818879518 +6997585973844518733 +7587276533633670282 +2625321585099870378 +13426501244838638065 +7215857415718709974 +10701168386933017266 +3651125125687759309 +9870724565791670 +5111716669164117453 +6206321673575532504 +9870724569631218 +214961370934 +986178216889761207 +9870724573524940 +1873619409044462012 +125479014684706256 +10594427319499623325 +1626892299492668172 +1321374866791223401 +9870727081457440 +11786712501505699818 +17939922315943151757 +16205457387048548411 +16913056664662974679 +15037583526713577847 +6443383187389180404 +1043963281944828423 +18411699889572151319 +6979009771009016016 +13483778469110116257 +9023438201426753644 +4021902226269562026 +14366314639192124632 +5835546298267153769 +28766107291246680 +16860569648395798417 +5058465046824313393 +7105448691678269764 +12631642409355131848 +931541143352526798 +27356072568376668 +7036226112429885798 +6928015975069647036 +15288269275423127489 +9870724604457979 +6614909541062830583 +7571745973084755678 +5299098870104224339 +14423868352384668840 +12463417266756128621 +1873618243986807755 +7550321004573964879 +9870725108342821 +15289961369540050274 +11945800880170424742 +17204145507159262028 +2304512486314433541 +827297398757617239 +417019922396 +490735063 +617000503212455836 +5149742346579825684 +3205834693335464486 +7531690829936285346 +12451377428844715618 +13802657059030845319 +2949328499430346665 +17819208509888008579 +1410790483503247383 +14665076496756079 +1304290564694295508 +1873618532028998521 +2294761 +11460215567020659858 +10140388370412499313 +6161418 +933797283173262129 +3889194752880565978 +5304739189560256540 +230324577527214874 +8425125197453485400 +15506069212585093180 +9870725143164347 +18398400523337420497 +7657986991371002919 +1873618467543209149 +2625039585893489962 +10417684559046468158 +5304739146568460114 +2100992805777449498 +15289115337529172523 +9413229533004186359 +9870724654724179 +8371550453039641307 +5303047061050041354 +3790908083858120185 +15289115294537371360 +10296839827164892924 +1893423968895986457 +3239382674005954857 +6047549806150887372 +10894765727974242912 +541001214 +5000990673008793811 +9870724666313705 +7151957518376505009 +544867848 +6357261901724007060 +8600881962343274883 +3296646270172813952 +10195897074104037893 +13407762898221475439 +7033669784482611559 +5136649632755312559 +13395517992529457141 +11891236414941323305 +14083893301957259743 +3019990612812055330 +16746031747734396591 +766829195704035099 +5389310202497883490 +6431170477344758589 +15287705195328711682 +10144621227369126745 +14101060888123954 +6700459465054571642 +1256116975773440028 +2065251783917066111 +12868692345733410146 +4618182651265695138 +7245823426722071253 +5199085482290715489 +5569296748444388458 +27356081165699048 +7196018225429631936 +15691596646605144358 +468609084199 +71894196 +571934270 +9870725197297090 +18315937218011468852 +1065200468752818671 +3878049915962530640 +15450328576589370943 +789016336715364767 +15288269262526492761 +13047676790328079491 +17467906937567208234 +12049393095758585350 +2787671405870197047 +10862662076344636146 +15287987211730961130 +14383077290361462 +4265917729098505546 +5882833042081539925 +756647401690 +5475199329848662024 +6313103561496792185 +91227340 +9870724716590247 +15291935501555886148 +6019190719683782443 +14375674833932606054 +234824926651171792 +10228739305849247375 +5570988778075550527 +98960623 +15290243342953167485 +2677443726094576341 +6311975534577666450 +32714319733747157 +102827253 +547248224624987812 +5739105232565203828 +1873618519132346715 +14367577705899433767 +2574671731619879755 +6483565209768375486 +9654763094176591164 +114427166 +6927169951656116388 +7478152920053669742 +301492599510948394 +11255779257901672441 +1485217303774511822 +5677488662491171019 +2481893878485567895 +5123966563937620650 +13018118412928313546 +33278386931524300 +7397691553291581305 +12689613402799606751 +18034522837647563823 +7139323593895576082 +15985608450754552208 +17568124697245276338 +2625321580800578367 +14107823478185859187 +5196096360570433761 +17617190905407497094 +15292781563661919252 +1464322371178616088 +30458274493984455 +4987374176237345671 +8860854185983220496 +9882920632422962712 +10906583509963052321 +828143426469194176 +33560403333762455 +210662084848 +13669583335851560026 +2534807887592506475 +8697674521685009726 +12556512549261358685 +7300483440195666796 +32432376414606401 +17683162794628878308 +1990332571871553551 +8074562693752254992 +12060668540762400270 +16589678623912638053 +5052237058537315926 +12468953183566632818 +15704249776280200391 +160826698 +9113587964964445188 +9853532073397197279 +17620140702182349847 +477206427270 +17232159964597005884 +14733176956707234193 +5569296757041738798 +7030300293132739956 +13889891850651121512 +15250067007241729725 +12757875056923796321 +17149817495305718081 +15288269271123839569 +7746405201715875301 +1837917910513708697 +997112076528391199 +6679596954628150305 +4051701729562609748 +1873618239687515417 +6470597241850634044 +167131050139071364 +17620704769380138850 +14580323538610888947 +7123437138199080979 +1200046880285858748 +17245656359461667724 +10749611060945307145 +17782439654706127499 +12569464285503173870 +754245893368917946 +16773068928657594508 +1254706842170307562 +195626347 +3068049059797011644 +1413892608043723513 +13159245476491963438 +2624757565191966903 +932105184757050351 +3880023983492587431 +9588766567104463719 +5359117160835667652 +5408700879060348353 +1730572024179682022 +16873292416751573741 +8785266901479002487 +5459976661309458898 +5729046525627161904 +7528870385169534618 +8263358500300266822 +16644692834958335481 +17754997064349206316 +7717191090462395901 +1873618506235735792 +8715009073166037677 +13560019150194548086 +3094190453106412934 +5249797099496673233 +15287423239112961495 +6667196546127307371 +987047206035547005 +7193983607369171625 +2625039581594196713 +12367205880884508303 +1165470604183745783 +14412428538658517582 +17520266449292561512 +14276005439372549440 +524948496318606286 +1740610508054280659 +1948366020268473888 +29894172901728081 +2180307102810319169 +9870724855788866 +1469680747315554426 +13237708539884666884 +9870724859655494 +17225295190741240735 +2647655962581081226 +5357989069430732680 +13518991169934075664 +238159246 +5780604324278515499 +17196618744040156978 +9305725264287507058 +9297735470756269426 +16591082794762976726 +921628663266752174 +12197551629056742534 +15872788267758849942 +11065533344214956728 +15289397349632136942 +14867644133115654103 +5195701140324225002 +6203460636266678556 +14748186881073180984 +9976735803327388352 +9870725379028493 +6780625301062364962 +5247593352907000900 +14956022666157298420 +9870725382895146 +15402324910768549439 +9639365634786417788 +5464488953846368648 +13735950157426605467 +15291371473050627083 +11616022707950864421 +5250643183096709644 +5411521012994541650 +10357637806106624642 +10644085334847022579 +9850513459867572703 +14101056588833778 +5462796868327968001 +4975041133675042167 +4995151238597518374 +7399947658717850631 +14263644100979807429 +1411918557712233621 +9085283418379412214 +9907225968885969808 +7193137532366488197 +2624475557387070230 +12308501919555863628 +3399294742163772162 +1998795822093197151 +67422135400412091 +2394361737184364179 +5344009056337290722 +6043037560903849644 +17154008209968467799 +5995296157134228103 +9127185536458370035 +1900779158898875092 +3885957334169638787 +14731137997775267201 +9923447858191471302 +11839726870381999673 +11161453508845582323 +1092418986146950205 +1156159001496397128 +31022221317534373 +7299637416782136148 +5312856438487790303 +8611864043749332880 +1800144734 +12583873178280597231 +2676033356038408562 +13824576674685410242 +9202545986551357872 +17951898368652544275 +3037586155689286574 +685262267616024560 +1198918840470099768 +811665022 +14152551150229663003 +13246007025996884040 +1815611240 +7631571661644636948 +1573834047912424065 +3846918201996099223 +1665063776377522754 +13382486157233050926 +935489308503916204 +18114732861665711671 +9813006712074350439 +9638113321641198705 +5727354427212122308 +331075883716981304 +1628020382299024613 +14947075703062346 +10163069616355948295 +1873618450347268545 +11757671242301185434 +8807355653287206151 +435378996542324797 +11129919317818559234 +15721816235276065187 +6269101774807522734 +2625321576501285744 +10227611240237505273 +7491930919958039221 +15291089465245701668 +17713680698308641985 +1975574281736634940 +15701294198255332361 +7295139920008275502 +17094420912141640794 +6882557191050719074 +9103257820146525751 +5568582435113995134 +13327291319013612335 +13958288683712202178 +8177758353543554234 +16396171530409093568 +7081697764708457589 +12727447219164439355 +15673521516696719920 +7298791341779452720 +8907854006114204377 +2728587567203511006 +7888341834039963790 +11760418338998809245 +10159110354702910563 +9558025975089947589 +7119982512147537852 +2980947595104703670 +9342770169617398569 +18144989287547169305 +10585391818487578412 +8964724180655547687 +1236545905848420951 +10109472363683064481 +16891111339265913159 +1498697907618072081 +1201739004496782889 +28766098692651092 +5671848390324996594 +13137886311290660755 +16264239876490285091 +7454507813786630313 +8486084877858251078 +7033951783688929645 +10332418923058644666 +10599514620969886653 +1873618235388216046 +15290243390243025326 +6351416861983919649 +6598891776798313520 +14204955010987086526 +3056459202196414067 +6925897221603418406 +8141063112056268353 +6097847760322302491 +1396770551 +2624757560892675938 +4692266870559095293 +17117716579000274167 +3808627563690092155 +12892015524053532218 +935489360093069114 +6151097687483890876 +7455648598260672640 +15288551261732817404 +1408370430 +15291935441368143992 +15577885697730504027 +4148105506751406205 +11405928725072131729 +1575334543831888659 +15173190500771711224 +1873618501936418860 +14835085497997413739 +2527671765987700081 +10709931946762524080 +17472137226598428383 +16603709364419322519 +10381023484200760863 +16429648437962890412 +1306546687317928997 +18172096623373847689 +1873618458944616022 +1923876724 +9870725052986701 +4611016862399489497 +8060387810923269821 +8485238802855572492 +17259210455121606711 +13991673242949401216 +1414738730336280221 +17478309774690963594 +6045857703435392161 +12060386507164239707 +18301216972081072690 +16218854506495431400 +6927451950862434474 +13819035887288859 +1943289729317618759 +10645348200073153204 +9806799500870365292 +16253215886083361077 +32150372908938341 +6267983724862992113 +33560386137831096 +15289397345332831597 +12751507451654317390 +1252450728145476836 +18249294832564332712 +9181555677596945304 +881393336434832582 +5197675280937391160 +7139605593101894168 +5672976352757157536 +8393023341868508150 +14101052289539961 +2789363525781828595 +5726226353003051556 +14866552854313652382 +7032139168100996616 +100 +101 +102 diff --git a/morpheus/data/columns_ae.txt b/morpheus/data/columns_ae.txt index 94669cecf3..51c8ed6fd8 100644 --- a/morpheus/data/columns_ae.txt +++ b/morpheus/data/columns_ae.txt @@ -1,3 +1,33 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0283f9ca7e4436f5ff3ce1c3787bfe256c82cab3f869bef84d77e82c56f88195 -size 893 +eventSource +eventName +sourceIPAddress +userAgent +userIdentitytype +requestParametersroleArn +requestParametersroleSessionName +requestParametersdurationSeconds +responseElementsassumedRoleUserassumedRoleId +responseElementsassumedRoleUserarn +apiVersion +userIdentityprincipalId +userIdentityarn +userIdentityaccountId +userIdentityaccessKeyId +userIdentitysessionContextsessionIssuerprincipalId +userIdentitysessionContextsessionIssueruserName +tlsDetailsclientProvidedHostHeader +requestParametersownersSetitems +requestParametersmaxResults +requestParametersinstancesSetitems +errorCode +errorMessage +requestParametersmaxItems +responseElementsrequestId +responseElementsinstancesSetitems +requestParametersgroupSetitems +requestParametersinstanceType +requestParametersmonitoringenabled +requestParametersdisableApiTermination +requestParametersebsOptimized +responseElementsreservationId +requestParametersgroupName diff --git a/morpheus/data/columns_fil.txt b/morpheus/data/columns_fil.txt index 528feebb5a..219371d6cf 100644 --- a/morpheus/data/columns_fil.txt +++ b/morpheus/data/columns_fil.txt @@ -1,3 +1,29 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ae11fd26d9ee0e7e69d6e12bfa7f775aea824a49995bba6a528bfc13cef9942 -size 1303 +nvidia_smi_log.gpu.pci.tx_util +nvidia_smi_log.gpu.pci.rx_util +nvidia_smi_log.gpu.fb_memory_usage.used +nvidia_smi_log.gpu.fb_memory_usage.free +nvidia_smi_log.gpu.bar1_memory_usage.total +nvidia_smi_log.gpu.bar1_memory_usage.used +nvidia_smi_log.gpu.bar1_memory_usage.free +nvidia_smi_log.gpu.utilization.gpu_util +nvidia_smi_log.gpu.utilization.memory_util +nvidia_smi_log.gpu.temperature.gpu_temp +nvidia_smi_log.gpu.temperature.gpu_temp_max_threshold +nvidia_smi_log.gpu.temperature.gpu_temp_slow_threshold +nvidia_smi_log.gpu.temperature.gpu_temp_max_gpu_threshold +nvidia_smi_log.gpu.temperature.memory_temp +nvidia_smi_log.gpu.temperature.gpu_temp_max_mem_threshold +nvidia_smi_log.gpu.power_readings.power_draw +nvidia_smi_log.gpu.clocks.graphics_clock +nvidia_smi_log.gpu.clocks.sm_clock +nvidia_smi_log.gpu.clocks.mem_clock +nvidia_smi_log.gpu.clocks.video_clock +nvidia_smi_log.gpu.applications_clocks.graphics_clock +nvidia_smi_log.gpu.applications_clocks.mem_clock +nvidia_smi_log.gpu.default_applications_clocks.graphics_clock +nvidia_smi_log.gpu.default_applications_clocks.mem_clock +nvidia_smi_log.gpu.max_clocks.graphics_clock +nvidia_smi_log.gpu.max_clocks.sm_clock +nvidia_smi_log.gpu.max_clocks.mem_clock +nvidia_smi_log.gpu.max_clocks.video_clock +nvidia_smi_log.gpu.max_customer_boost_clocks.graphics_clock diff --git a/morpheus/data/labels_ae.txt b/morpheus/data/labels_ae.txt index 7f7a4ac17f..556a9f8435 100644 --- a/morpheus/data/labels_ae.txt +++ b/morpheus/data/labels_ae.txt @@ -1,3 +1 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f4e495adf016dbdce8aef1d7ab8876b3eba7369fc788d9953aa23ba228c383a -size 17 +ae_anomaly_score diff --git a/morpheus/data/labels_nlp.txt b/morpheus/data/labels_nlp.txt index d8152ce43d..8c85b1cd09 100644 --- a/morpheus/data/labels_nlp.txt +++ b/morpheus/data/labels_nlp.txt @@ -1,3 +1,10 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae118329a447774a985a57765e052525ae99b8a2e2a608c7f0fb13508474efee -size 85 +address +bank_acct +credit_card +email +govt_id +name +password +phone_num +secret_keys +user diff --git a/morpheus/data/labels_phishing.txt b/morpheus/data/labels_phishing.txt index aa02e5612d..8eeea320f8 100644 --- a/morpheus/data/labels_phishing.txt +++ b/morpheus/data/labels_phishing.txt @@ -1,3 +1,2 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e98b6049f69b1097a2aadb11b63040e69d82d3aa1224f429f2c28e238bf5170 -size 11 +score +pred diff --git a/scripts/fetch_data.py b/scripts/fetch_data.py index 2749c7f42b..917c1c29c2 100755 --- a/scripts/fetch_data.py +++ b/scripts/fetch_data.py @@ -34,7 +34,7 @@ def lfsPull(include_paths, poll_interval=0.1): """ Performs a git lfs pull. """ - cmd = 'git lfs pull -I "{}"'.format(','.join(include_paths)) + cmd = 'git lfs pull -X "" -I "{}"'.format(','.join(include_paths)) env = os.environ.copy() # Instruct git lfs to not supress progress output. Fetching the models can From df073495cf4c19e8268473c10cb69ebf0d39e4fd Mon Sep 17 00:00:00 2001 From: Michael Demoret <42954918+mdemoret-nv@users.noreply.github.com> Date: Wed, 29 Jun 2022 23:31:40 -0600 Subject: [PATCH 67/73] Fixing `to-kafka` Stage by Converting to a Pass Through Node (#245) Fixes #244 The kafka stage needs to be a pass through node. Authors: - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - David Gardner (https://github.com/dagardner-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/245 --- morpheus/stages/output/write_to_kafka_stage.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/morpheus/stages/output/write_to_kafka_stage.py b/morpheus/stages/output/write_to_kafka_stage.py index 6a04a69020..03b63c1a37 100644 --- a/morpheus/stages/output/write_to_kafka_stage.py +++ b/morpheus/stages/output/write_to_kafka_stage.py @@ -83,7 +83,7 @@ def node_fn(obs: srf.Observable, sub: srf.Subscriber): outstanding_requests = 0 - def on_next(x: typing.List[str]): + def on_next(x: MessageMeta): nonlocal outstanding_requests def cb(_, msg): @@ -138,4 +138,4 @@ def on_completed(): # node.launch_options.pe_count = self._max_concurrent # Return input unchanged - return input_stream + return node, input_stream[1] From 22ddb571716ca66cbdfdf2da525064967815d7d8 Mon Sep 17 00:00:00 2001 From: Michael Demoret <42954918+mdemoret-nv@users.noreply.github.com> Date: Thu, 30 Jun 2022 11:33:16 -0600 Subject: [PATCH 68/73] Pin Conda Package `cuda-python <=11.7.0` to Fix Conda Build (#252) The release of `cuda-python=11.7.1` has broken both the builds and the CI. See PR #246 which fixed the CI. This PR fixes the conda build. Issue #251 has been created to remove this dependency in the future. Fixes #250 Authors: - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - David Gardner (https://github.com/dagardner-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/252 --- ci/conda/recipes/morpheus/meta.yaml | 4 +++- docker/conda/environments/cuda11.5_dev.yml | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ci/conda/recipes/morpheus/meta.yaml b/ci/conda/recipes/morpheus/meta.yaml index b870c7693f..9c7ade175a 100644 --- a/ci/conda/recipes/morpheus/meta.yaml +++ b/ci/conda/recipes/morpheus/meta.yaml @@ -55,19 +55,21 @@ outputs: - ccache - ninja host: + - cuda-python <=11.7.0 # Remove when Issue #251 is closed - cudf {{ rapids_version }} - cython >=0.29,<0.30 - libcudf {{ rapids_version }} - librdkafka 1.7 - - srf {{ minor_version }} - pip - pybind11-stubgen - python {{ python }} - rapidjson 1.1 - scikit-build >=0.12 + - srf {{ minor_version }} - versioneer-518 run: - click >=8 + - cuda-python <=11.7.0 # Remove when Issue #251 is closed - cudf {{ rapids_version }} - cudf_kafka {{ rapids_version }} - cupy # Version determined from cudf diff --git a/docker/conda/environments/cuda11.5_dev.yml b/docker/conda/environments/cuda11.5_dev.yml index 3a640f79c8..dbc8575be9 100644 --- a/docker/conda/environments/cuda11.5_dev.yml +++ b/docker/conda/environments/cuda11.5_dev.yml @@ -29,7 +29,7 @@ dependencies: - ccache>=3.7 - cmake=3.22 - cuda-nvml-dev=11.5 - - cuda-python<=11.7.0 # 11.7.1 Breaks the cuda bindings + - cuda-python<=11.7.0 # Remove when Issue #251 is closed - cudatoolkit=11.5 - cudf 22.06 - cudf_kafka 22.06.* From 0030a1d5d03e7041de51fc2b2f7bcd9578097ce2 Mon Sep 17 00:00:00 2001 From: Michael Demoret <42954918+mdemoret-nv@users.noreply.github.com> Date: Thu, 30 Jun 2022 13:43:47 -0600 Subject: [PATCH 69/73] Fix 22.06 style checks (#249) Fixes style checks preventing #237 from passing Authors: - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - https://github.com/raykallen - David Gardner (https://github.com/dagardner-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/249 --- ci/scripts/gitutils.py | 4 +- docs/source/conf.py | 11 +- models/mlflow/docker/Dockerfile | 15 +++ models/mlflow/docker/entrypoint.sh | 14 +++ .../fraud-detection-models/HinSAGE.py | 2 +- .../hammah-models/hammah-20211017-script.py | 75 +++++++++--- .../binary_sequence_classifier.py | 39 +++++-- .../phish-bert-20211006-script.py | 45 ++++--- .../phishing-models/sequence_classifier.py | 72 +++++++----- .../abp-models/abp-inference.py | 54 +++++---- .../fraud-detection-models/inference.py | 56 +++++---- .../hammah-models/hammah-inference.py | 110 ++++++++++-------- .../hammah-models/requirements.txt | 1 - .../log-parsing-inference.py | 82 ++++++------- .../phish-bert-20220113-inference-script.py | 71 ++++++----- .../morpheus/objects/triton_in_out.hpp | 48 +++++--- .../_lib/include/nvtext/subword_tokenize.hpp | 105 ++++++++--------- tests/mock_triton_server/config.yml | 15 +++ 18 files changed, 500 insertions(+), 319 deletions(-) diff --git a/ci/scripts/gitutils.py b/ci/scripts/gitutils.py index 034584d728..59cfe11b30 100755 --- a/ci/scripts/gitutils.py +++ b/ci/scripts/gitutils.py @@ -308,9 +308,7 @@ def get_merge_target(): def parse_args(): argparser = argparse.ArgumentParser("Executes a gitutil action") - argparser.add_argument("action", - choices=['get_merge_target'], - help="Action to execute") + argparser.add_argument("action", choices=['get_merge_target'], help="Action to execute") args = argparser.parse_args() return args diff --git a/docs/source/conf.py b/docs/source/conf.py index a4443d4b49..30ea9a0567 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -83,10 +83,10 @@ 'sphinx.ext.linkcode', ] -## Include Python objects as they appear in source files -## Default: alphabetically ('alphabetical') +# Include Python objects as they appear in source files +# Default: alphabetically ('alphabetical') # autodoc_member_order = 'groupwise' -## Default flags used by autodoc directives +# Default flags used by autodoc directives # autodoc_default_options = { # 'members': True, # 'show-inheritance': True, @@ -145,7 +145,7 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -#html_theme = 'alabaster' +# html_theme = 'alabaster' html_theme = "sphinx_rtd_theme" # Theme options are theme-specific and customize the look and feel of a theme @@ -157,8 +157,7 @@ html_theme_options = { 'logo_only': True, 'display_version': True, - 'style_nav_header_background': '#000000', - # Toc options + 'style_nav_header_background': '#000000', # Toc options 'collapse_navigation': False, 'navigation_depth': 6, } diff --git a/models/mlflow/docker/Dockerfile b/models/mlflow/docker/Dockerfile index 92a091603d..404e8f5df4 100644 --- a/models/mlflow/docker/Dockerfile +++ b/models/mlflow/docker/Dockerfile @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + ARG FROM_IMAGE=gpuci/miniforge-cuda ARG CUDA_VER=11.4 ARG LINUX_VER=ubuntu20.04 diff --git a/models/mlflow/docker/entrypoint.sh b/models/mlflow/docker/entrypoint.sh index 69153938c5..55b889d521 100755 --- a/models/mlflow/docker/entrypoint.sh +++ b/models/mlflow/docker/entrypoint.sh @@ -1,4 +1,18 @@ #!/bin/bash --login +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. # Activate the `mlflow` conda environment. . /opt/conda/etc/profile.d/conda.sh diff --git a/models/training-tuning-scripts/fraud-detection-models/HinSAGE.py b/models/training-tuning-scripts/fraud-detection-models/HinSAGE.py index 4f294742b5..4844431896 100644 --- a/models/training-tuning-scripts/fraud-detection-models/HinSAGE.py +++ b/models/training-tuning-scripts/fraud-detection-models/HinSAGE.py @@ -13,13 +13,13 @@ # See the License for the specific language governing permissions and # limitations under the License. +import pandas as pd from stellargraph.layer import HinSAGE from stellargraph.mapper import HinSAGENodeGenerator from tensorflow.keras import Model from tensorflow.keras import layers from tensorflow.keras import optimizers from tensorflow.keras.losses import binary_crossentropy -import pandas as pd class HinSAGE_Representation_Learner: diff --git a/models/training-tuning-scripts/hammah-models/hammah-20211017-script.py b/models/training-tuning-scripts/hammah-models/hammah-20211017-script.py index 75aac9d62a..b40c35e1e7 100644 --- a/models/training-tuning-scripts/hammah-models/hammah-20211017-script.py +++ b/models/training-tuning-scripts/hammah-models/hammah-20211017-script.py @@ -1,28 +1,72 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. """ Example Usage: python hammah-20211017-script.py \ --trainingdata "../datasets/training-data/hammah-user123-training-data.csv"\ - --valdata "../datasets/validation-data/hammah-user123-validation-data.csv" + --valdata "../datasets/validation-data/hammah-user123-validation-data.csv" """ +import argparse -import pandas as pd -import os +import dill import numpy as np -import glob +import pandas as pd import torch from dfencoder import AutoEncoder -import matplotlib.pyplot as plt -import argparse -import dill def main(): X_train = pd.read_csv(args.trainingdata) X_val = pd.read_csv(args.valdata) - - features=['eventSource', 'eventName', 'sourceIPAddress', 'userAgent','userIdentitytype', 'requestParametersroleArn', 'requestParametersroleSessionName','requestParametersdurationSeconds', 'responseElementsassumedRoleUserassumedRoleId','responseElementsassumedRoleUserarn', 'apiVersion', 'userIdentityprincipalId','userIdentityarn', 'userIdentityaccountId', 'userIdentityaccessKeyId','userIdentitysessionContextsessionIssuerprincipalId', 'userIdentitysessionContextsessionIssueruserName','tlsDetailsclientProvidedHostHeader', 'requestParametersownersSetitems','requestParametersmaxResults', 'requestParametersinstancesSetitems','errorCode', 'errorMessage', 'requestParametersmaxItems','responseElementsrequestId', 'responseElementsinstancesSetitems','requestParametersgroupSetitems', 'requestParametersinstanceType','requestParametersmonitoringenabled', 'requestParametersdisableApiTermination','requestParametersebsOptimized', 'responseElementsreservationId', 'requestParametersgroupName'] #NO userIdentitysessionContextsessionIssuerarn,userIdentityuserName + features = [ + 'eventSource', + 'eventName', + 'sourceIPAddress', + 'userAgent', + 'userIdentitytype', + 'requestParametersroleArn', + 'requestParametersroleSessionName', + 'requestParametersdurationSeconds', + 'responseElementsassumedRoleUserassumedRoleId', + 'responseElementsassumedRoleUserarn', + 'apiVersion', + 'userIdentityprincipalId', + 'userIdentityarn', + 'userIdentityaccountId', + 'userIdentityaccessKeyId', + 'userIdentitysessionContextsessionIssuerprincipalId', + 'userIdentitysessionContextsessionIssueruserName', + 'tlsDetailsclientProvidedHostHeader', + 'requestParametersownersSetitems', + 'requestParametersmaxResults', + 'requestParametersinstancesSetitems', + 'errorCode', + 'errorMessage', + 'requestParametersmaxItems', + 'responseElementsrequestId', + 'responseElementsinstancesSetitems', + 'requestParametersgroupSetitems', + 'requestParametersinstanceType', + 'requestParametersmonitoringenabled', + 'requestParametersdisableApiTermination', + 'requestParametersebsOptimized', + 'responseElementsreservationId', + 'requestParametersgroupName' + ] # NO userIdentitysessionContextsessionIssuerarn,userIdentityuserName for i in list(X_train): if i not in features: X_train = X_train.drop(i, axis=1) @@ -30,9 +74,6 @@ def main(): if i not in features: X_val = X_val.drop(i, axis=1) - - - X_train = X_train.dropna(axis=1, how='all') X_val = X_val.dropna(axis=1, how='all') @@ -64,18 +105,16 @@ def main(): model.fit(X_train, epochs=25, val=X_val) - torch.save(model.state_dict(), args.trainingdata[:-4]+".pkl") - with open(args.trainingdata[:-4]+'dill'+'.pkl', 'wb') as f: + torch.save(model.state_dict(), args.trainingdata[:-4] + ".pkl") + with open(args.trainingdata[:-4] + 'dill' + '.pkl', 'wb') as f: serialized_model = dill.dumps(model) f.write(serialized_model) if __name__ == "__main__": parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--trainingdata", required=True, - help="CloudTrail CSV") - parser.add_argument("--valdata", required=True, - help="CloudTrail CSV") + parser.add_argument("--trainingdata", required=True, help="CloudTrail CSV") + parser.add_argument("--valdata", required=True, help="CloudTrail CSV") args = parser.parse_args() main() diff --git a/models/training-tuning-scripts/phishing-models/binary_sequence_classifier.py b/models/training-tuning-scripts/phishing-models/binary_sequence_classifier.py index 4e8d34991e..ed087ad983 100644 --- a/models/training-tuning-scripts/phishing-models/binary_sequence_classifier.py +++ b/models/training-tuning-scripts/phishing-models/binary_sequence_classifier.py @@ -1,21 +1,38 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + import logging -import cudf -from cudf.core.subword_tokenizer import SubwordTokenizer import torch import torch.nn as nn -from torch.utils.dlpack import to_dlpack -from sequence_classifier import SequenceClassifier from dataloader import DataLoader from dataset import Dataset +from sequence_classifier import SequenceClassifier +from torch.utils.dlpack import to_dlpack from transformers import AutoModelForSequenceClassification +import cudf +from cudf.core.subword_tokenizer import SubwordTokenizer + log = logging.getLogger(__name__) class BinarySequenceClassifier(SequenceClassifier): """ - Sequence Classifier using BERT. This class provides methods for training/loading BERT models, evaluation and prediction. + Sequence Classifier using BERT. This class provides methods for training/loading BERT models, evaluation and + prediction. """ def init_model(self, model_or_path): @@ -51,7 +68,9 @@ def predict(self, input_data, max_seq_len=128, batch_size=32, threshold=0.5): :param input_data: input text data for prediction :type input_data: cudf.Series - :param max_seq_len: Limits the length of the sequence returned by tokenizer. If tokenized sentence is shorter than max_seq_len, output will be padded with 0s. If the tokenized sentence is longer than max_seq_len it will be truncated to max_seq_len. + :param max_seq_len: Limits the length of the sequence returned by tokenizer. If tokenized sentence is shorter + than max_seq_len, output will be padded with 0s. If the tokenized sentence is longer than max_seq_len it + will be truncated to max_seq_len. :type max_seq_len: int :param batch_size: batch size :type batch_size: int @@ -63,7 +82,9 @@ def predict(self, input_data, max_seq_len=128, batch_size=32, threshold=0.5): Examples -------- >>> from cuml.preprocessing.model_selection import train_test_split - >>> emails_train, emails_test, labels_train, labels_test = train_test_split(train_emails_df, 'label', train_size=0.8) + >>> emails_train, emails_test, labels_train, labels_test = train_test_split(train_emails_df, + 'label', + train_size=0.8) >>> sc.train_model(emails_train, labels_train) >>> predictions = sc.predict(emails_test, threshold=0.8) """ @@ -81,9 +102,7 @@ def predict(self, input_data, max_seq_len=128, batch_size=32, threshold=0.5): for df in predict_dataloader.get_chunks(): b_input_ids, b_input_mask = self._bert_uncased_tokenize(df["text"], max_seq_len) with torch.no_grad(): - logits = self._model( - b_input_ids, token_type_ids=None, attention_mask=b_input_mask - )[0] + logits = self._model(b_input_ids, token_type_ids=None, attention_mask=b_input_mask)[0] b_probs = torch.sigmoid(logits[:, 1]) b_preds = b_probs.ge(threshold) diff --git a/models/training-tuning-scripts/phishing-models/phish-bert-20211006-script.py b/models/training-tuning-scripts/phishing-models/phish-bert-20211006-script.py index 98b4596470..dcbede23b1 100644 --- a/models/training-tuning-scripts/phishing-models/phish-bert-20211006-script.py +++ b/models/training-tuning-scripts/phishing-models/phish-bert-20211006-script.py @@ -1,12 +1,29 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. """ Example Usage: python phish-bert-20211006-script.py """ -import cudf; -from sklearn.model_selection import train_test_split; -from binary_sequence_classifier import BinarySequenceClassifier; -import s3fs; -from os import path; +from os import path + +import s3fs +from binary_sequence_classifier import BinarySequenceClassifier +from sklearn.model_selection import train_test_split + +import cudf + def preprocessing(): CLAIR_TSV = "Phishing_Dataset_Clair_Collection.tsv" @@ -21,16 +38,16 @@ def preprocessing(): if not path.exists(CLAIR_TSV): fs = s3fs.S3FileSystem(anon=True) fs.get(S3_BASE_PATH + "/" + CLAIR_TSV, CLAIR_TSV) - + dfclair = cudf.read_csv(CLAIR_TSV, delimiter='\t', header=None, names=['label', 'email']).dropna() # Phishing emails of the SPAM ASSASSIN dataset if not path.exists(SPAM_TSV): fs = s3fs.S3FileSystem(anon=True) fs.get(S3_BASE_PATH + "/" + SPAM_TSV, SPAM_TSV) - + dfspam = cudf.read_csv(SPAM_TSV, delimiter='\t', header=None, names=['label', 'email']) - + # Benign emails of the SPAM ASSASSIN dataset if not path.exists(EASY_HAM_TSV): fs = s3fs.S3FileSystem(anon=True) @@ -50,19 +67,16 @@ def preprocessing(): fs.get(S3_BASE_PATH + "/" + ENRON_TSV, ENRON_TSV) dfenron = cudf.read_csv(ENRON_TSV, delimiter='\t', header=None, names=['label', 'email']) - + df_total = cudf.concat([dfhardham, dfeasyham, dfspam, dfclair, dfenron], ignore_index=True) X_train, X_test, y_train, y_test = train_test_split(df_total, df_total['label'], train_size=0.8) - return(X_train, y_train, X_test, y_test) - + return (X_train, y_train, X_test, y_test) def main(): - - X_train, y_train, X_test, y_test=preprocessing() - + X_train, y_train, X_test, y_test = preprocessing() print("Model Loading...") seq_classifier = BinarySequenceClassifier() @@ -73,11 +87,10 @@ def main(): print("Saving Model") seq_classifier.save_model("./phish-bert-20211006") - + print("Model Evaluation") print("Accuracy:") print(seq_classifier.evaluate_model(X_test["email"], y_test)) main() - diff --git a/models/training-tuning-scripts/phishing-models/sequence_classifier.py b/models/training-tuning-scripts/phishing-models/sequence_classifier.py index 108ee19469..78a57ce09e 100644 --- a/models/training-tuning-scripts/phishing-models/sequence_classifier.py +++ b/models/training-tuning-scripts/phishing-models/sequence_classifier.py @@ -1,8 +1,22 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + import logging import os - -import cudf -from cudf.core.subword_tokenizer import SubwordTokenizer +from abc import ABC +from abc import abstractmethod import cupy import torch @@ -11,14 +25,17 @@ from torch.utils.dlpack import to_dlpack from tqdm import trange from transformers import AdamW -from abc import ABC, abstractmethod + +import cudf +from cudf.core.subword_tokenizer import SubwordTokenizer log = logging.getLogger(__name__) class SequenceClassifier(ABC): """ - Sequence Classifier using BERT. This class provides methods for training/loading BERT models, evaluation and prediction. + Sequence Classifier using BERT. This class provides methods for training/loading BERT models, evaluation and + prediction. """ def __init__(self): @@ -49,7 +66,9 @@ def train_model( :type labels: cudf.Series :param learning_rate: learning rate :type learning_rate: float - :param max_seq_len: Limits the length of the sequence returned by tokenizer. If tokenized sentence is shorter than max_seq_len, output will be padded with 0s. If the tokenized sentence is longer than max_seq_len it will be truncated to max_seq_len. + :param max_seq_len: Limits the length of the sequence returned by tokenizer. If tokenized sentence is shorter + than max_seq_len, output will be padded with 0s. If the tokenized sentence is longer than max_seq_len it + will be truncated to max_seq_len. :type max_seq_len: int :param batch_size: batch size :type batch_size: int @@ -59,7 +78,9 @@ def train_model( Examples -------- >>> from cuml.preprocessing.model_selection import train_test_split - >>> emails_train, emails_test, labels_train, labels_test = train_test_split(train_emails_df, 'label', train_size=0.8) + >>> emails_train, emails_test, labels_train, labels_test = train_test_split(train_emails_df, + 'label', + train_size=0.8) >>> sc.train_model(emails_train, labels_train) """ train_gdf = cudf.DataFrame() @@ -74,14 +95,15 @@ def train_model( self._tokenizer = SubwordTokenizer(self._hashpath, do_lower_case=True) for _ in trange(epochs, desc="Epoch"): - tr_loss = 0 # Tracking variables + tr_loss = 0 # Tracking variables nb_tr_examples, nb_tr_steps = 0, 0 for df in train_dataloader.get_chunks(): b_input_ids, b_input_mask = self._bert_uncased_tokenize(df["text"], max_seq_len) b_labels = torch.tensor(df["label"].to_array()) self._optimizer.zero_grad() # Clear out the gradients - loss = self._model(b_input_ids, token_type_ids=None, attention_mask=b_input_mask, labels=b_labels)[0] # forwardpass + # forwardpass + loss = self._model(b_input_ids, token_type_ids=None, attention_mask=b_input_mask, labels=b_labels)[0] loss.sum().backward() self._optimizer.step() # update parameters @@ -99,7 +121,9 @@ def evaluate_model(self, test_data, labels, max_seq_len=128, batch_size=32): :type test_data: cudf.Series :param labels: labels for each element in test_data :type labels: cudf.Series - :param max_seq_len: Limits the length of the sequence returned by tokenizer. If tokenized sentence is shorter than max_seq_len, output will be padded with 0s. If the tokenized sentence is longer than max_seq_len it will be truncated to max_seq_len. + :param max_seq_len: Limits the length of the sequence returned by tokenizer. If tokenized sentence is shorter + than max_seq_len, output will be padded with 0s. If the tokenized sentence is longer than max_seq_len it + will be truncated to max_seq_len. :type max_seq_len: int :param batch_size: batch size :type batch_size: int @@ -107,7 +131,9 @@ def evaluate_model(self, test_data, labels, max_seq_len=128, batch_size=32): Examples -------- >>> from cuml.preprocessing.model_selection import train_test_split - >>> emails_train, emails_test, labels_train, labels_test = train_test_split(train_emails_df, 'label', train_size=0.8) + >>> emails_train, emails_test, labels_train, labels_test = train_test_split(train_emails_df, + 'label', + train_size=0.8) >>> sc.evaluate_model(emails_test, labels_test) """ self._model.eval() @@ -124,9 +150,7 @@ def evaluate_model(self, test_data, labels, max_seq_len=128, batch_size=32): b_input_ids, b_input_mask = self._bert_uncased_tokenize(df["text"], max_seq_len) b_labels = torch.tensor(df["label"].to_array()) with torch.no_grad(): - logits = self._model( - b_input_ids, token_type_ids=None, attention_mask=b_input_mask - )[0] + logits = self._model(b_input_ids, token_type_ids=None, attention_mask=b_input_mask)[0] logits = logits.type(torch.DoubleTensor).to(self._device) logits = cupy.fromDlpack(to_dlpack(logits)) @@ -151,7 +175,9 @@ def save_model(self, save_to_path="."): Examples -------- >>> from cuml.preprocessing.model_selection import train_test_split - >>> emails_train, emails_test, labels_train, labels_test = train_test_split(train_emails_df, 'label', train_size=0.8) + >>> emails_train, emails_test, labels_train, labels_test = train_test_split(train_emails_df, + 'label', + train_size=0.8) >>> sc.train_model(emails_train, labels_train) >>> sc.save_model() """ @@ -172,9 +198,7 @@ def save_checkpoint(self, file_path): >>> sc.save_checkpoint(PATH) """ - checkpoint = { - "state_dict": self._model.module.state_dict() - } + checkpoint = {"state_dict": self._model.module.state_dict()} torch.save(checkpoint, file_path) def load_checkpoint(self, file_path): @@ -194,9 +218,7 @@ def load_checkpoint(self, file_path): self._model.module.load_state_dict(model_dict["state_dict"]) def _get_hash_table_path(self): - hash_table_path = "%s/resources/bert-base-uncased-hash.txt" % os.path.dirname( - os.path.realpath(__file__) - ) + hash_table_path = "%s/resources/bert-base-uncased-hash.txt" % os.path.dirname(os.path.realpath(__file__)) return hash_table_path def _config_optimizer(self, learning_rate): @@ -204,15 +226,11 @@ def _config_optimizer(self, learning_rate): no_decay = ["bias", "gamma", "beta"] optimizer_grouped_parameters = [ { - "params": [ - p for n, p in param_optimizer if not any(nd in n for nd in no_decay) - ], + "params": [p for n, p in param_optimizer if not any(nd in n for nd in no_decay)], "weight_decay_rate": 0.01, }, { - "params": [ - p for n, p in param_optimizer if any(nd in n for nd in no_decay) - ], + "params": [p for n, p in param_optimizer if any(nd in n for nd in no_decay)], "weight_decay_rate": 0.0, }, ] diff --git a/models/validation-inference-scripts/abp-models/abp-inference.py b/models/validation-inference-scripts/abp-models/abp-inference.py index 3877c30050..26382ac785 100644 --- a/models/validation-inference-scripts/abp-models/abp-inference.py +++ b/models/validation-inference-scripts/abp-models/abp-inference.py @@ -1,31 +1,42 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. """ Example Usage: -python abp-inference.py --validationdata abp-validation-data.jsonlines --model abp-nvsmi-xgb-20210310.bst --output abp-validation-output.jsonlines +python abp-inference.py \ + --validationdata abp-validation-data.jsonlines \ + --model abp-nvsmi-xgb-20210310.bst \ + --output abp-validation-output.jsonlines """ +import argparse +import json -import xgboost as xgb import cudf -import json from cuml import ForestInference -import sklearn.datasets -import cupy -from sklearn.metrics import accuracy_score -import argparse -def infer(validationdata,model,output): - +def infer(validationdata, model, output): + data = [] with open(validationdata) as f: for line in f: data.append(json.loads(line)) - df = cudf.DataFrame(data) - - df2=df.drop(['nvidia_smi_log.timestamp','mining'],axis=1) + df2 = df.drop(['nvidia_smi_log.timestamp', 'mining'], axis=1) # Load the classifier previously saved with xgboost model_save() model_path = model @@ -36,30 +47,23 @@ def infer(validationdata,model,output): y_pred = fil_preds_gpu.to_array() - df2['mining']=y_pred.astype(bool) - - df2.insert(0,'nvidia_smi_log.timestamp',df['nvidia_smi_log.timestamp']) - - - df2.to_json(output,orient='records', lines=True) - - + df2['mining'] = y_pred.astype(bool) + df2.insert(0, 'nvidia_smi_log.timestamp', df['nvidia_smi_log.timestamp']) + df2.to_json(output, orient='records', lines=True) def main(): - infer(args.validationdata,args.model,args.output) - + infer(args.validationdata, args.model, args.output) + - if __name__ == "__main__": parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--validationdata", required=True,help="Labelled data in JSON format") + parser.add_argument("--validationdata", required=True, help="Labelled data in JSON format") parser.add_argument("--model", required=True, help="trained model") parser.add_argument("--output", required=True, help="output filename") args = parser.parse_args() main() - diff --git a/models/validation-inference-scripts/fraud-detection-models/inference.py b/models/validation-inference-scripts/fraud-detection-models/inference.py index b15c0dbe59..133ce8a4fe 100644 --- a/models/validation-inference-scripts/fraud-detection-models/inference.py +++ b/models/validation-inference-scripts/fraud-detection-models/inference.py @@ -1,22 +1,32 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. """ Example Usage: python inference.py --graph-data ../../datasets/training-data/fraud-detection-training-data.csv \ - --validation-data ../../datasets/validation-data/fraud-detection-validation-data.csv \ - --model-xgb model/xgb-model.pt --model-hinsage model/hinsage-model.pt --output out.txt + --validation-data ../../datasets/validation-data/fraud-detection-validation-data.csv \ + --model-xgb model/xgb-model.pt --model-hinsage model/hinsage-model.pt --output out.txt """ import argparse import networkx as nx -import numpy as np import pandas as pd import tensorflow as tf -import xgboost as xgb -from sklearn.metrics import f1_score from stellargraph import StellarGraph -from stellargraph.layer import HinSAGE from stellargraph.mapper import HinSAGENodeGenerator -import cudf + from cuml import ForestInference @@ -32,41 +42,43 @@ def graph_construction(nodes, edges, node_features): return StellarGraph(g_nx, node_type_name="ntype", node_features=node_features) + def build_graph_features(dataset): # Train data - transaction_node_data = dataset.drop(["client_node","merchant_node","fraud_label", "index"], axis=1) - client_node_data = pd.DataFrame([1]*len(dataset.client_node.unique())).set_index(dataset.client_node.unique()) - merchant_node_data = pd.DataFrame([1]*len(dataset.merchant_node.unique())).set_index(dataset.merchant_node.unique()) + transaction_node_data = dataset.drop(["client_node", "merchant_node", "fraud_label", "index"], axis=1) + client_node_data = pd.DataFrame([1] * len(dataset.client_node.unique())).set_index(dataset.client_node.unique()) + merchant_node_data = pd.DataFrame([1] * len(dataset.merchant_node.unique())).set_index( + dataset.merchant_node.unique()) - nodes = {"client":dataset.client_node, "merchant":dataset.merchant_node, "transaction":dataset.index} - edges = [zip(dataset.client_node, dataset.index),zip(dataset.merchant_node, dataset.index)] + nodes = {"client": dataset.client_node, "merchant": dataset.merchant_node, "transaction": dataset.index} + edges = [zip(dataset.client_node, dataset.index), zip(dataset.merchant_node, dataset.index)] features = {"transaction": transaction_node_data, 'client': client_node_data, 'merchant': merchant_node_data} - graph = graph_construction(nodes, edges, features) #GraphConstruction(nodes, edges, features) - #S = graph.get_stellargraph() + graph = graph_construction(nodes, edges, features) # GraphConstruction(nodes, edges, features) + # S = graph.get_stellargraph() return graph def inductive_step_hinsage(S, trained_model, inductive_node_identifiers, batch_size): # perform inductive learning from trained graph model - num_samples = [2,32] + num_samples = [2, 32] # The mapper feeds data from sampled subgraph to HinSAGE model generator = HinSAGENodeGenerator(S, batch_size, num_samples, head_node_type="transaction") - test_gen_not_shuffled = generator.flow(inductive_node_identifiers, shuffle=False ) + test_gen_not_shuffled = generator.flow(inductive_node_identifiers, shuffle=False) inductive_emb = trained_model.predict(test_gen_not_shuffled, verbose=1) inductive_emb = pd.DataFrame(inductive_emb, index=inductive_node_identifiers) return inductive_emb + def infer(model_xgb, model_hinsage, graph_data, node_identifier, output): # Build graph structure. graph = build_graph_features(graph_data) - # Load XGBoost & GraphSAGE model xgb_model = ForestInference.load(model_xgb, output_class=True) hgs_model = tf.keras.models.load_model(model_hinsage) @@ -74,7 +86,7 @@ def infer(model_xgb, model_hinsage, graph_data, node_identifier, output): inductive_embedding = inductive_step_hinsage(graph, hgs_model, node_identifier, batch_size=5) # prediction - prediction = xgb_model.predict_proba(inductive_embedding)[:,1] + prediction = xgb_model.predict_proba(inductive_embedding)[:, 1] result = pd.DataFrame(node_identifier, columns=['node_id']) result['prediction'] = prediction result.to_csv(output, index=False) @@ -87,12 +99,16 @@ def main(): graph_data = pd.concat([graph_data, val_data]) graph_data = graph_data.set_index(graph_data['index']) - infer(args.model_xgb, args.model_hinsage, graph_data=graph_data, node_identifier=list(val_data['index']), output=args.output) + infer(args.model_xgb, + args.model_hinsage, + graph_data=graph_data, + node_identifier=list(val_data['index']), + output=args.output) if __name__ == "__main__": parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--validation-data", required=False,help="Labelled data in CSV format") + parser.add_argument("--validation-data", required=False, help="Labelled data in CSV format") parser.add_argument("--model-hinsage", required=True, help="trained hinsage model") parser.add_argument("--model-xgb", required=True, help="trained xgb model") parser.add_argument("--graph-data", help="Training dataset for graph structure", required=True) diff --git a/models/validation-inference-scripts/hammah-models/hammah-inference.py b/models/validation-inference-scripts/hammah-models/hammah-inference.py index 4e887c6051..7663a421eb 100644 --- a/models/validation-inference-scripts/hammah-models/hammah-inference.py +++ b/models/validation-inference-scripts/hammah-models/hammah-inference.py @@ -1,34 +1,38 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. """ Example Usage: -python hammah-inference.py --validationdata hammah-user123-validation-data.csv --model hammah-user123-20211017-dill.pkl --output abp-validation-output.csv +python hammah-inference.py \ + --validationdata hammah-user123-validation-data.csv \ + --model hammah-user123-20211017-dill.pkl \ + --output abp-validation-output.csv """ -import pandas as pd -import os -import numpy as np -import glob -import torch -from dfencoder import AutoEncoder -import matplotlib.pyplot as plt -from sklearn.metrics import f1_score -from sklearn.metrics import confusion_matrix -import dill import argparse -import json -#from pandas import json_normalize -from pandas.io.json import json_normalize -import cudf import datetime -import cupy as cp -from clx.analytics.stats import rzscore -import clx.analytics.periodicity_detection as pdd +import clx.analytics.periodicity_detection as pdd +import cupy as cp +import dill +import pandas as pd +import cudf +def infer(validationdata, model, output): -def infer(validationdata,model,output): - def zscore(data): mu = cp.mean(data) std = cp.std(data) @@ -40,82 +44,86 @@ def date2min(time): return int(timesince.total_seconds() // 60) form = "%Y-%m-%dT%H:%M:%SZ" + def stript(s): obj = datetime.datetime.strptime(s, form) return obj def back_to_string(obj): return "{}-{}:{}:{}".format(f"{obj.month:02}", f"{obj.day:02}", f"{obj.hour:02}", f"{obj.minute:02}") - - - - - - - - - X_val=pd.read_csv(validationdata) - - - col_list=['userIdentityaccountId','eventSource','eventName','sourceIPAddress','userAgent','userIdentitytype','apiVersion', 'userIdentityprincipalId', 'userIdentityarn', 'userIdentityaccessKeyId', 'tlsDetailsclientProvidedHostHeader', 'errorCode','errorMessage','userIdentitysessionContextsessionIssueruserName'] + X_val = pd.read_csv(validationdata) + + col_list = [ + 'userIdentityaccountId', + 'eventSource', + 'eventName', + 'sourceIPAddress', + 'userAgent', + 'userIdentitytype', + 'apiVersion', + 'userIdentityprincipalId', + 'userIdentityarn', + 'userIdentityaccessKeyId', + 'tlsDetailsclientProvidedHostHeader', + 'errorCode', + 'errorMessage', + 'userIdentitysessionContextsessionIssueruserName' + ] for i in list(X_val): if i not in col_list: - X_val=X_val.drop(i,axis=1) + X_val = X_val.drop(i, axis=1) with open(model, 'rb') as f: - model = dill.load(f) + model = dill.load(f) scores = model.get_anomaly_score(X_val) X_val['ae_anomaly_score'] = scores X_val.sort_values('ae_anomaly_score', ascending=False).head(10) - #since inference is done, add the original columns back so the output will be the same as the input format - #X_val['ts_anomaly']=X_val_original['ts_anomaly'] + # since inference is done, add the original columns back so the output will be the same as the input format + # X_val['ts_anomaly']=X_val_original['ts_anomaly'] df = cudf.read_csv("hammah-user123-validation-data.csv") df = df.sort_values(by=['eventTime']) timearr = df.eventTime.to_array() START = stript(timearr[0]) - END = stript(timearr[-1]) timeobj = list(map(stript, timearr)) hs = list(map(date2min, timeobj)) - n, bins = cp.histogram(cp.array(hs), bins = cp.arange(0, max(hs))) + n, _ = cp.histogram(cp.array(hs), bins=cp.arange(0, max(hs))) signal = cudf.Series(n) a = cp.fromDlpack(signal.to_dlpack()) periodogram = pdd.to_periodogram(signal) - periodogram = periodogram[:int((len(signal)/2))] + periodogram = periodogram[:int((len(signal) / 2))] threshold = float(cp.percentile(cp.array(periodogram), 90)) indices = cudf.Series(cp.arange(len(periodogram)))[periodogram < threshold].to_array() - rft= cp.fft.rfft(a) + rft = cp.fft.rfft(a) rft[indices] = 0 recon = cp.fft.irfft(rft) - err=(abs(recon-a)) + err = (abs(recon - a)) z = zscore(err) indices = cudf.Series(cp.arange(len(z)))[z >= 8].to_array() - strlist=[] + strlist = [] for mins in indices: from_start = START + datetime.timedelta(minutes=int(mins)) strlist.append(back_to_string(from_start)) df['ts_anomaly'] = False for i in strlist: df['ts_anomaly'] = df['eventTime'].str.contains(i) - X_val_original=X_val - X_val.insert(0, 'eventID',X_val.index) - X_val.insert(0, '',X_val.index) - X_val['ts_anomaly']=df['ts_anomaly'].to_pandas() - X_val.to_csv(output,index=False) + X_val.insert(0, 'eventID', X_val.index) + X_val.insert(0, '', X_val.index) + X_val['ts_anomaly'] = df['ts_anomaly'].to_pandas() + X_val.to_csv(output, index=False) def main(): - infer(args.validationdata,args.model,args.output) - + infer(args.validationdata, args.model, args.output) + - if __name__ == "__main__": parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--validationdata", required=True,help="Labelled data in JSON format") + parser.add_argument("--validationdata", required=True, help="Labelled data in JSON format") parser.add_argument("--model", required=True, help="trained model") parser.add_argument("--output", required=True, help="output filename") args = parser.parse_args() diff --git a/models/validation-inference-scripts/hammah-models/requirements.txt b/models/validation-inference-scripts/hammah-models/requirements.txt index e1afbc1113..773dae4edf 100644 --- a/models/validation-inference-scripts/hammah-models/requirements.txt +++ b/models/validation-inference-scripts/hammah-models/requirements.txt @@ -1,5 +1,4 @@ clx==0.0.1 -cudf==0+untagged.1.g788bddd cupy==9.1.0 dfencoder==0.0.35 dill==0.3.4 diff --git a/models/validation-inference-scripts/log-parsing-models/log-parsing-inference.py b/models/validation-inference-scripts/log-parsing-models/log-parsing-inference.py index 43fb16b26a..551b4c9b97 100644 --- a/models/validation-inference-scripts/log-parsing-models/log-parsing-inference.py +++ b/models/validation-inference-scripts/log-parsing-models/log-parsing-inference.py @@ -1,31 +1,46 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. """ Using a BERT model to parse raw logs into jsons. Example Usage: -python log-parsing-inference.py - --inputdata ../../datasets/validation-data/log-parsing-validation-data-input.csv - --modelfile ../../models/log-parsing-models/log-parsing-20220418.bin - --configfile ../../models/log-parsing-models/log-parsing-config-20220418.bin - --vocabfile ../../training-tuning-scripts/log-parsing-models/resources/bert-base-cased-vocab.txt - --hashfile ../../training-tuning-scripts/log-parsing-models/resources/bert-base-cased-hash.txt +python log-parsing-inference.py \ + --inputdata ../../datasets/validation-data/log-parsing-validation-data-input.csv \ + --modelfile ../../models/log-parsing-models/log-parsing-20220418.bin \ + --configfile ../../models/log-parsing-models/log-parsing-config-20220418.bin \ + --vocabfile ../../training-tuning-scripts/log-parsing-models/resources/bert-base-cased-vocab.txt \ + --hashfile ../../training-tuning-scripts/log-parsing-models/resources/bert-base-cased-hash.txt \ --outputfile parsed-output.jsonlines """ - +import argparse import json -import cudf import os +import string from collections import defaultdict -import argparse + import numpy as np import pandas as pd -import string import torch import torch.nn as nn from torch.nn import functional as f -from torch.utils.data import DataLoader, TensorDataset +from torch.utils.data import DataLoader +from torch.utils.data import TensorDataset from transformers import BertForTokenClassification +import cudf from cudf.core.subword_tokenizer import SubwordTokenizer @@ -100,15 +115,13 @@ def preprocess(self, raw_data_col, stride_len=64, max_seq_len=256): max_rows_tensor = int((byte_count / 120).ceil().sum()) tokenizer = SubwordTokenizer(self._hashpath, do_lower_case=False) - tokenizer_output = tokenizer( - raw_data_col, - max_length=256, - stride=64, - truncation=False, - max_num_rows=max_rows_tensor, - add_special_tokens=False, - return_tensors='pt' - ) + tokenizer_output = tokenizer(raw_data_col, + max_length=256, + stride=64, + truncation=False, + max_num_rows=max_rows_tensor, + add_special_tokens=False, + return_tensors='pt') input_ids = tokenizer_output['input_ids'].type(torch.long) att_mask = tokenizer_output['attention_mask'].type(torch.long) meta_data = tokenizer_output['metadata'] @@ -167,27 +180,17 @@ def inference(self, raw_data_col, batch_size=64): def __postprocess(self, infer_pdf): # cut overlapping edges - infer_pdf["confidences"] = infer_pdf.apply( - lambda row: row["confidences"][row["start"]:row["stop"]], axis=1 - ) + infer_pdf["confidences"] = infer_pdf.apply(lambda row: row["confidences"][row["start"]:row["stop"]], axis=1) - infer_pdf["labels"] = infer_pdf.apply( - lambda row: row["labels"][row["start"]:row["stop"]], axis=1 - ) + infer_pdf["labels"] = infer_pdf.apply(lambda row: row["labels"][row["start"]:row["stop"]], axis=1) - infer_pdf["token_ids"] = infer_pdf.apply( - lambda row: row["token_ids"][row["start"]:row["stop"]], axis=1 - ) + infer_pdf["token_ids"] = infer_pdf.apply(lambda row: row["token_ids"][row["start"]:row["stop"]], axis=1) # aggregated logs - infer_pdf = infer_pdf.groupby("doc").agg( - {"token_ids": "sum", "confidences": "sum", "labels": "sum"} - ) + infer_pdf = infer_pdf.groupby("doc").agg({"token_ids": "sum", "confidences": "sum", "labels": "sum"}) # parse_by_label - parsed_dfs = infer_pdf.apply( - lambda row: self.__get_label_dicts(row), axis=1, result_type="expand" - ) + parsed_dfs = infer_pdf.apply(lambda row: self.__get_label_dicts(row), axis=1, result_type="expand") ext_parsed = pd.DataFrame(parsed_dfs[0].tolist()) ext_confidence = pd.DataFrame(parsed_dfs[1].tolist()) parsed_df = pd.DataFrame() @@ -212,18 +215,14 @@ def __postprocess(self, infer_pdf): def __get_label_dicts(self, row): token_dict = defaultdict(str) confidence_dict = defaultdict(list) - for label, confidence, token_id in zip( - row["labels"], row["confidences"], row["token_ids"] - ): + for label, confidence, token_id in zip(row["labels"], row["confidences"], row["token_ids"]): text_token = self._vocab_lookup[token_id] if text_token[:2] != "##" and text_token[0] != '.': # if not a subword use the current label, else use previous new_label = label new_confidence = confidence if self._label_map[new_label] in token_dict: - token_dict[self._label_map[new_label]] = ( - token_dict[self._label_map[new_label]] + " " + text_token - ) + token_dict[self._label_map[new_label]] = (token_dict[self._label_map[new_label]] + " " + text_token) else: token_dict[self._label_map[new_label]] = text_token confidence_dict[self._label_map[label]].append(new_confidence) @@ -256,6 +255,7 @@ def __decode_cleanup(self, df): df.replace(r"\s+;+\s", "; ", regex=True, inplace=True) return df + if __name__ == "__main__": parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--inputdata", required=True, help="raw logs csv format") diff --git a/models/validation-inference-scripts/phishing-models/phish-bert-20220113-inference-script.py b/models/validation-inference-scripts/phishing-models/phish-bert-20220113-inference-script.py index 2b1d9deb70..e4fcfa04f9 100644 --- a/models/validation-inference-scripts/phishing-models/phish-bert-20220113-inference-script.py +++ b/models/validation-inference-scripts/phishing-models/phish-bert-20220113-inference-script.py @@ -1,27 +1,42 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. """ Example Usage: -python phish-bert-20220113-inference-script.py --validationdata phishing-email-validation-data.jsonlines --model phishing-bert-202111006.onnx --vocab bert-base-uncased-hash.txt --output phishing-email-validation-output.jsonlines +python phish-bert-20220113-inference-script.py \ + --validationdata phishing-email-validation-data.jsonlines \ + --model phishing-bert-202111006.onnx \ + --vocab bert-base-uncased-hash.txt \ + --output phishing-email-validation-output.jsonlines """ -import cudf -from clx.analytics.binary_sequence_classifier import BinarySequenceClassifier; -import argparse; -import s3fs; -from os import path; -import logging +import argparse import json -import torch -import onnxruntime -from torch.utils.dlpack import from_dlpack, to_dlpack + import cupy -from scipy.special import expit import numpy as np +import onnxruntime +import torch +from scipy.special import expit +from torch.utils.dlpack import from_dlpack -def infer(validationdata,vocab,model,output): +import cudf - MODEL_FILE = model - max_seq_len = 128 +def infer(validationdata, vocab, model, output): + + MODEL_FILE = model def bert_uncased_tokenize(strings, max_seq_len): """ @@ -37,12 +52,8 @@ def bert_uncased_tokenize(strings, max_seq_len): )[:2] # convert from cupy to torch tensor using dlpack - input_ids = from_dlpack( - token_ids.reshape(num_strings, max_seq_len).astype(cupy.float).toDlpack() - ) - attention_mask = from_dlpack( - mask.reshape(num_strings, max_seq_len).astype(cupy.float).toDlpack() - ) + input_ids = from_dlpack(token_ids.reshape(num_strings, max_seq_len).astype(cupy.float).toDlpack()) + attention_mask = from_dlpack(mask.reshape(num_strings, max_seq_len).astype(cupy.float).toDlpack()) return input_ids.type(torch.long), attention_mask.type(torch.long) data = [] @@ -50,7 +61,7 @@ def bert_uncased_tokenize(strings, max_seq_len): for line in f: data.append(json.loads(line)) - df=cudf.DataFrame(data) + df = cudf.DataFrame(data) cudf_input = df["data"] input_ids, att_masks = bert_uncased_tokenize(cudf_input, 128) # moving inputs to host for test @@ -60,8 +71,7 @@ def bert_uncased_tokenize(strings, max_seq_len): print("Running Inference") ort_session = onnxruntime.InferenceSession(MODEL_FILE) # compute ONNX Runtime output prediction - ort_inputs = {ort_session.get_inputs()[0].name: input_ids, - ort_session.get_inputs()[1].name: att_masks} + ort_inputs = {ort_session.get_inputs()[0].name: input_ids, ort_session.get_inputs()[1].name: att_masks} ort_outs = ort_session.run(None, ort_inputs) probs = expit(ort_outs[0]) @@ -69,24 +79,23 @@ def bert_uncased_tokenize(strings, max_seq_len): preds = (probs >= 0.5).astype(np.int_) preds = preds[:, 1].tolist() - bool_list = list(map(bool,preds)) - df["pred"]=bool_list + bool_list = list(map(bool, preds)) + df["pred"] = bool_list print("writing the output file") - df.to_json(output,orient='records', lines=True) + df.to_json(output, orient='records', lines=True) def main(): - infer(args.validationdata,args.vocab,args.model,args.output) - + infer(args.validationdata, args.vocab, args.model, args.output) + - if __name__ == "__main__": parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--validationdata", required=True,help="Labelled data in JSON format") + parser.add_argument("--validationdata", required=True, help="Labelled data in JSON format") parser.add_argument("--vocab", required=True, help="BERT voabulary file") parser.add_argument("--model", required=True, help="pretrained model") parser.add_argument("--output", required=True, help="output filename") args = parser.parse_args() -main() \ No newline at end of file +main() diff --git a/morpheus/_lib/include/morpheus/objects/triton_in_out.hpp b/morpheus/_lib/include/morpheus/objects/triton_in_out.hpp index 74718ec85c..de6c0dd8d6 100644 --- a/morpheus/_lib/include/morpheus/objects/triton_in_out.hpp +++ b/morpheus/_lib/include/morpheus/objects/triton_in_out.hpp @@ -1,6 +1,19 @@ -// -// Created by drobison on 3/14/22. -// +/* + * SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ #pragma once @@ -10,17 +23,18 @@ #include namespace morpheus { - /****** Component public implementations *******************/ - /****** TritonInOut****************************************/ - /** - * TODO(Documentation) - */ - struct TritonInOut { - std::string name; - size_t bytes; - DType datatype; - std::vector shape; - std::string mapped_name; - size_t offset; - }; -} +/****** Component public implementations *******************/ +/****** TritonInOut****************************************/ +/** + * TODO(Documentation) + */ +struct TritonInOut +{ + std::string name; + size_t bytes; + DType datatype; + std::vector shape; + std::string mapped_name; + size_t offset; +}; +} // namespace morpheus diff --git a/morpheus/_lib/include/nvtext/subword_tokenize.hpp b/morpheus/_lib/include/nvtext/subword_tokenize.hpp index 9d75295cd3..0f18ce5e81 100644 --- a/morpheus/_lib/include/nvtext/subword_tokenize.hpp +++ b/morpheus/_lib/include/nvtext/subword_tokenize.hpp @@ -30,18 +30,19 @@ namespace nvtext { /** * @brief The vocabulary data for use with the subword_tokenize function. */ -struct hashed_vocabulary { - uint16_t first_token_id{}; - uint16_t separator_token_id{}; - uint16_t unknown_token_id{}; - uint32_t outer_hash_a{}; - uint32_t outer_hash_b{}; - uint16_t num_bins{}; - std::unique_ptr table; // uint64 - std::unique_ptr bin_coefficients; // uint64 - std::unique_ptr bin_offsets; // uint16 - std::unique_ptr cp_metadata; // uint32 - std::unique_ptr aux_cp_table; // uint64 +struct hashed_vocabulary +{ + uint16_t first_token_id{}; + uint16_t separator_token_id{}; + uint16_t unknown_token_id{}; + uint32_t outer_hash_a{}; + uint32_t outer_hash_b{}; + uint16_t num_bins{}; + std::unique_ptr table; // uint64 + std::unique_ptr bin_coefficients; // uint64 + std::unique_ptr bin_offsets; // uint16 + std::unique_ptr cp_metadata; // uint32 + std::unique_ptr aux_cp_table; // uint64 }; /** @@ -59,41 +60,42 @@ struct hashed_vocabulary { * @return vocabulary hash-table elements */ std::unique_ptr load_vocabulary_file( - std::string const& filename_hashed_vocabulary, - rmm::mr::device_memory_resource* mr = rmm::mr::get_current_device_resource()); + std::string const& filename_hashed_vocabulary, + rmm::mr::device_memory_resource* mr = rmm::mr::get_current_device_resource()); /** * @brief Result object for the subword_tokenize functions. */ -struct tokenizer_result { - /** - * @brief The number of rows for the output token-ids. - */ - uint32_t nrows_tensor{}; - /** - * @brief The number of token-ids in each row. - */ - uint32_t sequence_length{}; - /** - * @brief A vector of token-ids for each row. - * - * The data is a flat matrix (nrows_tensor x sequence_length) of token-ids. - * This column is of type UINT32 with no null entries. - */ - std::unique_ptr tensor_token_ids; - /** - * @brief This mask identifies which tensor-token-ids are valid. - * - * This column is of type UINT32 with no null entries. - */ - std::unique_ptr tensor_attention_mask; - /** - * @brief The metadata for each tensor row. - * - * There are three elements per tensor row [row-id, start_pos, stop_pos]) - * This column is of type UINT32 with no null entries. - */ - std::unique_ptr tensor_metadata; +struct tokenizer_result +{ + /** + * @brief The number of rows for the output token-ids. + */ + uint32_t nrows_tensor{}; + /** + * @brief The number of token-ids in each row. + */ + uint32_t sequence_length{}; + /** + * @brief A vector of token-ids for each row. + * + * The data is a flat matrix (nrows_tensor x sequence_length) of token-ids. + * This column is of type UINT32 with no null entries. + */ + std::unique_ptr tensor_token_ids; + /** + * @brief This mask identifies which tensor-token-ids are valid. + * + * This column is of type UINT32 with no null entries. + */ + std::unique_ptr tensor_attention_mask; + /** + * @brief The metadata for each tensor row. + * + * There are three elements per tensor row [row-id, start_pos, stop_pos]) + * This column is of type UINT32 with no null entries. + */ + std::unique_ptr tensor_metadata; }; /** @@ -147,15 +149,14 @@ struct tokenizer_result { * @param mr Memory resource to allocate any returned objects. * @return token-ids, attention-mask, and metadata */ -tokenizer_result subword_tokenize( - cudf::strings_column_view const& strings, - hashed_vocabulary const& vocabulary_table, - uint32_t max_sequence_length, - uint32_t stride, - bool do_lower_case, - bool do_truncate, - uint32_t max_rows_tensor, - rmm::mr::device_memory_resource* mr = rmm::mr::get_current_device_resource()); +tokenizer_result subword_tokenize(cudf::strings_column_view const& strings, + hashed_vocabulary const& vocabulary_table, + uint32_t max_sequence_length, + uint32_t stride, + bool do_lower_case, + bool do_truncate, + uint32_t max_rows_tensor, + rmm::mr::device_memory_resource* mr = rmm::mr::get_current_device_resource()); /** @} */ // end of group } // namespace nvtext diff --git a/tests/mock_triton_server/config.yml b/tests/mock_triton_server/config.yml index 5223574714..3021c9fa13 100644 --- a/tests/mock_triton_server/config.yml +++ b/tests/mock_triton_server/config.yml @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + loglevel: info cpus: 1 monitoring: From cb12889bbbd98afc09a15bb9147590bde6267c7f Mon Sep 17 00:00:00 2001 From: Michael Demoret <42954918+mdemoret-nv@users.noreply.github.com> Date: Mon, 4 Jul 2022 18:40:21 -0600 Subject: [PATCH 70/73] Fixing the from-kafka stage (#257) Fixes #254 This re-enables the check on the number of messages received before trying to process to cudf. Authors: - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - David Gardner (https://github.com/dagardner-nv) - Pete MacKinnon (https://github.com/pdmack) URL: https://github.com/nv-morpheus/Morpheus/pull/257 --- CONTRIBUTING.md | 65 +++++++++++++------ morpheus/_lib/src/stages/kafka_source.cpp | 72 ++++++++++++--------- morpheus/cli.py | 16 ++--- morpheus/stages/input/kafka_source_stage.py | 34 ++++++---- 4 files changed, 112 insertions(+), 75 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 38dfd1d488..f1973c1216 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -279,32 +279,55 @@ Launching a full production Kafka cluster is outside the scope of this project. docker-compose up -d --scale kafka=3 ``` In practice, 3 instances has been shown to work well. Use as many instances as required. Keep in mind each instance takes about 1 Gb of memory. -7. Create the topic: +7. Launch the Kafka shell + 1. To configure the cluster, you will need to launch into a container that has the Kafka shell. + 2. You can do this with `./start-kafka-shell.sh $KAFKA_ADVERTISED_HOST_NAME`. + 3. However, this makes it difficult to load data into the cluster. Instead, you can manually launch the Kafka shell by running: + ```bash + # Change to the morpheus root to make it easier for mounting volumes + cd ${MORPHEUS_HOME} + + # Run the Kafka shell docker container + docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock \ + -e HOST_IP=$KAFKA_ADVERTISED_HOST_NAME -e ZK=$2 \ + -v $PWD:/workspace wurstmeister/kafka /bin/bash + ``` + Note the `-v $PWD:/workspace`. This will make anything in your current directory available in `/workspace`. + 4. Once the Kafka shell has been launched, you can begin configuring the cluster. All of the following commands require the argument `--bootstrap-server`. To simplify things, set the `BOOTSTRAP_SERVER` and `MY_TOPIC` variables: + ```bash + export BOOTSTRAP_SERVER=$(broker-list.sh) + export MY_TOPIC="your_topic_here" + ``` +8. Create the topic ```bash - ./start-kafka-shell.sh $KAFKA_ADVERTISED_HOST_NAME - $KAFKA_HOME/bin/kafka-topics.sh --create --topic=$MY_INPUT_TOPIC_NAME --bootstrap-server `broker-list.sh` + # Create the topic + kafka-topics.sh --bootstrap-server ${BOOTSTRAP_SERVER} --create --topic ${MY_TOPIC} + + # Change the number of partitions + kafka-topics.sh --bootstrap-server ${BOOTSTRAP_SERVER} --alter --topic ${MY_TOPIC} --partitions 3 + + # See the topic info + kafka-topics.sh --bootstrap-server ${BOOTSTRAP_SERVER} --describe --topic=${MY_TOPIC} ``` - Replace `` with the input name of your choice. If you are using `to-kafka`, ensure your output topic is also created. - -8. Generate input messages - 1. In order for Morpheus to read from Kafka, messages need to be published to the cluster. For debugging/testing purposes, the following container can be used: - - ```bash - # Download from https://netq-shared.s3-us-west-2.amazonaws.com/kafka-producer.tar.gz - wget https://netq-shared.s3-us-west-2.amazonaws.com/kafka-producer.tar.gz - # Load container - docker load --input kafka-producer.tar.gz - # Run the producer container - docker run --rm -it -e KAFKA_BROKER_SERVERS=$(broker-list.sh) -e INPUT_FILE_NAME=$MY_INPUT_FILE -e TOPIC_NAME=$MY_INPUT_TOPIC_NAME --mount src="$PWD,target=/app/data/,type=bind" kafka-producer:1 - ``` - In order for this to work, your input file must be accessible from `$PWD`. + **Note:** If you are using `to-kafka`, ensure your output topic is also created. + +9. Generate input messages + 1. In order for Morpheus to read from Kafka, messages need to be published to the cluster. You can use the `kafka-console-producer.sh` script to load data: + + ```bash + kafka-console-producer.sh --bootstrap-server ${BOOTSTRAP_SERVER} --topic ${MY_TOPIC} < ${FILE_TO_LOAD} + ``` + + **Note:** In order for this to work, your input file must be accessible from the current directory the Kafka shell was launched from. + 2. You can view the messages with: - ```bash - ./start-kafka-shell.sh $KAFKA_ADVERTISED_HOST_NAME - $KAFKA_HOME/bin/kafka-console-consumer.sh --topic=$MY_TOPIC --bootstrap-server `broker-list.sh` - ``` + ```bash + kafka-console-consumer.sh --bootstrap-server ${BOOTSTRAP_SERVER} --topic ${MY_TOPIC} + ``` + + **Note:** This will consume messages. ### Launching Triton Server diff --git a/morpheus/_lib/src/stages/kafka_source.cpp b/morpheus/_lib/src/stages/kafka_source.cpp index 3caf6e3887..4227701e44 100644 --- a/morpheus/_lib/src/stages/kafka_source.cpp +++ b/morpheus/_lib/src/stages/kafka_source.cpp @@ -44,8 +44,8 @@ #include #include #include +#include #include -#include "srf/runnable/forward.hpp" #define CHECK_KAFKA(command, expected, msg) \ { \ @@ -121,11 +121,16 @@ class KafkaSourceStage__Rebalancer : public RdKafka::RebalanceCb // Update now now = std::chrono::high_resolution_clock::now(); - } while (msg_count < m_max_batch_size_fn() && now < batch_end && m_is_rebalanced); + } while (msg_count < m_max_batch_size_fn() && now < batch_end); return std::move(messages); } + bool process_messages(std::vector> &messages) + { + return m_process_fn(messages); + } + private: bool m_is_rebalanced{false}; @@ -155,9 +160,18 @@ void KafkaSourceStage__Rebalancer::rebalance_cb(RdKafka::KafkaConsumer *consumer { std::unique_lock lock(m_mutex); + std::vector current_assignment; + CHECK_KAFKA(consumer->assignment(current_assignment), RdKafka::ERR_NO_ERROR, "Error retrieving current assignment"); + + auto old_partition_ids = foreach_map(current_assignment, [](const auto &x) { return x->partition(); }); + auto new_partition_ids = foreach_map(partitions, [](const auto &x) { return x->partition(); }); + if (err == RdKafka::ERR__ASSIGN_PARTITIONS) { - VLOG(10) << m_display_str_fn("Rebalance: Assign Partitions"); + VLOG(10) << m_display_str_fn(MORPHEUS_CONCAT_STR( + "Rebalance: Assign Partitions. Current Partitions: << " + << StringUtil::array_to_str(old_partition_ids.begin(), old_partition_ids.end()) + << ". Assigning: " << StringUtil::array_to_str(new_partition_ids.begin(), new_partition_ids.end()))); // application may load offets from arbitrary external storage here and update \p partitions if (consumer->rebalance_protocol() == "COOPERATIVE") @@ -173,7 +187,10 @@ void KafkaSourceStage__Rebalancer::rebalance_cb(RdKafka::KafkaConsumer *consumer } else if (err == RdKafka::ERR__REVOKE_PARTITIONS) { - VLOG(10) << m_display_str_fn("Rebalance: Revoke Partitions"); + VLOG(10) << m_display_str_fn(MORPHEUS_CONCAT_STR( + "Rebalance: Revoke Partitions. Current Partitions: << " + << StringUtil::array_to_str(old_partition_ids.begin(), old_partition_ids.end()) + << ". Revoking: " << StringUtil::array_to_str(new_partition_ids.begin(), new_partition_ids.end()))); // Application may commit offsets manually here if auto.commit.enable=false if (consumer->rebalance_protocol() == "COOPERATIVE") @@ -292,19 +309,13 @@ KafkaSourceStage::subscriber_fn_t KafkaSourceStage::build() std::vector> message_batch = rebalancer.partition_progress_step(consumer.get()); - std::shared_ptr batch; + // Process the messages. Returns true if we need to commit + auto should_commit = rebalancer.process_messages(message_batch); - try + if (should_commit) { - batch = std::move(this->process_batch(std::move(message_batch))); - } catch (std::exception &ex) - { - LOG(ERROR) << "Exception in process_batch. Msg: " << ex.what(); - - break; + CHECK_KAFKA(consumer->commitAsync(), RdKafka::ERR_NO_ERROR, "Error during commitAsync"); } - - sub.on_next(std::move(batch)); } } catch (std::exception &ex) @@ -418,20 +429,6 @@ std::unique_ptr KafkaSourceStage::create_consumer(RdKafk throw std::runtime_error("Failed to list_topics in Kafka broker after 5 attempts"); } - if (md == nullptr) - { - CHECK_KAFKA(consumer->metadata(spec_topic == nullptr, spec_topic.get(), &md, 1000), - RdKafka::ERR_NO_ERROR, - "Failed to list_topics in Kafka broker"); - } - - if (md == nullptr) - { - CHECK_KAFKA(consumer->metadata(spec_topic == nullptr, spec_topic.get(), &md, 1000), - RdKafka::ERR_NO_ERROR, - "Failed to list_topics in Kafka broker"); - } - std::map> topic_parts; auto &ctx = srf::runnable::Context::get_runtime_context(); @@ -467,14 +464,29 @@ std::unique_ptr KafkaSourceStage::create_consumer(RdKafk auto positions = foreach_map(toppar_list, [](const std::unique_ptr &x) { return x->offset(); }); + auto watermarks = foreach_map(toppar_list, [&consumer](const std::unique_ptr &x) { + int64_t low; + int64_t high; + CHECK_KAFKA(consumer->query_watermark_offsets(x->topic(), x->partition(), &low, &high, 1000), + RdKafka::ERR_NO_ERROR, + "Failed retrieve Kafka watermark offsets"); + + return std::make_tuple(low, high); + }); + + auto watermark_strs = foreach_map(watermarks, [](const auto &x) { + return MORPHEUS_CONCAT_STR("(" << std::get<0>(x) << ", " << std::get<1>(x) << ")"); + }); + auto &ctx = srf::runnable::Context::get_runtime_context(); VLOG(10) << ctx.info() << MORPHEUS_CONCAT_STR( " Topic: '" << topic->topic() << "', Parts: " << StringUtil::array_to_str(part_ids.begin(), part_ids.end()) << ", Committed: " << StringUtil::array_to_str(committed.begin(), committed.end()) - << ", Positions: " - << StringUtil::array_to_str(positions.begin(), positions.end())); + << ", Positions: " << StringUtil::array_to_str(positions.begin(), positions.end()) + << ", Watermarks: " + << StringUtil::array_to_str(watermark_strs.begin(), watermark_strs.end())); } return std::move(consumer); diff --git a/morpheus/cli.py b/morpheus/cli.py index 9ead0d6d4c..98315d3ef0 100644 --- a/morpheus/cli.py +++ b/morpheus/cli.py @@ -355,17 +355,6 @@ def run(ctx: click.Context, **kwargs): pass -def validate_rolls(ctx, param, value): - if isinstance(value, tuple): - return value - - try: - rolls, _, dice = value.partition("d") - return int(dice), int(rolls) - except ValueError: - raise click.BadParameter("format must be 'NdM'") - - @click.group(chain=True, short_help="Run the inference pipeline with a NLP model", no_args_is_help=True, @@ -671,6 +660,11 @@ def from_file(ctx: click.Context, **kwargs): is_flag=True, help=("Enabling this option will skip pre-filtering of json messages. " "This is only useful when inputs are known to be valid json.")) +@click.option("--auto_offset_reset", + type=click.Choice(["earliest", "latest", "none"], case_sensitive=False), + default="latest", + help=("Sets the value for the configuration option 'auto.offset.reset'. " + "See the kafka documentation for more information on the effects of each value.")) @prepare_command() def from_kafka(ctx: click.Context, **kwargs): diff --git a/morpheus/stages/input/kafka_source_stage.py b/morpheus/stages/input/kafka_source_stage.py index 76f3814f96..bd951be703 100644 --- a/morpheus/stages/input/kafka_source_stage.py +++ b/morpheus/stages/input/kafka_source_stage.py @@ -50,6 +50,12 @@ class KafkaSourceStage(SingleOutputSource): disable_commit: bool, default = False Enabling this option will skip committing messages as they are pulled off the server. This is only useful for debugging, allowing the user to process the same messages multiple times. + disable_pre_filtering : bool, default = False + Enabling this option will skip pre-filtering of json messages. This is only useful when inputs are known to be + valid json. + auto_offset_reset : str, default = "latest" + Sets the value for the configuration option 'auto.offset.reset'. See the kafka documentation for more + information on the effects of each value." """ def __init__(self, @@ -59,11 +65,15 @@ def __init__(self, group_id: str = "custreamz", poll_interval: str = "10millis", disable_commit: bool = False, - disable_pre_filtering: bool = False): + disable_pre_filtering: bool = False, + auto_offset_reset: str = "latest"): super().__init__(c) self._consumer_conf = { - 'bootstrap.servers': bootstrap_servers, 'group.id': group_id, 'session.timeout.ms': "60000" + 'bootstrap.servers': bootstrap_servers, + 'group.id': group_id, + 'session.timeout.ms': "60000", + "auto.offset.reset": auto_offset_reset } self._input_topic = input_topic @@ -88,7 +98,7 @@ def __init__(self, # Override the auto-commit config to enforce custom streamz checkpointing self._consumer_params['enable.auto.commit'] = 'false' if 'auto.offset.reset' not in self._consumer_params.keys(): - self._consumer_params['auto.offset.reset'] = 'latest' + self._consumer_params['auto.offset.reset'] = 'earliest' self._topic = topic self._npartitions = npartitions self._refresh_partitions = refresh_partitions @@ -107,7 +117,7 @@ def name(self) -> str: def supports_cpp_node(self): return True - def _source_generator(self, sub: srf.Subscriber): + def _source_generator(self): # Each invocation of this function makes a new thread so recreate the producers # Set some initial values @@ -181,7 +191,7 @@ def _source_generator(self, sub: srf.Subscriber): for partition in range(npartitions): tps.append(ck.TopicPartition(self._topic, partition)) - while sub.is_subscribed(): + while True: try: committed = consumer.committed(tps, timeout=1) except ck.KafkaException: @@ -191,7 +201,7 @@ def _source_generator(self, sub: srf.Subscriber): positions[tp.partition] = tp.offset break - while sub.is_subscribed(): + while True: out = [] if self._refresh_partitions: @@ -248,10 +258,11 @@ def commit(topic, part_no, keys, lowest, offset): self._consumer_conf["bootstrap.servers"], offset) - weakref.finalize(meta, commit, *part[1:]) + if (not self._disable_commit): + weakref.finalize(meta, commit, *part[1:]) # Push the message meta - sub.on_next(meta) + yield meta else: time.sleep(self._poll_interval) except Exception: @@ -263,7 +274,6 @@ def commit(topic, part_no, keys, lowest, offset): # Close the consumer and call on_completed if (consumer): consumer.close() - sub.on_completed() def _kafka_params_to_messagemeta(self, x: tuple): @@ -292,13 +302,11 @@ def _read_gdf(kafka_configs, raise ValueError("ERROR: You must specifiy the topic " "that you want to consume from") - kafka_confs = {str.encode(key): str.encode(value) for key, value in kafka_configs.items()} - kafka_datasource = None try: kafka_datasource = KafkaDatasource( - kafka_confs, + kafka_configs, topic.encode(), partition, start, @@ -317,7 +325,7 @@ def _read_gdf(kafka_configs, result = cudf_readers[message_format](kafka_datasource, engine="cudf", lines=lines) - return cudf.DataFrame(data=result._data, index=result._index) + return cudf.DataFrame._from_data(data=result._data, index=result._index) except Exception: logger.exception("Error occurred converting KafkaDatasource to Dataframe.") finally: From 00541f6aba1d74bba524365dadac12fed6287da6 Mon Sep 17 00:00:00 2001 From: Michael Demoret <42954918+mdemoret-nv@users.noreply.github.com> Date: Tue, 5 Jul 2022 11:25:57 -0600 Subject: [PATCH 71/73] Fixing Python Kafka Source with Multiple Threads (#262) A small regression in PR #257 that would duplicate messages in the `from-kafka` stage when `--use_cpp=False`. If you used 3 threads you would process each message in Kafka 3 times instead of dividing the messages between threads. This also improves the shutdown behavior of the `from-kafka` stage when pressing Ctrl+C to close the pipeline. Authors: - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - David Gardner (https://github.com/dagardner-nv) URL: https://github.com/nv-morpheus/Morpheus/pull/262 --- morpheus/pipeline/source_stage.py | 3 --- morpheus/stages/input/kafka_source_stage.py | 19 +++++++++++++++---- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/morpheus/pipeline/source_stage.py b/morpheus/pipeline/source_stage.py index 26fe4d0903..e177ea058d 100644 --- a/morpheus/pipeline/source_stage.py +++ b/morpheus/pipeline/source_stage.py @@ -99,8 +99,5 @@ def _post_build(self, builder: srf.Builder, out_ports_pair: typing.List[StreamPa def _start(self): self._source_stream.start() - def stop(self): - self._source_stream.stop() - async def join(self): pass diff --git a/morpheus/stages/input/kafka_source_stage.py b/morpheus/stages/input/kafka_source_stage.py index bd951be703..54e58869f2 100644 --- a/morpheus/stages/input/kafka_source_stage.py +++ b/morpheus/stages/input/kafka_source_stage.py @@ -84,6 +84,9 @@ def __init__(self, self._disable_pre_filtering = disable_pre_filtering self._client = None + # Flag to indicate whether or not we should stop + self._stop_requested = False + # What gets passed to streamz kafka topic = self._input_topic consumer_params = self._consumer_conf @@ -117,6 +120,13 @@ def name(self) -> str: def supports_cpp_node(self): return True + def stop(self): + + # Indicate we need to stop + self._stop_requested = True + + return super().stop() + def _source_generator(self): # Each invocation of this function makes a new thread so recreate the producers @@ -191,7 +201,7 @@ def _source_generator(self): for partition in range(npartitions): tps.append(ck.TopicPartition(self._topic, partition)) - while True: + while not self._stop_requested: try: committed = consumer.committed(tps, timeout=1) except ck.KafkaException: @@ -201,7 +211,7 @@ def _source_generator(self): positions[tp.partition] = tp.offset break - while True: + while not self._stop_requested: out = [] if self._refresh_partitions: @@ -347,10 +357,11 @@ def _build_source(self, builder: srf.Builder) -> StreamPair: self._consumer_params, self._disable_commit, self._disable_pre_filtering) + + # Only use multiple progress engines with C++. The python implementation will duplicate messages with + # multiple threads source.launch_options.pe_count = self._max_concurrent else: source = builder.make_source(self.unique_name, self._source_generator) - source.launch_options.pe_count = self._max_concurrent - return source, MessageMeta From eba403777a642d07810b36b1d3ad417f72037d07 Mon Sep 17 00:00:00 2001 From: Michael Demoret <42954918+mdemoret-nv@users.noreply.github.com> Date: Tue, 5 Jul 2022 11:26:07 -0600 Subject: [PATCH 72/73] Fixing Outstanding Style Errors (#261) Some remaining style errors that need to be cleaned up before 22.06 Authors: - Michael Demoret (https://github.com/mdemoret-nv) Approvers: - https://github.com/bsuryadevara URL: https://github.com/nv-morpheus/Morpheus/pull/261 --- .github/ops-bot.yaml | 15 +++++++++++++++ cmake/deps/Configure_srf.cmake | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/.github/ops-bot.yaml b/.github/ops-bot.yaml index 2ef41b3674..fbe76f623e 100644 --- a/.github/ops-bot.yaml +++ b/.github/ops-bot.yaml @@ -1,3 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + # This file controls which features from the `ops-bot` repository below are enabled. # - https://github.com/rapidsai/ops-bot diff --git a/cmake/deps/Configure_srf.cmake b/cmake/deps/Configure_srf.cmake index 545b833a2e..9a7967e61c 100644 --- a/cmake/deps/Configure_srf.cmake +++ b/cmake/deps/Configure_srf.cmake @@ -38,7 +38,7 @@ function(find_and_configure_srf version) "SRF_USE_CONDA ${MORPHEUS_USE_CONDA}" "SRF_USE_CCACHE ${MORPHEUS_USE_CCACHE}" "SRF_USE_CLANG_TIDY ${MORPHEUS_USE_CLANG_TIDY}" - "SRF_PYTHON_INPLACE_BUILD ${MORPHEUS_PYTHON_INPLACE_BUILD}" + "SRF_PYTHON_INPLACE_BUILD OFF" "SRF_PYTHON_PERFORM_INSTALL ON" "SRF_PYTHON_BUILD_STUBS ${MORPHEUS_BUILD_PYTHON_STUBS}" "RMM_VERSION ${RAPIDS_VERSION}" From 45a3c383e471596243bab86bafa98363cf853931 Mon Sep 17 00:00:00 2001 From: Michael Demoret Date: Tue, 5 Jul 2022 12:28:58 -0700 Subject: [PATCH 73/73] Updating CHANGELOG --- CHANGELOG.md | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000..a88fda7816 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,127 @@ +# Morpheus 22.06.00 (5 Jul 2022) + +## 🚨 Breaking Changes + +- Update Morpheus to Use SRF 22.06 ([#152](https://github.com/nv-morpheus/Morpheus/pull/152)) [@mdemoret-nv](https://github.com/mdemoret-nv) +- update cudf to 22.04, cuda to 11.5 ([#148](https://github.com/nv-morpheus/Morpheus/pull/148)) [@cwharris](https://github.com/cwharris) +- Fixes Timestamp Nodes When Running with `--debug` ([#145](https://github.com/nv-morpheus/Morpheus/pull/145)) [@mdemoret-nv](https://github.com/mdemoret-nv) +- Dockerfile COPY section needs update ([#141](https://github.com/nv-morpheus/Morpheus/pull/141)) [@pdmack](https://github.com/pdmack) +- Reorganize the python package files ([#98](https://github.com/nv-morpheus/Morpheus/pull/98)) [@mdemoret-nv](https://github.com/mdemoret-nv) + +## 🐛 Bug Fixes + +- Fixing Python Kafka Source with Multiple Threads ([#262](https://github.com/nv-morpheus/Morpheus/pull/262)) [@mdemoret-nv](https://github.com/mdemoret-nv) +- Fixing the from-kafka stage ([#257](https://github.com/nv-morpheus/Morpheus/pull/257)) [@mdemoret-nv](https://github.com/mdemoret-nv) +- Pin Conda Package `cuda-python <=11.7.0` to Fix Conda Build ([#252](https://github.com/nv-morpheus/Morpheus/pull/252)) [@mdemoret-nv](https://github.com/mdemoret-nv) +- Fixing `to-kafka` Stage by Converting to a Pass Through Node ([#245](https://github.com/nv-morpheus/Morpheus/pull/245)) [@mdemoret-nv](https://github.com/mdemoret-nv) +- Move Morpheus Data Files Out of LFS ([#242](https://github.com/nv-morpheus/Morpheus/pull/242)) [@mdemoret-nv](https://github.com/mdemoret-nv) +- Missing 'supports_cpp_node' impl function ([#239](https://github.com/nv-morpheus/Morpheus/pull/239)) [@bsuryadevara](https://github.com/bsuryadevara) +- Revert ransomware feature config changes ([#234](https://github.com/nv-morpheus/Morpheus/pull/234)) [@bsuryadevara](https://github.com/bsuryadevara) +- Use git version 2.35.3 in release build ([#224](https://github.com/nv-morpheus/Morpheus/pull/224)) [@mdemoret-nv](https://github.com/mdemoret-nv) +- Rollback CI images and fix dev container ([#191](https://github.com/nv-morpheus/Morpheus/pull/191)) [@cwharris](https://github.com/cwharris) +- Update cuda11.5_dev.yml ([#167](https://github.com/nv-morpheus/Morpheus/pull/167)) [@pdmack](https://github.com/pdmack) +- Adding in pybind11-stubgen to the conda package ([#163](https://github.com/nv-morpheus/Morpheus/pull/163)) [@mdemoret-nv](https://github.com/mdemoret-nv) +- Fixes Timestamp Nodes When Running with `--debug` ([#145](https://github.com/nv-morpheus/Morpheus/pull/145)) [@mdemoret-nv](https://github.com/mdemoret-nv) +- Dockerfile COPY section needs update ([#141](https://github.com/nv-morpheus/Morpheus/pull/141)) [@pdmack](https://github.com/pdmack) +- Add pybind11-stubgen to conda environment yaml. ([#109](https://github.com/nv-morpheus/Morpheus/pull/109)) [@drobison00](https://github.com/drobison00) +- Update hammah-inference.py ([#90](https://github.com/nv-morpheus/Morpheus/pull/90)) [@pdmack](https://github.com/pdmack) +- Install new apt key in docker ([#72](https://github.com/nv-morpheus/Morpheus/pull/72)) [@dagardner-nv](https://github.com/dagardner-nv) +- Ensure default path values in morpheus.cli are no longer relative ([#62](https://github.com/nv-morpheus/Morpheus/pull/62)) [@dagardner-nv](https://github.com/dagardner-nv) +- Fix the nlp_si_detection example ([#61](https://github.com/nv-morpheus/Morpheus/pull/61)) [@dagardner-nv](https://github.com/dagardner-nv) + +## 📖 Documentation + +- Fix GNN example and update installation instructions ([#189](https://github.com/nv-morpheus/Morpheus/pull/189)) [@cwharris](https://github.com/cwharris) +- Documentation fixes ([#147](https://github.com/nv-morpheus/Morpheus/pull/147)) [@dagardner-nv](https://github.com/dagardner-nv) +- Update morpheus_quickstart_guide.md ([#142](https://github.com/nv-morpheus/Morpheus/pull/142)) [@pdmack](https://github.com/pdmack) +- Split data dir, moving large files into examples/data ([#130](https://github.com/nv-morpheus/Morpheus/pull/130)) [@dagardner-nv](https://github.com/dagardner-nv) +- Update morpheus_quickstart_guide.md ([#127](https://github.com/nv-morpheus/Morpheus/pull/127)) [@bsuryadevara](https://github.com/bsuryadevara) +- Update morpheus_quickstart_guide.md ([#106](https://github.com/nv-morpheus/Morpheus/pull/106)) [@pdmack](https://github.com/pdmack) +- Apply enterprise sphinx html theme to docs ([#97](https://github.com/nv-morpheus/Morpheus/pull/97)) [@efajardo-nv](https://github.com/efajardo-nv) +- Updates to developer_guide for clarity. ([#96](https://github.com/nv-morpheus/Morpheus/pull/96)) [@lobotmcj](https://github.com/lobotmcj) +- Updates to README.md for clarity ([#91](https://github.com/nv-morpheus/Morpheus/pull/91)) [@BartleyR](https://github.com/BartleyR) +- Update README.md ([#76](https://github.com/nv-morpheus/Morpheus/pull/76)) [@pdmack](https://github.com/pdmack) +- Fix typos in README.md & Change GitLab-style reference in CONTRIBUTING.md ([#74](https://github.com/nv-morpheus/Morpheus/pull/74)) [@lobotmcj](https://github.com/lobotmcj) +- Updated README with documentation links and banner image ([#71](https://github.com/nv-morpheus/Morpheus/pull/71)) [@BartleyR](https://github.com/BartleyR) + +## 🚀 New Features + +- Fix 22.06 style checks ([#249](https://github.com/nv-morpheus/Morpheus/pull/249)) [@mdemoret-nv](https://github.com/mdemoret-nv) +- Add CLI Relative Path Fallback ([#232](https://github.com/nv-morpheus/Morpheus/pull/232)) [@mdemoret-nv](https://github.com/mdemoret-nv) +- Adding new SRF cmake variables ([#198](https://github.com/nv-morpheus/Morpheus/pull/198)) [@mdemoret-nv](https://github.com/mdemoret-nv) +- ransomware ds requirements ([#196](https://github.com/nv-morpheus/Morpheus/pull/196)) [@raykallen](https://github.com/raykallen) +- Update to rapids 22.06 ([#180](https://github.com/nv-morpheus/Morpheus/pull/180)) [@cwharris](https://github.com/cwharris) +- Fix for CI check script ([#158](https://github.com/nv-morpheus/Morpheus/pull/158)) [@dagardner-nv](https://github.com/dagardner-nv) +- Update Morpheus to Use SRF 22.06 ([#152](https://github.com/nv-morpheus/Morpheus/pull/152)) [@mdemoret-nv](https://github.com/mdemoret-nv) +- Ransomware detection pipeline ([#149](https://github.com/nv-morpheus/Morpheus/pull/149)) [@bsuryadevara](https://github.com/bsuryadevara) +- update cudf to 22.04, cuda to 11.5 ([#148](https://github.com/nv-morpheus/Morpheus/pull/148)) [@cwharris](https://github.com/cwharris) +- Limit which lfs assets are pulled by default ([#139](https://github.com/nv-morpheus/Morpheus/pull/139)) [@dagardner-nv](https://github.com/dagardner-nv) +- AppShieldSource stage ([#136](https://github.com/nv-morpheus/Morpheus/pull/136)) [@bsuryadevara](https://github.com/bsuryadevara) +- Include C++ Unittests in CI ([#135](https://github.com/nv-morpheus/Morpheus/pull/135)) [@dagardner-nv](https://github.com/dagardner-nv) +- Set Python3_FIND_STRATEGY=Location ([#131](https://github.com/nv-morpheus/Morpheus/pull/131)) [@dagardner-nv](https://github.com/dagardner-nv) +- Migrate Neo's tensor code directly into Morpheus ([#129](https://github.com/nv-morpheus/Morpheus/pull/129)) [@dagardner-nv](https://github.com/dagardner-nv) +- Updating CODEOWNERS for New Organization ([#118](https://github.com/nv-morpheus/Morpheus/pull/118)) [@mdemoret-nv](https://github.com/mdemoret-nv) +- Add pybind11/cython stubs to Morpheus package ([#100](https://github.com/nv-morpheus/Morpheus/pull/100)) [@mdemoret-nv](https://github.com/mdemoret-nv) +- Reorganize the python package files ([#98](https://github.com/nv-morpheus/Morpheus/pull/98)) [@mdemoret-nv](https://github.com/mdemoret-nv) +- Update morpheus dev container to support flag for building with debug python build + source files. ([#81](https://github.com/nv-morpheus/Morpheus/pull/81)) [@drobison00](https://github.com/drobison00) + +## 🛠️ Improvements + +- Fixing Outstanding Style Errors ([#261](https://github.com/nv-morpheus/Morpheus/pull/261)) [@mdemoret-nv](https://github.com/mdemoret-nv) +- Pin cuda-python to 11.7.0 ([#246](https://github.com/nv-morpheus/Morpheus/pull/246)) [@dagardner-nv](https://github.com/dagardner-nv) +- Fixes Pipeline.visualize ([#203](https://github.com/nv-morpheus/Morpheus/pull/203)) [@dagardner-nv](https://github.com/dagardner-nv) +- nlp_si_detection example improvements ([#193](https://github.com/nv-morpheus/Morpheus/pull/193)) [@dagardner-nv](https://github.com/dagardner-nv) +- Update GNN FSI pipeline example & notebook. ([#182](https://github.com/nv-morpheus/Morpheus/pull/182)) [@tzemicheal](https://github.com/tzemicheal) +- Add missing git-lfs package to docker container ([#179](https://github.com/nv-morpheus/Morpheus/pull/179)) [@dagardner-nv](https://github.com/dagardner-nv) +- release container build fixes ([#164](https://github.com/nv-morpheus/Morpheus/pull/164)) [@cwharris](https://github.com/cwharris) +- remove ssh instructions from CONTRIBUTING guide ([#162](https://github.com/nv-morpheus/Morpheus/pull/162)) [@cwharris](https://github.com/cwharris) +- Update mlflow-env.yml ([#146](https://github.com/nv-morpheus/Morpheus/pull/146)) [@pdmack](https://github.com/pdmack) +- Add script to capture triton config ([#116](https://github.com/nv-morpheus/Morpheus/pull/116)) [@pdmack](https://github.com/pdmack) +- Update mlflow-env.yml ([#113](https://github.com/nv-morpheus/Morpheus/pull/113)) [@pdmack](https://github.com/pdmack) +- Jenkins improvememts ([#107](https://github.com/nv-morpheus/Morpheus/pull/107)) [@dagardner-nv](https://github.com/dagardner-nv) +- Rename mlflow conda env file ([#82](https://github.com/nv-morpheus/Morpheus/pull/82)) [@pdmack](https://github.com/pdmack) +- Jenkins integration ([#80](https://github.com/nv-morpheus/Morpheus/pull/80)) [@dagardner-nv](https://github.com/dagardner-nv) +- Revert "Install new apt key" ([#79](https://github.com/nv-morpheus/Morpheus/pull/79)) [@dagardner-nv](https://github.com/dagardner-nv) +- Clear log handlers after each test ([#66](https://github.com/nv-morpheus/Morpheus/pull/66)) [@dagardner-nv](https://github.com/dagardner-nv) +- Fix type-o in log parsing example & small formatting fix ([#58](https://github.com/nv-morpheus/Morpheus/pull/58)) [@dagardner-nv](https://github.com/dagardner-nv) + +## ⚠️ Known Issues + +- Triton 22.04 can crash under heavy load from Morpheus+Kafka ([#259](https://github.com/nv-morpheus/Morpheus/issues/259)) + + +# Morpheus 22.04.00 (27 Apr 2022) + +## Initial Public Release + +Morpheus is being provided as OSS and is now generally available on GitHub as well as NGC (NVIDIA GPU Cloud). Morpheus is still early software and a work in progress. Breaking changes (including breaking API changes) are to be expected + +### Highlights + +- GNN (Graph Neural Networking) based workflow for fraud detection +- Transformer based workflow for log parsing +- Updated Morpheus to use the features for pipeline development + +## 🐛 Bug Fixes + +- Fix default DOCKER_IMAGE_TAG to match that of build_container_release.sh ([#33](https://github.com/nv-morpheus/Morpheus/pull/33)) [@dagardner-nv](https://github.com/dagardner-nv) +- fix incorrect bert vocab and hash in training-tuning-scripts/log-parsing/resources ([#32](https://github.com/nv-morpheus/Morpheus/pull/32)) [@raykallen](https://github.com/raykallen) +- Removing `no_args_is_help` from CLI commands ([#29](https://github.com/nv-morpheus/Morpheus/pull/29)) [@mdemoret-nv](https://github.com/mdemoret-nv) +- Log parsing example updates ([#28](https://github.com/nv-morpheus/Morpheus/pull/28)) [@efajardo-nv](https://github.com/efajardo-nv) +- fix to_file "overwrite" option for cli ([#15](https://github.com/nv-morpheus/Morpheus/pull/15)) [@cwharris](https://github.com/cwharris) + +## 📖 Documentation + +Documentation is provided in the Morpheus GitHub repo (https://github.com/NVIDIA/Morpheus/tree/branch-22.04/docs) + +- Update CONTRIBUTING.md & fix file ownership ([#27](https://github.com/nv-morpheus/Morpheus/pull/27)) [@dagardner-nv](https://github.com/dagardner-nv) +- README updates to provide NGC links ([#25](https://github.com/nv-morpheus/Morpheus/pull/25)) [@BartleyR](https://github.com/BartleyR) +- Move model card info to readme and model-information.csv ([#20](https://github.com/nv-morpheus/Morpheus/pull/20)) [@raykallen](https://github.com/raykallen) + +## 🛠️ Improvements + +- TensorRT installation warning for onnx_to_trt ([#23](https://github.com/nv-morpheus/Morpheus/pull/23)) [@cwharris](https://github.com/cwharris) + +## ⚠️ Known Issues + +- No known issues

    C-u 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ⅅ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%0D4@+<#IZ%C+FRvCm+|id_Z+4f0o$InBCzOlVo{ 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