{
  "$ref": "#/definitions/CloudFormationRegistryResource",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "definitions": {
    "CloudFormationRegistryResource": {
      "additionalProperties": false,
      "description": "Root class of a CloudFormation Resource Registry Schema",
      "properties": {
        "$comment": {
          "type": "string"
        },
        "$schema": {
          "type": "string"
        },
        "additionalIdentifiers": {
          "description": "Not sure what this is",
          "items": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "type": "array"
        },
        "additionalProperties": {
          "const": false,
          "description": "FIXME: should be required but some service teams have omitted it.",
          "type": "boolean"
        },
        "anyOf": {
          "items": {
            "$ref": "#/definitions/CommonTypeCombinatorFields"
          },
          "type": "array"
        },
        "conditionalCreateOnlyProperties": {
          "description": "JSON pointers for properties that *may* cause a resource replacement if they are changed",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "createOnlyProperties": {
          "description": "JSON pointers for properties that will cause a resource replacement if they are changed",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "definitions": {
          "additionalProperties": {
            "$ref": "#/definitions/jsonschema.Schema"
          },
          "description": "Reusable schema type definitions used in this schema.",
          "type": "object"
        },
        "deprecatedProperties": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "description": {
          "type": "string"
        },
        "documentationUrl": {
          "type": "string"
        },
        "handlers": {
          "$ref": "#/definitions/Handlers"
        },
        "maxProperties": {
          "type": "number"
        },
        "minProperties": {
          "description": "FIXME: these are weird but oh hey?",
          "type": "number"
        },
        "oneOf": {
          "description": "Technically this should have been canonicalized out, but that will complicate a lot of the rest of the code.\n\nSo we allow embedded oneOfs/anyOfs, only at the top level.",
          "items": {
            "$ref": "#/definitions/CommonTypeCombinatorFields"
          },
          "type": "array"
        },
        "primaryIdentifier": {
          "description": "The properties that make up the primary identifier of the resource.\n\nThis is the value that is returned by `{ Ref }`. If there is more than one property they are joined using the symbol `\"|\"`.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "properties": {
          "$ref": "#/definitions/jsonschema.ObjectProperties"
        },
        "propertyTransform": {
          "additionalProperties": {
            "type": "string"
          },
          "description": "Functions to apply to properties\n\nExample:\n\n``` \"propertyTransform\" : {   \"/properties/DBClusterIdentifier\" : \"$lowercase(DBClusterIdentifier)\",   \"/properties/DBClusterSnapshotIdentifier\" : \"$lowercase(DBClusterSnapshotIdentifier)\",   \"/properties/MasterUserSecret/KmsKeyId\" : \"$join([\\\"arn:(aws)[-]{0,1}[a-z]{0,2}[-]{0,1}[a-z]{0,3}:kms:[a-z]{2}[-]{1}[a-z]{3,10}[-]{0,1}[a-z]{0,10}[-]{1}[1-3]{1}:[0-9]{12}[:]{1}key\\\\/\\\", KmsKeyId])\",   \"/properties/KmsKeyId\" : \"$join([\\\"arn:(aws)[-]{0,1}[a-z]{0,2}[-]{0,1}[a-z]{0,3}:kms:[a-z]{2}[-]{1}[a-z]{3,10}[-]{0,1}[a-z]{0,10}[-]{1}[1-3]{1}:[0-9]{12}[:]{1}key\\\\/\\\", KmsKeyId])\",   \"/properties/PerformanceInsightsKMSKeyId\" : \"$join([\\\"arn:(aws)[-]{0,1}[a-z]{0,2}[-]{0,1}[a-z]{0,3}:kms:[a-z]{2}[-]{1}[a-z]{3,10}[-]{0,1}[a-z]{0,10}[-]{1}[1-3]{1}:[0-9]{12}[:]{1}key\\\\/\\\", PerformanceInsightsKMSKeyId])\" }, ```",
          "type": "object"
        },
        "readOnlyProperties": {
          "description": "JSON pointers for properties that can only be read, not updated.\n\nThis is typically used for generated identifiers and such.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "replacementStrategy": {
          "$ref": "#/definitions/ReplacementStrategy"
        },
        "required": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "resourceLink": {
          "$ref": "#/definitions/ResourceLink",
          "description": "How to construct a console link for a resource"
        },
        "sourceUrl": {
          "type": "string"
        },
        "taggable": {
          "default": true,
          "deprecated": "use 'tagging' instead",
          "description": "Whether the resource is taggable",
          "type": "boolean"
        },
        "tagging": {
          "$ref": "#/definitions/ResourceTagging",
          "description": "Extended tagging settings"
        },
        "title": {
          "type": "string"
        },
        "typeName": {
          "type": "string"
        },
        "writeOnlyProperties": {
          "description": "JSON pointers for properties that can only be written, never read.\n\nThis is typically used for secrets.",
          "items": {
            "type": "string"
          },
          "type": "array"
        }
      },
      "required": [
        "description",
        "properties",
        "typeName"
      ],
      "type": "object"
    },
    "CommonTypeCombinatorFields": {
      "additionalProperties": false,
      "description": "Type combinator fields we commonly see at the resource level\n\n(They can be nested)",
      "properties": {
        "allOf": {
          "items": {
            "$ref": "#/definitions/CommonTypeCombinatorFields"
          },
          "type": "array"
        },
        "anyOf": {
          "items": {
            "$ref": "#/definitions/CommonTypeCombinatorFields"
          },
          "type": "array"
        },
        "oneOf": {
          "items": {
            "$ref": "#/definitions/CommonTypeCombinatorFields"
          },
          "type": "array"
        },
        "required": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "type": {
          "type": "string"
        }
      },
      "type": "object"
    },
    "Handler": {
      "additionalProperties": false,
      "properties": {
        "permissions": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "timeoutInMinutes": {
          "type": "number"
        }
      },
      "required": [
        "permissions"
      ],
      "type": "object"
    },
    "Handlers": {
      "additionalProperties": false,
      "properties": {
        "create": {
          "$ref": "#/definitions/Handler"
        },
        "delete": {
          "$ref": "#/definitions/Handler"
        },
        "list": {
          "$ref": "#/definitions/Handler"
        },
        "read": {
          "$ref": "#/definitions/Handler"
        },
        "update": {
          "$ref": "#/definitions/Handler"
        }
      },
      "type": "object"
    },
    "ReplacementStrategy": {
      "const": "delete_then_create",
      "type": "string"
    },
    "ResourceLink": {
      "additionalProperties": false,
      "properties": {
        "mappings": {
          "additionalProperties": {
            "type": "string"
          },
          "description": "Example:\n\n`{ MetricName: '/MetricName', 'LogGroupName': '/LogGroupName' }`",
          "type": "object"
        },
        "templateUri": {
          "description": "Example:\n\n``` /cloudwatch/home?region=${awsRegion}#logsV2:log-groups/log-group/${LogGroupName}/edit-metric-filter/${MetricName} ```",
          "type": "string"
        }
      },
      "required": [
        "templateUri"
      ],
      "type": "object"
    },
    "ResourceTagging": {
      "additionalProperties": false,
      "properties": {
        "cloudFormationSystemTags": {
          "default": true,
          "description": "Whether this resource type supports CloudFormation system tags.",
          "type": "boolean"
        },
        "tagOnCreate": {
          "default": true,
          "description": "Whether this resource type supports tagging resources upon creation.",
          "type": "boolean"
        },
        "tagProperty": {
          "default": "/properties/Tags",
          "description": "A reference to where you have defined the Tags property in this resource type schema.",
          "type": "string"
        },
        "tagUpdatable": {
          "default": true,
          "description": "Whether this resource type supports updating tags during resource update operations.",
          "type": "boolean"
        },
        "taggable": {
          "default": true,
          "description": "Whether the resource is taggable",
          "type": "boolean"
        }
      },
      "type": "object"
    },
    "jsonschema.AllOf<Schema>": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "allOf": {
          "items": {
            "$ref": "#/definitions/jsonschema.Schema"
          },
          "type": "array"
        },
        "description": {
          "type": "string"
        },
        "title": {
          "type": "string"
        }
      },
      "required": [
        "allOf"
      ],
      "type": "object"
    },
    "jsonschema.AnyOf<Schema>": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "anyOf": {
          "items": {
            "$ref": "#/definitions/jsonschema.Schema"
          },
          "type": "array"
        },
        "description": {
          "type": "string"
        },
        "title": {
          "type": "string"
        }
      },
      "required": [
        "anyOf"
      ],
      "type": "object"
    },
    "jsonschema.AnyType": {
      "anyOf": [
        {
          "const": true,
          "type": "boolean"
        },
        {
          "$ref": "#/definitions/jsonschema.EmptyObject"
        }
      ]
    },
    "jsonschema.Boolean": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "default": {
          "type": "boolean"
        },
        "description": {
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "type": {
          "const": "boolean",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "jsonschema.ConcreteSingletonSchema": {
      "anyOf": [
        {
          "$ref": "#/definitions/jsonschema.Object"
        },
        {
          "$ref": "#/definitions/jsonschema.String"
        },
        {
          "$ref": "#/definitions/jsonschema.SchemaArray"
        },
        {
          "$ref": "#/definitions/jsonschema.Boolean"
        },
        {
          "$ref": "#/definitions/jsonschema.Number"
        },
        {
          "$ref": "#/definitions/jsonschema.Null"
        },
        {
          "$ref": "#/definitions/jsonschema.AnyType"
        }
      ]
    },
    "jsonschema.EmptyObject": {
      "additionalProperties": {
        "not": {}
      },
      "type": "object"
    },
    "jsonschema.MapLikeObject": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "additionalProperties": {
          "anyOf": [
            {
              "const": false,
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/jsonschema.Schema"
            }
          ],
          "default": true,
          "description": "additionalProperties validates all keys that aren't otherwise validated by properties or patternProperties"
        },
        "description": {
          "type": "string"
        },
        "maxProperties": {
          "type": "number"
        },
        "minProperties": {
          "type": "number"
        },
        "patternProperties": {
          "additionalProperties": {
            "$ref": "#/definitions/jsonschema.Schema"
          },
          "type": "object"
        },
        "required": {
          "description": "Required keys in a map\n\nDoesn't really make a whole lot of sense, but this is used to support mixed map/record types.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "title": {
          "type": "string"
        },
        "type": {
          "const": "object",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "jsonschema.Null": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "type": {
          "const": "null",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "jsonschema.Number": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "default": {
          "type": "number"
        },
        "description": {
          "type": "string"
        },
        "enum": {
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "format": {
          "enum": [
            "int64",
            "double"
          ],
          "type": "string"
        },
        "maximum": {
          "type": "number"
        },
        "minimum": {
          "type": "number"
        },
        "multipleOf": {
          "type": "number"
        },
        "title": {
          "type": "string"
        },
        "type": {
          "enum": [
            "number",
            "integer"
          ],
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "jsonschema.Object": {
      "anyOf": [
        {
          "$ref": "#/definitions/jsonschema.MapLikeObject"
        },
        {
          "$ref": "#/definitions/jsonschema.RecordLikeObject"
        }
      ]
    },
    "jsonschema.ObjectProperties": {
      "additionalProperties": {
        "$ref": "#/definitions/jsonschema.Schema"
      },
      "type": "object"
    },
    "jsonschema.OneOf<Schema>": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "oneOf": {
          "items": {
            "$ref": "#/definitions/jsonschema.Schema"
          },
          "type": "array"
        },
        "title": {
          "type": "string"
        }
      },
      "required": [
        "oneOf"
      ],
      "type": "object"
    },
    "jsonschema.RecordLikeObject": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "additionalProperties": {
          "const": false,
          "description": "FIXME: should be required but some service teams have omitted it.",
          "type": "boolean"
        },
        "anyOf": {
          "items": {
            "anyOf": [
              {
                "$ref": "#/definitions/CommonTypeCombinatorFields"
              },
              {
                "$ref": "#/definitions/jsonschema.RecordLikeObject"
              }
            ]
          },
          "type": "array"
        },
        "description": {
          "type": "string"
        },
        "maxProperties": {
          "type": "number"
        },
        "minProperties": {
          "description": "FIXME: these are weird but oh hey?",
          "type": "number"
        },
        "oneOf": {
          "items": {
            "anyOf": [
              {
                "$ref": "#/definitions/CommonTypeCombinatorFields"
              },
              {
                "$ref": "#/definitions/jsonschema.RecordLikeObject"
              }
            ]
          },
          "type": "array"
        },
        "properties": {
          "$ref": "#/definitions/jsonschema.ObjectProperties"
        },
        "required": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "title": {
          "type": "string"
        },
        "type": {
          "const": "object",
          "type": "string"
        }
      },
      "required": [
        "type",
        "properties"
      ],
      "type": "object"
    },
    "jsonschema.Reference": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "$ref": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "type": {
          "const": "object",
          "type": "string"
        }
      },
      "required": [
        "$ref"
      ],
      "type": "object"
    },
    "jsonschema.RelationshipRefSchema": {
      "additionalProperties": false,
      "description": "Relationship as defined in the CloudFormation Registry Schema. Represents how resource property relationships are specified in the source schema files.",
      "properties": {
        "propertyPath": {
          "description": "The property path (e.g. '/properties/BucketName')",
          "type": "string"
        },
        "typeName": {
          "description": "The cloudFormationType (e.g. 'AWS::S3::Bucket')",
          "type": "string"
        }
      },
      "required": [
        "typeName",
        "propertyPath"
      ],
      "type": "object"
    },
    "jsonschema.Schema": {
      "anyOf": [
        {
          "$ref": "#/definitions/jsonschema.SingletonSchema"
        },
        {
          "$ref": "#/definitions/jsonschema.OneOf%3CSchema%3E"
        },
        {
          "$ref": "#/definitions/jsonschema.AnyOf%3CSchema%3E"
        },
        {
          "$ref": "#/definitions/jsonschema.AllOf%3CSchema%3E"
        }
      ]
    },
    "jsonschema.SchemaArray": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "arrayType": {
          "description": "Does this array describe full reality?\n\n- If `Standard`, real elements must be exactly equal to the given array.\n- If `AttributeList`, the real array may be a superset of the given array.",
          "enum": [
            "AttributeList",
            "Standard"
          ],
          "type": "string"
        },
        "default": {
          "items": {},
          "type": "array"
        },
        "description": {
          "type": "string"
        },
        "examples": {
          "items": {},
          "type": "array"
        },
        "insertionOrder": {
          "description": "Whether to treat the order as significant\n\nIn other words, does this array model a \"sequence\" or a \"multiset\".\n\n- `true` (default): order is significant, the array is a sequence.\n- `false`: order is insignificant, the array is a set.",
          "type": "boolean"
        },
        "items": {
          "$ref": "#/definitions/jsonschema.Schema"
        },
        "maxItems": {
          "type": "number"
        },
        "minItems": {
          "type": "number"
        },
        "title": {
          "type": "string"
        },
        "type": {
          "const": "array",
          "type": "string"
        },
        "uniqueItems": {
          "type": "boolean"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "jsonschema.SingletonSchema": {
      "anyOf": [
        {
          "$ref": "#/definitions/jsonschema.Reference"
        },
        {
          "$ref": "#/definitions/jsonschema.ConcreteSingletonSchema"
        }
      ]
    },
    "jsonschema.String": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "const": {
          "type": "string"
        },
        "default": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "enum": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "examples": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "format": {
          "enum": [
            "date-time",
            "uri",
            "timestamp"
          ],
          "type": "string"
        },
        "maxLength": {
          "type": "number"
        },
        "minLength": {
          "type": "number"
        },
        "pattern": {
          "type": "string"
        },
        "relationshipRef": {
          "$ref": "#/definitions/jsonschema.RelationshipRefSchema"
        },
        "title": {
          "type": "string"
        },
        "type": {
          "const": "string",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    }
  }
}