From 91ecaec92169b0d08e6bc2bbad8c90e31488ea99 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Tue, 19 May 2020 20:14:57 +0100 Subject: [PATCH] Adding AWS IOT resources to draw a full solution --- config.py | 1 + diagrams/aws/iot.py | 40 +++ docs/nodes/aws.md | 342 ++++++++++++----------- resources/aws/iot/iot-alexa-echo.png | Bin 0 -> 3244 bytes resources/aws/iot/iot-alexa-skill.png | Bin 0 -> 5313 bytes resources/aws/iot/iot-camera.png | Bin 0 -> 4001 bytes resources/aws/iot/iot-certificate.png | Bin 0 -> 5479 bytes resources/aws/iot/iot-hardware-board.png | Bin 0 -> 4136 bytes resources/aws/iot/iot-jobs.png | Bin 0 -> 4394 bytes resources/aws/iot/iot-mqtt.png | Bin 0 -> 2734 bytes resources/aws/iot/iot-rule.png | Bin 0 -> 3513 bytes resources/aws/iot/iot-shadow.png | Bin 0 -> 4963 bytes resources/aws/iot/iot-topic.png | Bin 0 -> 3116 bytes 13 files changed, 217 insertions(+), 166 deletions(-) create mode 100644 resources/aws/iot/iot-alexa-echo.png create mode 100644 resources/aws/iot/iot-alexa-skill.png create mode 100644 resources/aws/iot/iot-camera.png create mode 100644 resources/aws/iot/iot-certificate.png create mode 100644 resources/aws/iot/iot-hardware-board.png create mode 100644 resources/aws/iot/iot-jobs.png create mode 100644 resources/aws/iot/iot-mqtt.png create mode 100644 resources/aws/iot/iot-rule.png create mode 100644 resources/aws/iot/iot-shadow.png create mode 100644 resources/aws/iot/iot-topic.png diff --git a/config.py b/config.py index 34db7ecf..f755893d 100644 --- a/config.py +++ b/config.py @@ -150,6 +150,7 @@ ALIASES = { }, "iot": { "Freertos": "FreeRTOS", + "IotHardwareBoard": "IotBoard", }, "management": { "SystemsManager": "SSM", diff --git a/diagrams/aws/iot.py b/diagrams/aws/iot.py index d413d3ed..8ca48eb7 100644 --- a/diagrams/aws/iot.py +++ b/diagrams/aws/iot.py @@ -20,6 +20,14 @@ class Iot1Click(_Iot): _icon = "iot-1-click.png" +class IotAlexaEcho(_Iot): + _icon = "iot-alexa-echo.png" + + +class IotAlexaSkill(_Iot): + _icon = "iot-alexa-skill.png" + + class IotAnalytics(_Iot): _icon = "iot-analytics.png" @@ -28,6 +36,14 @@ class IotButton(_Iot): _icon = "iot-button.png" +class IotCamera(_Iot): + _icon = "iot-camera.png" + + +class IotCertificate(_Iot): + _icon = "iot-certificate.png" + + class IotCore(_Iot): _icon = "iot-core.png" @@ -48,6 +64,26 @@ class IotGreengrass(_Iot): _icon = "iot-greengrass.png" +class IotHardwareBoard(_Iot): + _icon = "iot-hardware-board.png" + + +class IotJobs(_Iot): + _icon = "iot-jobs.png" + + +class IotMqtt(_Iot): + _icon = "iot-mqtt.png" + + +class IotRule(_Iot): + _icon = "iot-rule.png" + + +class IotShadow(_Iot): + _icon = "iot-shadow.png" + + class IotSitewise(_Iot): _icon = "iot-sitewise.png" @@ -56,6 +92,10 @@ class IotThingsGraph(_Iot): _icon = "iot-things-graph.png" +class IotTopic(_Iot): + _icon = "iot-topic.png" + + # Aliases FreeRTOS = Freertos diff --git a/docs/nodes/aws.md b/docs/nodes/aws.md index e5788ac6..8b1fd827 100644 --- a/docs/nodes/aws.md +++ b/docs/nodes/aws.md @@ -5,6 +5,56 @@ title: AWS Node classes list of aws provider. +## aws.analytics + +- **diagrams.aws.analytics.Analytics** +- **diagrams.aws.analytics.Athena** +- **diagrams.aws.analytics.CloudsearchSearchDocuments** +- **diagrams.aws.analytics.Cloudsearch** +- **diagrams.aws.analytics.DataPipeline** +- **diagrams.aws.analytics.ElasticsearchService**, **ES** (alias) +- **diagrams.aws.analytics.EMRCluster** +- **diagrams.aws.analytics.EMRHdfsCluster** +- **diagrams.aws.analytics.EMR** +- **diagrams.aws.analytics.GlueCrawlers** +- **diagrams.aws.analytics.GlueDataCatalog** +- **diagrams.aws.analytics.Glue** +- **diagrams.aws.analytics.KinesisDataAnalytics** +- **diagrams.aws.analytics.KinesisDataFirehose** +- **diagrams.aws.analytics.KinesisDataStreams** +- **diagrams.aws.analytics.KinesisVideoStreams** +- **diagrams.aws.analytics.Kinesis** +- **diagrams.aws.analytics.LakeFormation** +- **diagrams.aws.analytics.ManagedStreamingForKafka** +- **diagrams.aws.analytics.Quicksight** +- **diagrams.aws.analytics.RedshiftDenseComputeNode** +- **diagrams.aws.analytics.RedshiftDenseStorageNode** +- **diagrams.aws.analytics.Redshift** + +## aws.compute + +- **diagrams.aws.compute.ApplicationAutoScaling**, **AutoScaling** (alias) +- **diagrams.aws.compute.Batch** +- **diagrams.aws.compute.Compute** +- **diagrams.aws.compute.EC2ContainerRegistry**, **ECR** (alias) +- **diagrams.aws.compute.EC2** +- **diagrams.aws.compute.ElasticBeanstalk**, **EB** (alias) +- **diagrams.aws.compute.ElasticContainerService**, **ECS** (alias) +- **diagrams.aws.compute.ElasticKubernetesService**, **EKS** (alias) +- **diagrams.aws.compute.Fargate** +- **diagrams.aws.compute.Lambda** +- **diagrams.aws.compute.Lightsail** +- **diagrams.aws.compute.Outposts** +- **diagrams.aws.compute.ServerlessApplicationRepository**, **SAR** (alias) +- **diagrams.aws.compute.ThinkboxDeadline** +- **diagrams.aws.compute.ThinkboxDraft** +- **diagrams.aws.compute.ThinkboxFrost** +- **diagrams.aws.compute.ThinkboxKrakatoa** +- **diagrams.aws.compute.ThinkboxSequoia** +- **diagrams.aws.compute.ThinkboxStoke** +- **diagrams.aws.compute.ThinkboxXmesh** +- **diagrams.aws.compute.VmwareCloudOnAWS** + ## aws.database - **diagrams.aws.database.Aurora** @@ -20,27 +70,25 @@ Node classes list of aws provider. - **diagrams.aws.database.Redshift** - **diagrams.aws.database.Timestream** -## aws.security +## aws.devtools -- **diagrams.aws.security.Artifact** -- **diagrams.aws.security.CertificateManager**, **ACM** (alias) -- **diagrams.aws.security.CloudDirectory** -- **diagrams.aws.security.Cloudhsm**, **CloudHSM** (alias) -- **diagrams.aws.security.Cognito** -- **diagrams.aws.security.DirectoryService**, **DS** (alias) -- **diagrams.aws.security.FirewallManager**, **FMS** (alias) -- **diagrams.aws.security.Guardduty** -- **diagrams.aws.security.IdentityAndAccessManagementIam**, **IAM** (alias) -- **diagrams.aws.security.Inspector** -- **diagrams.aws.security.KeyManagementService**, **KMS** (alias) -- **diagrams.aws.security.Macie** -- **diagrams.aws.security.ResourceAccessManager**, **RAM** (alias) -- **diagrams.aws.security.SecretsManager** -- **diagrams.aws.security.SecurityHub** -- **diagrams.aws.security.SecurityIdentityAndCompliance** -- **diagrams.aws.security.Shield** -- **diagrams.aws.security.SingleSignOn** -- **diagrams.aws.security.WAF** +- **diagrams.aws.devtools.CloudDevelopmentKit** +- **diagrams.aws.devtools.Cloud9** +- **diagrams.aws.devtools.Codebuild** +- **diagrams.aws.devtools.Codecommit** +- **diagrams.aws.devtools.Codedeploy** +- **diagrams.aws.devtools.Codepipeline** +- **diagrams.aws.devtools.Codestar** +- **diagrams.aws.devtools.CommandLineInterface**, **CLI** (alias) +- **diagrams.aws.devtools.DeveloperTools**, **DevTools** (alias) +- **diagrams.aws.devtools.ToolsAndSdks** +- **diagrams.aws.devtools.XRay** + +## aws.engagement + +- **diagrams.aws.engagement.Connect** +- **diagrams.aws.engagement.Pinpoint** +- **diagrams.aws.engagement.SimpleEmailServiceSes**, **SES** (alias) ## aws.integration @@ -53,31 +101,30 @@ Node classes list of aws provider. - **diagrams.aws.integration.SimpleQueueServiceSqs**, **SQS** (alias) - **diagrams.aws.integration.StepFunctions**, **SF** (alias) -## aws.network +## aws.iot -- **diagrams.aws.network.APIGateway** -- **diagrams.aws.network.AppMesh** -- **diagrams.aws.network.ClientVpn** -- **diagrams.aws.network.CloudMap** -- **diagrams.aws.network.CloudFront**, **CF** (alias) -- **diagrams.aws.network.DirectConnect** -- **diagrams.aws.network.ElasticLoadBalancing**, **ELB** (alias) -- **diagrams.aws.network.Endpoint** -- **diagrams.aws.network.GlobalAccelerator**, **GAX** (alias) -- **diagrams.aws.network.InternetGateway** -- **diagrams.aws.network.Nacl** -- **diagrams.aws.network.NATGateway** -- **diagrams.aws.network.NetworkingAndContentDelivery** -- **diagrams.aws.network.PrivateSubnet** -- **diagrams.aws.network.Privatelink** -- **diagrams.aws.network.PublicSubnet** -- **diagrams.aws.network.Route53** -- **diagrams.aws.network.RouteTable** -- **diagrams.aws.network.SiteToSiteVpn** -- **diagrams.aws.network.TransitGateway** -- **diagrams.aws.network.VPCPeering** -- **diagrams.aws.network.VPCRouter** -- **diagrams.aws.network.VPC** +- **diagrams.aws.iot.Freertos**, **FreeRTOS** (alias) +- **diagrams.aws.iot.InternetOfThings** +- **diagrams.aws.iot.Iot1Click** +- **diagrams.aws.iot.IotAlexaEcho** +- **diagrams.aws.iot.IotAlexaSkill** +- **diagrams.aws.iot.IotAnalytics** +- **diagrams.aws.iot.IotButton** +- **diagrams.aws.iot.IotCamera** +- **diagrams.aws.iot.IotCertificate** +- **diagrams.aws.iot.IotCore** +- **diagrams.aws.iot.IotDeviceDefender** +- **diagrams.aws.iot.IotDeviceManagement** +- **diagrams.aws.iot.IotEvents** +- **diagrams.aws.iot.IotGreengrass** +- **diagrams.aws.iot.IotHardwareBoard** +- **diagrams.aws.iot.IotJobs** +- **diagrams.aws.iot.IotMqtt** +- **diagrams.aws.iot.IotRule** +- **diagrams.aws.iot.IotShadow** +- **diagrams.aws.iot.IotSitewise** +- **diagrams.aws.iot.IotThingsGraph** +- **diagrams.aws.iot.IotTopic** ## aws.management @@ -100,83 +147,33 @@ Node classes list of aws provider. - **diagrams.aws.management.TrustedAdvisor** - **diagrams.aws.management.WellArchitectedTool** -## aws.storage - -- **diagrams.aws.storage.Backup** -- **diagrams.aws.storage.CloudendureDisasterRecovery**, **CDR** (alias) -- **diagrams.aws.storage.EFSInfrequentaccessPrimaryBg** -- **diagrams.aws.storage.EFSStandardPrimaryBg** -- **diagrams.aws.storage.ElasticBlockStoreEBS**, **EBS** (alias) -- **diagrams.aws.storage.ElasticFileSystemEFS**, **EFS** (alias) -- **diagrams.aws.storage.FsxForLustre** -- **diagrams.aws.storage.FsxForWindowsFileServer** -- **diagrams.aws.storage.Fsx**, **FSx** (alias) -- **diagrams.aws.storage.S3Glacier** -- **diagrams.aws.storage.SimpleStorageServiceS3**, **S3** (alias) -- **diagrams.aws.storage.SnowballEdge** -- **diagrams.aws.storage.Snowball** -- **diagrams.aws.storage.Snowmobile** -- **diagrams.aws.storage.StorageGateway** -- **diagrams.aws.storage.Storage** - -## aws.iot - -- **diagrams.aws.iot.Freertos**, **FreeRTOS** (alias) -- **diagrams.aws.iot.InternetOfThings** -- **diagrams.aws.iot.Iot1Click** -- **diagrams.aws.iot.IotAnalytics** -- **diagrams.aws.iot.IotButton** -- **diagrams.aws.iot.IotCore** -- **diagrams.aws.iot.IotDeviceDefender** -- **diagrams.aws.iot.IotDeviceManagement** -- **diagrams.aws.iot.IotEvents** -- **diagrams.aws.iot.IotGreengrass** -- **diagrams.aws.iot.IotSitewise** -- **diagrams.aws.iot.IotThingsGraph** - -## aws.engagement - -- **diagrams.aws.engagement.Connect** -- **diagrams.aws.engagement.Pinpoint** -- **diagrams.aws.engagement.SimpleEmailServiceSes**, **SES** (alias) - -## aws.compute +## aws.media -- **diagrams.aws.compute.ApplicationAutoScaling**, **AutoScaling** (alias) -- **diagrams.aws.compute.Batch** -- **diagrams.aws.compute.Compute** -- **diagrams.aws.compute.EC2ContainerRegistry**, **ECR** (alias) -- **diagrams.aws.compute.EC2** -- **diagrams.aws.compute.ElasticBeanstalk**, **EB** (alias) -- **diagrams.aws.compute.ElasticContainerService**, **ECS** (alias) -- **diagrams.aws.compute.ElasticKubernetesService**, **EKS** (alias) -- **diagrams.aws.compute.Fargate** -- **diagrams.aws.compute.Lambda** -- **diagrams.aws.compute.Lightsail** -- **diagrams.aws.compute.Outposts** -- **diagrams.aws.compute.ServerlessApplicationRepository**, **SAR** (alias) -- **diagrams.aws.compute.ThinkboxDeadline** -- **diagrams.aws.compute.ThinkboxDraft** -- **diagrams.aws.compute.ThinkboxFrost** -- **diagrams.aws.compute.ThinkboxKrakatoa** -- **diagrams.aws.compute.ThinkboxSequoia** -- **diagrams.aws.compute.ThinkboxStoke** -- **diagrams.aws.compute.ThinkboxXmesh** -- **diagrams.aws.compute.VmwareCloudOnAWS** +- **diagrams.aws.media.ElasticTranscoder** +- **diagrams.aws.media.ElementalConductor** +- **diagrams.aws.media.ElementalDelta** +- **diagrams.aws.media.ElementalLive** +- **diagrams.aws.media.ElementalMediaconnect** +- **diagrams.aws.media.ElementalMediaconvert** +- **diagrams.aws.media.ElementalMedialive** +- **diagrams.aws.media.ElementalMediapackage** +- **diagrams.aws.media.ElementalMediastore** +- **diagrams.aws.media.ElementalMediatailor** +- **diagrams.aws.media.ElementalServer** -## aws.devtools +## aws.migration -- **diagrams.aws.devtools.CloudDevelopmentKit** -- **diagrams.aws.devtools.Cloud9** -- **diagrams.aws.devtools.Codebuild** -- **diagrams.aws.devtools.Codecommit** -- **diagrams.aws.devtools.Codedeploy** -- **diagrams.aws.devtools.Codepipeline** -- **diagrams.aws.devtools.Codestar** -- **diagrams.aws.devtools.CommandLineInterface**, **CLI** (alias) -- **diagrams.aws.devtools.DeveloperTools**, **DevTools** (alias) -- **diagrams.aws.devtools.ToolsAndSdks** -- **diagrams.aws.devtools.XRay** +- **diagrams.aws.migration.ApplicationDiscoveryService**, **ADS** (alias) +- **diagrams.aws.migration.CloudendureMigration**, **CEM** (alias) +- **diagrams.aws.migration.DatabaseMigrationService**, **DMS** (alias) +- **diagrams.aws.migration.Datasync** +- **diagrams.aws.migration.MigrationAndTransfer**, **MAT** (alias) +- **diagrams.aws.migration.MigrationHub** +- **diagrams.aws.migration.ServerMigrationService**, **SMS** (alias) +- **diagrams.aws.migration.SnowballEdge** +- **diagrams.aws.migration.Snowball** +- **diagrams.aws.migration.Snowmobile** +- **diagrams.aws.migration.TransferForSftp** ## aws.ml @@ -200,56 +197,69 @@ Node classes list of aws provider. - **diagrams.aws.ml.Transcribe** - **diagrams.aws.ml.Translate** -## aws.migration +## aws.network -- **diagrams.aws.migration.ApplicationDiscoveryService**, **ADS** (alias) -- **diagrams.aws.migration.CloudendureMigration**, **CEM** (alias) -- **diagrams.aws.migration.DatabaseMigrationService**, **DMS** (alias) -- **diagrams.aws.migration.Datasync** -- **diagrams.aws.migration.MigrationAndTransfer**, **MAT** (alias) -- **diagrams.aws.migration.MigrationHub** -- **diagrams.aws.migration.ServerMigrationService**, **SMS** (alias) -- **diagrams.aws.migration.SnowballEdge** -- **diagrams.aws.migration.Snowball** -- **diagrams.aws.migration.Snowmobile** -- **diagrams.aws.migration.TransferForSftp** +- **diagrams.aws.network.APIGateway** +- **diagrams.aws.network.AppMesh** +- **diagrams.aws.network.ClientVpn** +- **diagrams.aws.network.CloudMap** +- **diagrams.aws.network.CloudFront**, **CF** (alias) +- **diagrams.aws.network.DirectConnect** +- **diagrams.aws.network.ElasticLoadBalancing**, **ELB** (alias) +- **diagrams.aws.network.Endpoint** +- **diagrams.aws.network.GlobalAccelerator**, **GAX** (alias) +- **diagrams.aws.network.InternetGateway** +- **diagrams.aws.network.Nacl** +- **diagrams.aws.network.NATGateway** +- **diagrams.aws.network.NetworkingAndContentDelivery** +- **diagrams.aws.network.PrivateSubnet** +- **diagrams.aws.network.Privatelink** +- **diagrams.aws.network.PublicSubnet** +- **diagrams.aws.network.Route53** +- **diagrams.aws.network.RouteTable** +- **diagrams.aws.network.SiteToSiteVpn** +- **diagrams.aws.network.TransitGateway** +- **diagrams.aws.network.VPCPeering** +- **diagrams.aws.network.VPCRouter** +- **diagrams.aws.network.VPC** -## aws.analytics +## aws.security -- **diagrams.aws.analytics.Analytics** -- **diagrams.aws.analytics.Athena** -- **diagrams.aws.analytics.CloudsearchSearchDocuments** -- **diagrams.aws.analytics.Cloudsearch** -- **diagrams.aws.analytics.DataPipeline** -- **diagrams.aws.analytics.ElasticsearchService**, **ES** (alias) -- **diagrams.aws.analytics.EMRCluster** -- **diagrams.aws.analytics.EMRHdfsCluster** -- **diagrams.aws.analytics.EMR** -- **diagrams.aws.analytics.GlueCrawlers** -- **diagrams.aws.analytics.GlueDataCatalog** -- **diagrams.aws.analytics.Glue** -- **diagrams.aws.analytics.KinesisDataAnalytics** -- **diagrams.aws.analytics.KinesisDataFirehose** -- **diagrams.aws.analytics.KinesisDataStreams** -- **diagrams.aws.analytics.KinesisVideoStreams** -- **diagrams.aws.analytics.Kinesis** -- **diagrams.aws.analytics.LakeFormation** -- **diagrams.aws.analytics.ManagedStreamingForKafka** -- **diagrams.aws.analytics.Quicksight** -- **diagrams.aws.analytics.RedshiftDenseComputeNode** -- **diagrams.aws.analytics.RedshiftDenseStorageNode** -- **diagrams.aws.analytics.Redshift** +- **diagrams.aws.security.Artifact** +- **diagrams.aws.security.CertificateManager**, **ACM** (alias) +- **diagrams.aws.security.CloudDirectory** +- **diagrams.aws.security.Cloudhsm**, **CloudHSM** (alias) +- **diagrams.aws.security.Cognito** +- **diagrams.aws.security.DirectoryService**, **DS** (alias) +- **diagrams.aws.security.FirewallManager**, **FMS** (alias) +- **diagrams.aws.security.Guardduty** +- **diagrams.aws.security.IdentityAndAccessManagementIam**, **IAM** (alias) +- **diagrams.aws.security.Inspector** +- **diagrams.aws.security.KeyManagementService**, **KMS** (alias) +- **diagrams.aws.security.Macie** +- **diagrams.aws.security.ResourceAccessManager**, **RAM** (alias) +- **diagrams.aws.security.SecretsManager** +- **diagrams.aws.security.SecurityHub** +- **diagrams.aws.security.SecurityIdentityAndCompliance** +- **diagrams.aws.security.Shield** +- **diagrams.aws.security.SingleSignOn** +- **diagrams.aws.security.WAF** -## aws.media +## aws.storage -- **diagrams.aws.media.ElasticTranscoder** -- **diagrams.aws.media.ElementalConductor** -- **diagrams.aws.media.ElementalDelta** -- **diagrams.aws.media.ElementalLive** -- **diagrams.aws.media.ElementalMediaconnect** -- **diagrams.aws.media.ElementalMediaconvert** -- **diagrams.aws.media.ElementalMedialive** -- **diagrams.aws.media.ElementalMediapackage** -- **diagrams.aws.media.ElementalMediastore** -- **diagrams.aws.media.ElementalMediatailor** -- **diagrams.aws.media.ElementalServer** +- **diagrams.aws.storage.Backup** +- **diagrams.aws.storage.CloudendureDisasterRecovery**, **CDR** (alias) +- **diagrams.aws.storage.EFSInfrequentaccessPrimaryBg** +- **diagrams.aws.storage.EFSStandardPrimaryBg** +- **diagrams.aws.storage.ElasticBlockStoreEBS**, **EBS** (alias) +- **diagrams.aws.storage.ElasticFileSystemEFS**, **EFS** (alias) +- **diagrams.aws.storage.FsxForLustre** +- **diagrams.aws.storage.FsxForWindowsFileServer** +- **diagrams.aws.storage.Fsx**, **FSx** (alias) +- **diagrams.aws.storage.S3Glacier** +- **diagrams.aws.storage.SimpleStorageServiceS3**, **S3** (alias) +- **diagrams.aws.storage.SnowballEdge** +- **diagrams.aws.storage.Snowball** +- **diagrams.aws.storage.Snowmobile** +- **diagrams.aws.storage.StorageGateway** +- **diagrams.aws.storage.Storage** diff --git a/resources/aws/iot/iot-alexa-echo.png b/resources/aws/iot/iot-alexa-echo.png new file mode 100644 index 0000000000000000000000000000000000000000..3c1b998733f69c93216c48e44ec045383e83ff7f GIT binary patch literal 3244 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 literal 0 HcmV?d00001 diff --git a/resources/aws/iot/iot-hardware-board.png b/resources/aws/iot/iot-hardware-board.png new file mode 100644 index 0000000000000000000000000000000000000000..d7224b2f70fe55ce47ef7dd05a6e4389658877bf GIT binary patch literal 4136 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 literal 0 HcmV?d00001 diff --git a/resources/aws/iot/iot-jobs.png b/resources/aws/iot/iot-jobs.png new file mode 100644 index 0000000000000000000000000000000000000000..6690df51196a5a15abfbbfca5e5a733de9bf5a5c GIT binary patch literal 4394 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 GeDxov98rb< literal 0 HcmV?d00001 diff --git a/resources/aws/iot/iot-mqtt.png b/resources/aws/iot/iot-mqtt.png new file mode 100644 index 0000000000000000000000000000000000000000..308866c5ef2c382224d161a438a25c20da4d5d47 GIT binary patch literal 2734 zcmeHJ`8OMg6DQ)V`>I7FwMeURS6rpeMc1yXrjE36wNX`95p~B=w2n>b3QJw3>WW4x z?pq^>(z?&+Hg!iFMM=ZjpTGMje1DjkH}B1x_vZ7NnfG~m{da320a*bK4h|t(8_OG~ zk@Bzc@tpb^XM6z%hd`*UrP+sUep-?&rAcI$HOB@G=!lv5(t z&!}0HvY&2$6((^X6rMY+_(R7+)ehtLs<3Pb{YXc2K7k?^on|boU-w7xd7q=mPN`3k zHcop6pXm=jhD_$PklOciJIGNK!BxcJ7xZs_x%%;kHL7bZ_?M)5n?Tc2aIK>K8WJU8 zXwR3TtT3fV&KXSU*+>pufH!ss*tjzZPcKjuHl8|J-QnI8Q5qbC;+}Lb?z>3smH0yB zGK(-2!#;($fMaj?m|h$UkkCI!O`;!k&R-3w$pUg)l4J8ai^o}&Zzkg)e1htp;{C$) z(yr$oa*1oF)+@^A2>2v0xzNTqQjOvIit&PsS37s>Pd%z>*Lnlj&oTggc#zWFh3|2J z?hi|UGXZW?lD6@f#LH3LafG$`7zCH%`|wG&{DIw9&+1aYg|H3udB6Ez*Uik;x0;2f zc=canVKXxm^_UQ~(kn#s3_=#{XpVsJMKC2qyW=WW9#q+KuDX&$+WEQl>+q!0(yV|S zMQ{$5PMU#$JNwrqL^r>7-c)KBr(*(%60b|_5%*HKFYxgdfx(z~42J*!@c-mLF!+8r z1>umVB)>@D<3kmzuE7U_1PL76oSc$C;B`?^Q!`TzZld$)GPh}wp&8L2{rt)|muP6f z-`+jjgQHK(^_WuFQP?E6QrmA?wf+9M4dF#K z8s0C$*t|mU-bMypbgOEm-hw;OR9VP!B)<5~%rPTE7788%v!vMl7ka>M`komyOW0Dd z7qw$o`&a&5+n>R#(2IpjTK+d^b_-RRJj`8iPvvqp(@iXMQpS@(`|bWKTzLgFvUTz$ zM1FYZIBdw!B0|IiMq*g-uP)=s0jXtYt8ci#NO@KVR~my($u_ ztIIjvanG{$?M)LlJUn;)aS{q99}XWgO1CAc`7u6Ma88i)9`Fnt$bMk8IXlwWS3mEpD+i>T(g$XevjarVVaIaS z4j%mNB2sHti1{Y7{2^C^Pecq?#=P&cn}Te)-}DHF`KF(Z=|v2_2-x*afdn=hkCu7A zZ%<_w{FyLUuZNm@6lr>6Yt!pq1VfVj3##8U$$ztYCb+xuxPNst;cdJTs6DAwfMG?C zK_7JYPAB(-0849%<`ls{e?(imQ=*mA%kvs}BEQeP@Znrl9YMu5OjD|_jMmW;Sj$f9|On&CO`G==#^i?7;&0j1e@hlJWCGlVW-!twbw4 z8~E(;x2wW-YgxXB+%RC7N8Z!Ls_?3k1)KD3gTJHI@72&(^Mvc!+STRH4Th7`59JelACY`jg7|z3qZ$ZU)BOhNkwU?&#*tf z!rTsy$O|~mw7TenG>`vR$Yr@2Td3PP3?xU@`o|Ty t3mm1z@W|pItc?(2TyO-=OJS$SFM=;+uD^mWb8 zBl&-fnd#hD+td`D*CPycwJm}RHfJ~scF>0!*ZHDa5<^>^11j(@Cx*=hsp!(g5MC%OPidusVa3}Q8;s6#mm4># zk{UK{ zAm|GtGyIhQR@7tWLTu{~kMv*t5hSo&zDq3|)=;ceK>Z292~Qs1(Xt8cl^jlIA^Ewx z;Mw0W8<-A%IR(CBx{@-@(c@Hz?Ck#Ck|AKQwWoyes>%1cI-G8yd;6D!`PrCMOASn+ z11>&Gf%Sbpy0WZ~xi?+V*zr)`crnr@^}$bKcKT1KGA(6;m@ zIU(+7qI3Z3Z+biy$eb1l5H^<;(q(0GX`fn`x;V}v(-YB4sA>pHupFFq40TQ9iCXWK z7uxez;lj=ZlUzfA%!izYgH6|-wC!VTrHBuRvi^Ki=|N0aeWa}qs(o`ZrdWdv_RNa3 zYcLV|xjGu2I;ZBE*P-Am0Iw#qZF~*K%JA3>s+t zC2P*LLc~gL@Ob_^o4)>>o_^w+>~JcjU!SM5W7b#vE&?#=>>l zN=H>$JX+LzZqGl(Vt4|ZWwwO!IXtq5{E${3^5aMHm2kEB9zUN0_7(v=0_;d;u;@KP z(UW~|4O*h{yNtM!L+#k7oz`fPaH9qq^l|2+Pw}_A8{q@(l5L<`5h>Pc&U*jm*;n^# z{SXgpGOYOcYn=*$K5D$xk4rP!3Yr4m990k@TztA24e|5zNX#$E zQ}KX%XPy0Sc3Zv5tI>RCm(tEWOKh}n|2v=S$S`(|vvcf`;7shp09z*-%c@iOjp?N?h}7uMvjSU>w51zAgKvcss_-b>8G%PU!aj&Kz(C@ zJQZd4^tX-iac_R#J$0ES$_cS6ZeAw@J*W-7cnF^s*pzy99RlKfC+0c%4y@ULW}2AA zJBf!0{O0ck$qEUC1Xu0b{cSQh6KhQ?yDcYFblCjk^>xZ306OG0=z#2$(kHFOUk)zvDyj`^9W)LT@$tH^`#qvWBTy5FF2$1xu%8*&Oa-5=tuqR6YrEcf)n+-#jIHD?F0tl8pj%Y4+Ek3HhLCeTCU`6 z!tHjn(L}GR50DD_%NLThz*VKqq1CYNJh!wu5#;5AeW6Hpsyk9qaQ>^DgZ$s8dOTWa@!xM$0Zr}=|lUx!Jk$2?E)Wk( z7917`nJ*&%l`G<0C-MS%^Xuod@j@^#%DcUGHx2sf_k*w46fOpHu)s`#74YMRf}s^g zb!St z)Lu~!zio!znob-yG-a_`B9oWwy5r8(dy&Xw>-b8)Lor#8Fvonfy>HUd8;dUk~P(fX#RQ`GsG; zSk$isVyp#9(o3S-Qnqeq)V&?&G8qs}*w)Wl(bL%x%wWqr@H5hm?}%UerFHf|0n={( zG*3oJl42eb!#j^DS$tG3@1uurSA0I&u4=W7W^|1`M42gnD6P@n1)ZfNL+zh5;uQF( zyd?ds!Mfn*72kgxbX>eP74fR)FFYnCm>owEr23C9>sw|y?=d7}GE0H_eP6C_a2vDL z?)NQAAiRw9ebjx9`n?)nEd9K8j;9(VyFmazI|~uC7UU`U#52hkx`-}YPi-BTztO*J zWdYC@KW<$ZFcLq8`h-3>Y{;VUQ|qT7mA_e&yMth2mV+TPeTuRU2{(jtf1$kva%Ik{ zaYp-n6%Ai<^E{hX9UizQ$Eb)cPs~GFvJbiEv=xwSxD5=C668DfhkwHYv-J~C{OGgR zyQZ@$;X|RCHTUZ-lx^m1p5e%Y9g$`<7)cSQXvv&VdF4?8xzlh~V0`?=dB>1ua&_oB z+$nmH;yz76ywvRU_AJ9o^S5;#J0wfr(ah*rNy()a9i0;FqftYR4l`=KlWPiwVm8eX zOLj9ce7^M?+lAjLlT;;@LE%#!POiJ<%a%-9=OZdRO~*J_0qVR=t>AdGSUSc2ss-}A zIFPJ0&aD3hng?ofuC_F_GunG<8KibzRRrp%u^S464oBvRc=INd=F;CHnzRzEk6a8I zToPS3LV(XD7)c$$h?^G}%(vT{ff~c<&>F5L8F235Xr8OPv;#7Ir+ydT3i6{sQrAu7 zgird)T=K4&=l*O!-xSkQg3an!z)mjQkF9@3lw=78d)|kDIv;JG9)_=GKA7Yn)h~GD&B<$MyYV$vKcp5#=D8o@@?} zN)w)btEjL@naSB1-`MYOvrS>aUBl8=aK4DuvFi*-YU0^@8e>oKgMfe!Ll+rWIT(OV zC7f=5ZmmafQ=@GbTz4M3Bjh+zrl^nAI_2>d8Invi=4oKVnV@1)p`pH9C+O4F>B|R- zErp#%;tqW<5uEm5X{UCV4K~P=Kfp0~Nu9qb3)g-rzueweidm-7uGU15S7g3XfVG}sKLN(L={lv( z(WJc6+CVdB@Xmf8YF6jVQ!Y;}qYR@Ver#V82ficBTTXuqV6 zyUR56Yi`1=TE_Z-!g{OIF5ThH$fLXM9U(3IzA)z!wOH eyPfC1u(Pv_cR>Fpk0Q)@LT7NtM7KuAG4em!l5?H_ literal 0 HcmV?d00001 diff --git a/resources/aws/iot/iot-shadow.png b/resources/aws/iot/iot-shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..9fc50eb7b9d610d2422449d8f90a16b3fd88fa06 GIT binary patch literal 4963 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 literal 0 HcmV?d00001