{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "http://camunda.org/schema/zeebe-element-templates/1.0",
  "title": "Element Template Schema",
  "definitions": {
    "properties": {
      "allOf": [
        {
          "type": "array",
          "description": "List of properties of the element template.",
          "allOf": [
            {
              "examples": [
                [
                  {
                    "label": "Name",
                    "type": "String",
                    "binding": {
                      "type": "property",
                      "name": "name"
                    }
                  }
                ]
              ]
            }
          ],
          "items": {
            "type": "object",
            "default": {},
            "allOf": [
              {
                "if": {
                  "properties": {
                    "type": {
                      "const": "Dropdown"
                    }
                  },
                  "required": [
                    "type"
                  ]
                },
                "then": {
                  "required": [
                    "choices"
                  ]
                }
              },
              {
                "definitions": {
                  "condition": {
                    "type": "object",
                    "required": [
                      "property"
                    ],
                    "properties": {
                      "type": {
                        "$id": "#/condition/type",
                        "const": "simple",
                        "description": "The type of the condition.",
                        "default": "simple"
                      },
                      "property": {
                        "$id": "#/condition/property",
                        "type": "string",
                        "description": "The id of the property to check."
                      }
                    },
                    "oneOf": [
                      {
                        "properties": {
                          "equals": {
                            "type": [
                              "string",
                              "number",
                              "boolean"
                            ]
                          }
                        },
                        "required": [
                          "equals"
                        ]
                      },
                      {
                        "properties": {
                          "oneOf": {
                            "type": "array",
                            "items": {
                              "type": [
                                "string",
                                "number"
                              ]
                            }
                          }
                        },
                        "required": [
                          "oneOf"
                        ]
                      },
                      {
                        "properties": {
                          "isActive": {
                            "type": "boolean",
                            "description": "For `true`, activates the property when given property is active"
                          }
                        },
                        "required": [
                          "isActive"
                        ]
                      }
                    ]
                  },
                  "conditionDependingOnId": {
                    "required": [
                      "property"
                    ],
                    "properties": {
                      "property": {
                        "const": {
                          "$data": "2/id"
                        }
                      }
                    }
                  }
                },
                "allOf": [
                  {
                    "$comment": "property#condition should not depend on property#id",
                    "if": {
                      "required": [
                        "id",
                        "condition"
                      ],
                      "properties": {
                        "condition": {
                          "$ref": "#/definitions/properties/allOf/0/items/allOf/1/definitions/conditionDependingOnId"
                        }
                      }
                    },
                    "then": {
                      "not": {
                        "required": [
                          "condition"
                        ]
                      }
                    }
                  }
                ],
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Unique identifier of the property."
                  },
                  "condition": {
                    "type": "object",
                    "description": "Condition(s) to activate the binding.",
                    "allOf": [
                      {
                        "examples": [
                          {
                            "type": "simple",
                            "property": "httpMethod",
                            "equals": "GET"
                          },
                          {
                            "type": "simple",
                            "property": "httpMethod",
                            "oneOf": [
                              "POST",
                              "PUT",
                              "DELETE"
                            ]
                          },
                          {
                            "allMatch": [
                              {
                                "type": "simple",
                                "property": "authType",
                                "equals": "Basic"
                              },
                              {
                                "type": "simple",
                                "property": "httpMethod",
                                "oneOf": [
                                  "POST",
                                  "PUT",
                                  "DELETE"
                                ]
                              }
                            ]
                          }
                        ]
                      }
                    ],
                    "oneOf": [
                      {
                        "$ref": "#/definitions/properties/allOf/0/items/allOf/1/definitions/condition"
                      },
                      {
                        "properties": {
                          "allMatch": {
                            "$id": "#/allMatch",
                            "type": "array",
                            "items": {
                              "$ref": "#/definitions/properties/allOf/0/items/allOf/1/definitions/condition"
                            },
                            "minItems": 1
                          }
                        },
                        "required": [
                          "allMatch"
                        ]
                      }
                    ]
                  }
                }
              },
              {
                "if": {
                  "properties": {
                    "type": {
                      "not": {
                        "const": "Number"
                      }
                    }
                  },
                  "required": [
                    "type"
                  ]
                },
                "then": {
                  "properties": {
                    "value": {
                      "type": [
                        "string",
                        "boolean"
                      ]
                    }
                  }
                }
              },
              {
                "if": {
                  "oneOf": [
                    {
                      "properties": {
                        "type": {
                          "enum": [
                            "String",
                            "Text"
                          ]
                        }
                      },
                      "required": [
                        "type"
                      ]
                    },
                    {
                      "not": {
                        "required": [
                          "type"
                        ]
                      }
                    }
                  ]
                },
                "then": {
                  "properties": {
                    "placeholder": {
                      "type": "string"
                    }
                  }
                },
                "else": {
                  "not": {
                    "required": [
                      "placeholder"
                    ]
                  }
                }
              }
            ],
            "properties": {
              "value": {
                "$id": "#/properties/property/value",
                "type": [
                  "string",
                  "number",
                  "boolean"
                ],
                "description": "The value of a control field."
              },
              "description": {
                "$id": "#/properties/property/description",
                "type": "string",
                "description": "The description of a control field."
              },
              "label": {
                "$id": "#/properties/property/label",
                "type": "string",
                "description": "The label of a control field."
              },
              "type": {
                "$id": "#/properties/property/type",
                "type": "string",
                "description": "The type of a control field."
              },
              "editable": {
                "$id": "#/properties/property/editable",
                "type": "boolean",
                "description": "Indicates whether a control field is editable or not."
              },
              "choices": {
                "$id": "#/properties/property/choices",
                "type": "array",
                "description": "The choices for dropdown fields.",
                "default": [],
                "items": {
                  "$id": "#/properties/property/choices/item",
                  "type": "object",
                  "default": {},
                  "properties": {
                    "name": {
                      "$id": "#/properties/property/choices/item/name",
                      "type": "string",
                      "description": "The name of a choice."
                    },
                    "value": {
                      "$id": "#/properties/property/choices/item/value",
                      "type": "string",
                      "description": "The value of a choice."
                    },
                    "condition": {
                      "$ref": "#/definitions/properties/allOf/0/items/allOf/1/properties/condition"
                    }
                  },
                  "required": [
                    "value",
                    "name"
                  ]
                }
              },
              "constraints": {
                "$id": "#/properties/property/constraints",
                "type": "object",
                "description": "The validation constraints of a control field.",
                "allOf": [
                  {
                    "examples": [
                      {
                        "notEmpty": true
                      }
                    ]
                  }
                ],
                "properties": {
                  "notEmpty": {
                    "$id": "#/properties/property/constraints/notEmpty",
                    "type": "boolean",
                    "description": "The control field must not be empty."
                  },
                  "minLength": {
                    "$id": "#/properties/property/constraints/minLength",
                    "type": "number",
                    "description": "The minimal length of a control field value."
                  },
                  "maxLength": {
                    "$id": "#/properties/property/constraints/maxLength",
                    "type": "number",
                    "description": "The maximal length for a control field value."
                  },
                  "pattern": {
                    "$id": "#/properties/property/constraints/pattern",
                    "description": "A regular expression pattern for a constraint.",
                    "oneOf": [
                      {
                        "type": "object",
                        "default": {},
                        "properties": {
                          "value": {
                            "$id": "#/properties/property/constraints/pattern/value",
                            "type": "string",
                            "description": "The regular expression of a pattern."
                          },
                          "message": {
                            "$id": "#/properties/property/constraints/pattern/message",
                            "type": "string",
                            "description": "The validation message of a pattern."
                          }
                        }
                      },
                      {
                        "type": "string"
                      }
                    ]
                  }
                }
              },
              "group": {
                "$id": "#/properties/property/group",
                "type": "string",
                "description": "The custom group of a control field."
              }
            }
          }
        },
        {
          "$schema": "http://json-schema.org/draft-07/schema",
          "type": "array",
          "description": "List of properties of the element template.",
          "items": {
            "type": "object",
            "default": {},
            "required": [
              "binding"
            ],
            "allOf": [
              {
                "if": {
                  "properties": {
                    "binding": {
                      "properties": {
                        "type": {
                          "const": "property"
                        }
                      },
                      "required": [
                        "type"
                      ]
                    }
                  },
                  "required": [
                    "binding"
                  ]
                },
                "then": {
                  "properties": {
                    "type": {
                      "enum": [
                        "String",
                        "Text",
                        "Hidden",
                        "Dropdown",
                        "Boolean",
                        "Number"
                      ]
                    }
                  }
                }
              },
              {
                "if": {
                  "properties": {
                    "binding": {
                      "properties": {
                        "type": {
                          "enum": [
                            "zeebe:input",
                            "zeebe:output",
                            "zeebe:property",
                            "zeebe:taskHeader",
                            "zeebe:taskDefinition:type",
                            "bpmn:Message#property",
                            "bpmn:Message#zeebe:subscription#property",
                            "zeebe:taskDefinition",
                            "zeebe:calledElement",
                            "zeebe:linkedResource"
                          ]
                        }
                      },
                      "required": [
                        "type"
                      ]
                    }
                  },
                  "required": [
                    "binding"
                  ]
                },
                "then": {
                  "properties": {
                    "type": {
                      "enum": [
                        "String",
                        "Text",
                        "Hidden",
                        "Dropdown",
                        "Boolean",
                        "Number"
                      ]
                    }
                  }
                }
              },
              {
                "if": {
                  "properties": {
                    "optional": {
                      "const": true
                    }
                  },
                  "required": [
                    "optional"
                  ]
                },
                "then": {
                  "properties": {
                    "binding": {
                      "properties": {
                        "type": {
                          "enum": [
                            "zeebe:input",
                            "zeebe:output",
                            "zeebe:property",
                            "zeebe:taskHeader"
                          ]
                        }
                      },
                      "required": [
                        "type"
                      ]
                    }
                  }
                }
              },
              {
                "if": {
                  "properties": {
                    "optional": {
                      "const": true
                    }
                  },
                  "required": [
                    "optional"
                  ]
                },
                "then": {
                  "properties": {
                    "constraints": {
                      "properties": {
                        "notEmpty": {
                          "const": false
                        }
                      },
                      "required": [
                        "notEmpty"
                      ]
                    }
                  }
                }
              },
              {
                "if": {
                  "properties": {
                    "feel": {
                      "not": {
                        "const": null
                      }
                    }
                  },
                  "required": [
                    "feel"
                  ]
                },
                "then": {
                  "properties": {
                    "type": {
                      "enum": [
                        "String",
                        "Text",
                        "Number",
                        "Boolean"
                      ]
                    }
                  },
                  "required": [
                    "type"
                  ]
                }
              },
              {
                "if": {
                  "properties": {
                    "language": {
                      "not": {
                        "const": null
                      }
                    }
                  },
                  "required": [
                    "language"
                  ]
                },
                "then": {
                  "properties": {
                    "type": {
                      "enum": [
                        "Text"
                      ]
                    }
                  }
                }
              },
              {
                "if": {
                  "required": [
                    "value"
                  ]
                },
                "then": {
                  "not": {
                    "required": [
                      "generatedValue"
                    ]
                  }
                }
              },
              {
                "if": {
                  "properties": {
                    "type": {
                      "enum": [
                        "Boolean",
                        "Dropdown"
                      ]
                    }
                  },
                  "required": [
                    "type"
                  ]
                },
                "then": {
                  "not": {
                    "required": [
                      "generatedValue"
                    ]
                  }
                }
              },
              {
                "if": {
                  "properties": {
                    "type": {
                      "enum": [
                        "String",
                        "Text"
                      ]
                    }
                  },
                  "required": [
                    "feel"
                  ]
                },
                "then": {
                  "properties": {
                    "feel": {
                      "enum": [
                        "optional",
                        "required"
                      ]
                    }
                  }
                }
              },
              {
                "if": {
                  "properties": {
                    "feel": {
                      "const": "required"
                    }
                  },
                  "required": [
                    "feel"
                  ]
                },
                "then": {
                  "properties": {
                    "value": {
                      "type": "string"
                    }
                  }
                }
              },
              {
                "if": {
                  "properties": {
                    "binding": {
                      "properties": {
                        "type": {
                          "const": "zeebe:linkedResource"
                        }
                      },
                      "required": [
                        "type"
                      ]
                    }
                  },
                  "required": [
                    "binding"
                  ]
                },
                "then": {
                  "properties": {
                    "binding": {
                      "properties": {
                        "linkName": {
                          "type": "string"
                        },
                        "property": {
                          "enum": [
                            "resourceId",
                            "resourceType",
                            "bindingType",
                            "versionTag"
                          ]
                        }
                      },
                      "required": [
                        "linkName",
                        "property"
                      ]
                    }
                  }
                }
              },
              {
                "allOf": [
                  {
                    "if": {
                      "properties": {
                        "binding": {
                          "properties": {
                            "type": {
                              "enum": [
                                "zeebe:input",
                                "zeebe:output"
                              ]
                            }
                          },
                          "required": [
                            "type"
                          ]
                        },
                        "type": {
                          "enum": [
                            "Boolean",
                            "Number"
                          ]
                        }
                      },
                      "required": [
                        "binding",
                        "type"
                      ]
                    },
                    "then": {
                      "properties": {
                        "feel": {
                          "default": "static"
                        }
                      }
                    }
                  }
                ]
              }
            ],
            "properties": {
              "binding": {
                "$id": "#/properties/property/binding",
                "type": "object",
                "description": "Specifying how the property is mapped to BPMN or Zeebe extension elements and attributes.",
                "required": [
                  "type"
                ],
                "allOf": [
                  {
                    "if": {
                      "properties": {
                        "type": {
                          "enum": [
                            "property",
                            "zeebe:property",
                            "zeebe:input",
                            "bpmn:Message#property",
                            "bpmn:Message#zeebe:subscription#property"
                          ]
                        }
                      },
                      "required": [
                        "type"
                      ]
                    },
                    "then": {
                      "required": [
                        "name"
                      ]
                    }
                  },
                  {
                    "if": {
                      "properties": {
                        "type": {
                          "const": "zeebe:output"
                        }
                      },
                      "required": [
                        "type"
                      ]
                    },
                    "then": {
                      "required": [
                        "source"
                      ]
                    }
                  },
                  {
                    "if": {
                      "properties": {
                        "type": {
                          "const": "zeebe:taskHeader"
                        }
                      },
                      "required": [
                        "type"
                      ]
                    },
                    "then": {
                      "required": [
                        "key"
                      ]
                    }
                  },
                  {
                    "if": {
                      "properties": {
                        "type": {
                          "const": "zeebe:taskDefinition"
                        }
                      },
                      "required": [
                        "type"
                      ]
                    },
                    "then": {
                      "properties": {
                        "property": {
                          "enum": [
                            "type",
                            "retries"
                          ]
                        }
                      },
                      "required": [
                        "property"
                      ]
                    }
                  },
                  {
                    "if": {
                      "properties": {
                        "type": {
                          "const": "zeebe:taskDefinition:type"
                        }
                      },
                      "required": [
                        "type"
                      ]
                    },
                    "then": {
                      "deprecated": true
                    }
                  },
                  {
                    "if": {
                      "properties": {
                        "type": {
                          "const": "zeebe:calledElement"
                        }
                      },
                      "required": [
                        "type"
                      ]
                    },
                    "then": {
                      "properties": {
                        "property": {
                          "const": "processId"
                        }
                      },
                      "required": [
                        "property"
                      ]
                    }
                  },
                  {
                    "examples": [
                      {
                        "type": "property",
                        "name": "name"
                      },
                      {
                        "type": "zeebe:input",
                        "name": "input"
                      },
                      {
                        "type": "zeebe:output",
                        "source": "output"
                      },
                      {
                        "type": "zeebe:property",
                        "name": "property"
                      },
                      {
                        "type": "zeebe:taskHeader",
                        "key": "key"
                      },
                      {
                        "type": "zeebe:taskDefinition",
                        "property": "retries"
                      },
                      {
                        "type": "zeebe:taskDefinition",
                        "property": "type"
                      }
                    ]
                  }
                ],
                "properties": {
                  "type": {
                    "$id": "#/properties/property/binding/type",
                    "type": "string",
                    "description": "The type of a property binding.",
                    "enum": [
                      "property",
                      "zeebe:taskDefinition:type",
                      "zeebe:input",
                      "zeebe:output",
                      "zeebe:property",
                      "zeebe:taskHeader",
                      "bpmn:Message#property",
                      "bpmn:Message#zeebe:subscription#property",
                      "zeebe:taskDefinition",
                      "zeebe:calledElement",
                      "zeebe:linkedResource"
                    ]
                  },
                  "name": {
                    "$id": "#/properties/property/binding/name",
                    "type": "string",
                    "description": "The name of a property binding."
                  },
                  "source": {
                    "$id": "#/properties/property/binding/source",
                    "type": "string",
                    "description": "The source value of a property binding (zeebe:output)."
                  },
                  "key": {
                    "$id": "#/properties/property/binding/key",
                    "type": "string",
                    "description": "The key value of a property binding (zeebe:taskHeader)."
                  },
                  "property": {
                    "$id": "#/properties/property/binding/property",
                    "type": "string",
                    "description": "The name of the property defined in the binding."
                  },
                  "linkName": {
                    "$id": "#/properties/property/binding/linkName",
                    "type": "string",
                    "description": "The `linkName` of the element (zeebe:linkedResource)."
                  }
                }
              },
              "optional": {
                "$id": "#/optional",
                "type": "boolean",
                "description": "Indicates whether a property is optional. Optional bindings do not persist empty values in the underlying BPMN 2.0 XML."
              },
              "feel": {
                "$id": "#/properties/property/feel",
                "type": "string",
                "description": "Indicates whether the property can be a feel expression",
                "enum": [
                  "optional",
                  "required",
                  "static"
                ]
              },
              "language": {
                "$id": "#/properties/property/language",
                "type": "string",
                "description": "Indicates that the field is a custom language editor"
              },
              "generatedValue": {
                "$id": "#/properties/property/generatedValue",
                "type": "object",
                "required": [
                  "type"
                ],
                "properties": {
                  "type": {
                    "const": "uuid"
                  }
                },
                "description": "Sets property to a generated value according to given scheme."
              },
              "tooltip": {
                "$id": "#/properties/property/tooltip",
                "type": "string",
                "description": "Hints for the control field."
              }
            }
          }
        }
      ]
    },
    "template": {
      "type": "object",
      "allOf": [
        {
          "required": [
            "name",
            "id",
            "appliesTo",
            "properties"
          ],
          "properties": {
            "name": {
              "$id": "#/name",
              "type": "string",
              "description": "The name of the element template."
            },
            "id": {
              "$id": "#/id",
              "type": "string",
              "description": "The identifier of the element template."
            },
            "description": {
              "$id": "#/description",
              "type": "string",
              "description": "The description of the element template."
            },
            "version": {
              "$id": "#/version",
              "type": "integer",
              "description": "Optional version of the template. If you add a version to a template it will be considered unique based on its ID and version. Two templates can have the same ID if their version is different."
            },
            "isDefault": {
              "$id": "#/isDefault",
              "type": "boolean",
              "description": "Indicates whether the element template is a default template."
            },
            "deprecated": {
              "$id": "#/deprecated",
              "type": [
                "boolean",
                "object"
              ],
              "description": "Indicates whether the element template is deprecated.",
              "properties": {
                "message": {
                  "$id": "#/deprecated/message",
                  "type": "string",
                  "description": "Optional message to describe migration path."
                },
                "documentationRef": {
                  "$id": "#/deprecated/documentationRef",
                  "type": "string",
                  "pattern": "^(https|http)://.*",
                  "description": "Optional link to migration documentation."
                }
              }
            },
            "appliesTo": {
              "$id": "#/appliesTo",
              "type": "array",
              "description": "List of BPMN types the template can be applied to.",
              "default": [],
              "items": {
                "$id": "#/appliesTo/items",
                "type": "string",
                "pattern": "^[\\w\\d]+:[\\w\\d]+$",
                "allOf": [
                  {
                    "examples": [
                      "bpmn:Task",
                      "bpmn:ServiceTask",
                      "bpmn:SequenceFlow",
                      "bpmn:Process",
                      "bpmn:StartEvent",
                      "bpmn:Gateway"
                    ]
                  }
                ]
              }
            },
            "elementType": {
              "$id": "#/elementType",
              "type": "object",
              "description": "The BPMN type the element will be transformed into.",
              "default": {},
              "required": [
                "value"
              ],
              "properties": {
                "value": {
                  "$id": "#/elementType/value",
                  "type": "string",
                  "pattern": "^[\\w\\d]+:[\\w\\d]+$",
                  "allOf": [
                    {
                      "examples": [
                        "bpmn:ServiceTask",
                        "bpmn:UserTask",
                        "bpmn:StartEvent",
                        "bpmn:ExclusiveGateway",
                        "bpmn:ParallelGateway"
                      ]
                    }
                  ]
                }
              }
            },
            "metadata": {
              "$id": "#/metadata",
              "type": "object",
              "description": "Some custom properties for further configuration.",
              "default": {}
            },
            "entriesVisible": {
              "$id": "#/entriesVisible",
              "type": "boolean",
              "description": "Select whether non-template entries are visible in the properties panel."
            },
            "groups": {
              "$id": "#/groups",
              "type": "array",
              "description": "Custom fields can be ordered together via groups.",
              "allOf": [
                {
                  "examples": [
                    [
                      {
                        "id": "group-1",
                        "label": "My Group"
                      }
                    ]
                  ]
                }
              ],
              "items": {
                "$id": "#/groups/group",
                "type": "object",
                "default": {},
                "required": [
                  "id",
                  "label"
                ],
                "properties": {
                  "id": {
                    "$id": "#/groups/group/id",
                    "type": "string",
                    "description": "The id of the custom group"
                  },
                  "label": {
                    "$id": "#/groups/group/label",
                    "type": "string",
                    "description": "The label of the custom group"
                  }
                }
              }
            },
            "documentationRef": {
              "$id": "#/documentationRef",
              "type": "string",
              "pattern": "^(https|http)://.*"
            }
          }
        },
        {
          "allOf": [
            {
              "if": {
                "properties": {
                  "properties": {
                    "contains": {
                      "properties": {
                        "binding": {
                          "properties": {
                            "type": {
                              "const": "bpmn:Message#property"
                            }
                          },
                          "required": [
                            "type"
                          ]
                        }
                      },
                      "required": [
                        "binding"
                      ]
                    }
                  }
                },
                "required": [
                  "properties"
                ]
              },
              "then": {
                "required": [
                  "elementType"
                ],
                "properties": {
                  "elementType": {
                    "required": [
                      "value"
                    ],
                    "properties": {
                      "value": {
                        "enum": [
                          "bpmn:ReceiveTask",
                          "bpmn:SendTask",
                          "bpmn:StartEvent",
                          "bpmn:IntermediateCatchEvent",
                          "bpmn:IntermediateThrowEvent",
                          "bpmn:BoundaryEvent",
                          "bpmn:EndEvent"
                        ]
                      }
                    },
                    "allOf": [
                      {
                        "if": {
                          "properties": {
                            "value": {
                              "enum": [
                                "bpmn:StartEvent",
                                "bpmn:IntermediateCatchEvent",
                                "bpmn:IntermediateThrowEvent",
                                "bpmn:BoundaryEvent",
                                "bpmn:EndEvent"
                              ]
                            }
                          }
                        },
                        "then": {
                          "eventDefinition": {
                            "const": "bpmn:MessageEventDefinition"
                          },
                          "required": [
                            "eventDefinition"
                          ]
                        }
                      }
                    ]
                  }
                }
              }
            },
            {
              "if": {
                "properties": {
                  "properties": {
                    "contains": {
                      "properties": {
                        "binding": {
                          "properties": {
                            "type": {
                              "const": "bpmn:Message#zeebe:subscription#property"
                            }
                          },
                          "required": [
                            "type"
                          ]
                        }
                      },
                      "required": [
                        "binding"
                      ]
                    }
                  }
                },
                "required": [
                  "properties"
                ]
              },
              "then": {
                "required": [
                  "elementType"
                ],
                "properties": {
                  "elementType": {
                    "required": [
                      "value"
                    ],
                    "properties": {
                      "value": {
                        "enum": [
                          "bpmn:ReceiveTask",
                          "bpmn:StartEvent",
                          "bpmn:IntermediateCatchEvent",
                          "bpmn:IntermediateThrowEvent",
                          "bpmn:BoundaryEvent",
                          "bpmn:EndEvent"
                        ]
                      }
                    },
                    "allOf": [
                      {
                        "if": {
                          "properties": {
                            "value": {
                              "enum": [
                                "bpmn:StartEvent",
                                "bpmn:IntermediateCatchEvent",
                                "bpmn:IntermediateThrowEvent",
                                "bpmn:BoundaryEvent",
                                "bpmn:EndEvent"
                              ]
                            }
                          }
                        },
                        "then": {
                          "eventDefinition": {
                            "const": "bpmn:MessageEventDefinition"
                          },
                          "required": [
                            "eventDefinition"
                          ]
                        }
                      }
                    ]
                  }
                }
              }
            },
            {
              "if": {
                "properties": {
                  "properties": {
                    "contains": {
                      "properties": {
                        "binding": {
                          "properties": {
                            "type": {
                              "const": "zeebe:calledElement"
                            }
                          },
                          "required": [
                            "type"
                          ]
                        }
                      },
                      "required": [
                        "binding"
                      ]
                    }
                  }
                },
                "required": [
                  "properties"
                ]
              },
              "then": {
                "anyOf": [
                  {
                    "required": [
                      "elementType"
                    ],
                    "properties": {
                      "elementType": {
                        "required": [
                          "value"
                        ],
                        "properties": {
                          "value": {
                            "const": "bpmn:CallActivity"
                          }
                        }
                      }
                    }
                  },
                  {
                    "required": [
                      "appliesTo"
                    ],
                    "properties": {
                      "appliesTo": {
                        "const": [
                          "bpmn:CallActivity"
                        ]
                      }
                    }
                  }
                ]
              }
            }
          ]
        }
      ],
      "properties": {
        "properties": {
          "$ref": "#/definitions/properties",
          "$id": "#/properties"
        },
        "engines": {
          "$id": "#/engines",
          "type": "object",
          "description": "Defines the compatibility of this element template with different engines. Keys are engine names, values are semantic version ranges.",
          "default": {},
          "examples": [
            {
              "camunda": "^8.5"
            }
          ],
          "properties": {
            "camunda": {
              "$id": "#/engines/camunda",
              "type": "string",
              "description": "A semantic version range that denotes compatible Camunda versions.",
              "default": ""
            }
          }
        },
        "icon": {
          "$id": "#/icon",
          "type": "object",
          "description": "Custom icon to be shown on the element",
          "default": {},
          "properties": {
            "contents": {
              "$id": "#/icon/contents",
              "type": "string",
              "description": "The URL of an icon.",
              "pattern": "^(https?|data):.*"
            }
          },
          "required": [
            "contents"
          ]
        },
        "elementType": {
          "allOf": [
            {
              "allOf": [
                {
                  "properties": {
                    "eventDefinition": {
                      "$id": "#/elementType/eventDefinition",
                      "enum": [
                        "bpmn:MessageEventDefinition"
                      ]
                    }
                  }
                },
                {
                  "if": {
                    "required": [
                      "eventDefinition"
                    ]
                  },
                  "then": {
                    "properties": {
                      "value": {
                        "enum": [
                          "bpmn:StartEvent",
                          "bpmn:IntermediateCatchEvent",
                          "bpmn:IntermediateThrowEvent",
                          "bpmn:BoundaryEvent",
                          "bpmn:EndEvent"
                        ]
                      }
                    },
                    "required": [
                      "value"
                    ]
                  }
                }
              ]
            }
          ]
        },
        "groups": {
          "items": {
            "properties": {
              "tooltip": {
                "$id": "#/groups/group/tooltip",
                "type": "string"
              },
              "openByDefault": {
                "$id": "#/groups/group/openByDefault",
                "type": "boolean",
                "description": "Specifies whether the Group should be opened when first viewed. Defaults to true.",
                "default": true
              }
            }
          }
        }
      }
    }
  },
  "oneOf": [
    {
      "description": "An element template configuration.",
      "$ref": "#/definitions/template"
    },
    {
      "type": "array",
      "description": "A list of element template configurations.",
      "items": {
        "$ref": "#/definitions/template"
      }
    }
  ]
}