<?xml version="1.0"?>

<!-- Header -->
<xs:schema
    targetNamespace="http://www.yworks.com/xml/graphml"

    xmlns="http://www.yworks.com/xml/graphml"
    xmlns:y="http://www.yworks.com/xml/graphml"
    xmlns:g="http://graphml.graphdrawing.org/xmlns/graphml"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xlink="http://www.w3.org/1999/xlink"

    elementFormDefault="qualified"
    attributeFormDefault="unqualified"
    >

  <!--                             -->
  <!-- Enumeration Types -->
  <!--                             -->


  <!-- LineType -->
  <xs:simpleType name="lineType.type">
    <xs:annotation>
      <xs:documentation>
        The valid line types for an edge or node realizer.
        <p>
          Valid values are:
          <ul>
            <li><b>line</b>: for a continous line</li>
            <li><b>dashed</b>: for a dashed line</li>
            <li><b>dotted</b>: for a dotted line</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="line"/>
      <xs:enumeration value="dashed"/>
      <xs:enumeration value="dotted"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Font styles -->
  <xs:simpleType name="fontStyle.type">
    <xs:annotation>
      <xs:documentation>
        The valid font types for a label.
        <p>
          Valid values are:
          <ul>
            <li><b>plain</b>: for a plain font</li>
            <li><b>bold</b>: for a bold font</li>
            <li><b>italic</b>: for an italic font</li>
            <li><b>bolditalic</b>: for a bold and italic font</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="plain"/>
      <xs:enumeration value="bold"/>
      <xs:enumeration value="italic"/>
      <xs:enumeration value="bolditalic"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Shape of Shape Nodes -->
  <xs:simpleType name="shapeType.type">

    <xs:restriction base="xs:NMTOKEN">
      <xs:annotation>
        <xs:documentation>
          The shape types for a ShapeNodeRealizer.
          <p>
            Valid values are:
            <ul>
              <li><b>rectangle</b>: for a rectangular shape</li>
              <li><b>roundrectangle</b>: for a rectangular shape with rounded corners</li>
              <li><b>ellipse</b>: for an elliptical shape</li>
              <li><b>parallelogram</b>: for a parallelogram shape</li>
              <li><b>hexagon</b>: for a hexagonal shape</li>
              <li><b>octagon</b>: for a octagonal shape</li>
              <li><b>diamond</b>: for a diamond shape</li>
              <li><b>triangle</b>: for a triangular shape</li>
              <li><b>trapezoid</b>: for a trapezoidal shape, whose upper line is half as long as its lower line</li>
              <li><b>trapezoid2</b>: for a trapezoidal shape, whose lower line is half as long as its upper line</li>
              <li><b>rectangle3d</b>: for a rectangular shape with 3D-ish looks</li>
            </ul>
          </p>
        </xs:documentation>
      </xs:annotation>
      <xs:enumeration value="rectangle"/>
      <xs:enumeration value="roundrectangle"/>
      <xs:enumeration value="ellipse"/>
      <xs:enumeration value="parallelogram"/>
      <xs:enumeration value="hexagon"/>
      <xs:enumeration value="octagon"/>
      <xs:enumeration value="diamond"/>
      <xs:enumeration value="triangle"/>
      <xs:enumeration value="trapezoid"/>
      <xs:enumeration value="trapezoid2"/>
      <xs:enumeration value="rectangle3d"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Arrow types -->
  <xs:simpleType name="arrowType.type">
    <xs:annotation>
      <xs:documentation>
        The arrow types for EdgeRealizers.
        <p>
          Valid values are:
          <ul>
            <li><b>standard</b>: for the default arrow</li>
            <li><b>delta</b>: for a triangular arrow shape</li>
            <li><b>white_delta</b>: like delta, but filled white</li>
            <li><b>diamond</b>: for a diamond arrow shape</li>
            <li><b>white_diamond</b>: like diamond, but filled white</li>
            <li><b>none</b>: for no arrow</li>
            <li><b>plain</b>: for the plain arrow</li>
            <li><b>concave</b>: for a concave arrow</li>
            <li><b>convex</b>: for a convex arrow</li>
            <li><b>circle</b>: for a circle arrow</li>
            <li><b>dash</b>: for a dash arrow</li>
            <li><b>transparent_circle</b>: for a transparent circle arrow</li>
            <li><b>skewed_dash</b>: for a skewed dash arrow</li>
            <li><b>t_shape</b>: for a T-shaped arrow</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="standard"/>
      <xs:enumeration value="delta"/>
      <xs:enumeration value="diamond"/>
      <xs:enumeration value="white_diamond"/>
      <xs:enumeration value="white_delta"/>
      <xs:enumeration value="none"/>
	  <xs:enumeration value="plain"/>
	  <xs:enumeration value="concave"/>
	  <xs:enumeration value="convex"/>
	  <xs:enumeration value="circle"/>
	  <xs:enumeration value="dash"/>
	  <xs:enumeration value="transparent_circle"/>
      <xs:enumeration value="skewed_dash"/>
      <xs:enumeration value="t_shape"/>
    </xs:restriction>
  </xs:simpleType>


  <!-- Alignment of Labels -->
  <xs:simpleType name="alignment.type">
    <xs:annotation>
      <xs:documentation>
        The valid alignemts for labels.
        <p>
          Valid values are:
          <ul>
            <li><b>center</b>: center alignment</li>
            <li><b>left</b>: left alignment</li>
            <li><b>right</b>: right alignment</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="center"/>
      <xs:enumeration value="left"/>
      <xs:enumeration value="right"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Node Label Models -->

  <xs:simpleType name="nodeLabelModel.type">
    <xs:annotation>
      <xs:documentation>
        The valid label models for node labels.
        <p>
          Valid values are:
          <ul>
            <li><b>free</b>: free model</li>
            <li><b>sides</b>: sides model</li>
            <li><b>corners</b>: corners model</li>
            <li><b>eight_pos</b>: sides+corners model</li>
            <li><b>sandwich</b>: sandwich model</li>
            <li><b>internal</b>: internal model</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="free"/>
      <xs:enumeration value="sides"/>
      <xs:enumeration value="corners"/>
      <xs:enumeration value="eight_pos"/>
      <xs:enumeration value="sandwich"/>
      <xs:enumeration value="internal"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Node Label Positions -->

  <xs:simpleType name="nodeLabelPosition.type">
    <xs:annotation>
      <xs:documentation>
        The valid label positions for node labels.
        <p>
          <b>Note:</b>
          For a given node label model, the set of valid
          label positions is a subset of this enumeration that depends on the
          actual node label model.
        </p>
        <p>
          Valid values are:
          <ul>
            <li><b>n</b>: north (outside)</li>
            <li><b>nw</b>: north west (outside)</li>
            <li><b>ne</b>: north east(outside)</li>
            <li><b>w</b>: west (outside)</li>
            <li><b>e</b>: east (outside)</li>
            <li><b>sw</b>: south west (outside)</li>
            <li><b>s</b>: south (outside)</li>
            <li><b>se</b>: south east (outside)</li>
            <li><b>c</b>: center (inside)</li>
            <li><b>tl</b>: top left (inside)</li>
            <li><b>t</b>: top (inside)</li>
            <li><b>tr</b>: top right (inside)</li>
            <li><b>r</b>: right (inside)</li>
            <li><b>l</b>: left (inside)</li>
            <li><b>bl</b>: bottom left (inside)</li>
            <li><b>b</b>: bottom (inside)</li>
            <li><b>br</b>: bottom right (inside)</li>
            <li><b>anywhere</b>: anywhere</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="n"/>
      <xs:enumeration value="nw"/>
      <xs:enumeration value="ne"/>
      <xs:enumeration value="w"/>
      <xs:enumeration value="e"/>
      <xs:enumeration value="sw"/>
      <xs:enumeration value="s"/>
      <xs:enumeration value="se"/>
      <xs:enumeration value="c"/>
      <xs:enumeration value="tl"/>
      <xs:enumeration value="t"/>
      <xs:enumeration value="tr"/>
      <xs:enumeration value="r"/>
      <xs:enumeration value="l"/>
      <xs:enumeration value="bl"/>
      <xs:enumeration value="b"/>
      <xs:enumeration value="br"/>
      <xs:enumeration value="anywhere"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- AutoSizePolicy -->

  <xs:simpleType name="autoSizePolicy.type">
    <xs:annotation>
      <xs:documentation>
        The auto size policies for node labels.
        <p>
          Valid values are:
          <ul>
            <li><b>node_width</b>: resize to node width</li>
            <li><b>node_height</b>:resize to node height</li>
            <li><b>content</b>: resize to content size</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="node_width"/>
      <xs:enumeration value="node_height"/>
      <xs:enumeration value="content"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Edge Label Models -->

  <xs:simpleType name="edgeLabelModel.type">
    <xs:annotation>
      <xs:documentation>
        The valid label models for node labels.
        <p>
          Valid values are:
          <ul>
            <li><b>centered</b>: edge center</li>
            <li><b>center_slider</b>: edge center, freeley movable</li>
            <li><b>side_slider</b>: edge side, freely movable</li>
            <li><b>free</b>: free model</li>
            <li><b>two_pos</b>: source or target only</li>
            <li><b>three_center</b>: three positions at edge center</li>
            <li><b>six_pos</b>: three positions at either source or target</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="centered"/>
      <xs:enumeration value="center_slider"/>
      <xs:enumeration value="side_slider"/>
      <xs:enumeration value="free"/>
      <xs:enumeration value="two_pos"/>
      <xs:enumeration value="three_center"/>
      <xs:enumeration value="six_pos"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Edge Label Positions -->

  <xs:simpleType name="edgeLabelPosition.type">
    <xs:annotation>
      <xs:documentation>
        The valid label positions for edge labels.
        <p>
          <b>Note:</b>
          For a given edge label model, the set of valid
          label positions is a subset of this enumeration that depends on the
          actual edge label model.
        </p>
        <p>
          Valid values are:
          <ul>
            <li><b>center</b>: at source on the edge segment</li>
            <li><b>tcentr</b>: at target on the edge segment</li>
            <li><b>scentr</b>: at center on the edge segment</li>
            <li><b>stail</b>: at source below the edge segment</li>
            <li><b>ttail</b>: at target below the edge segment</li>
            <li><b>tail</b>: at center below the edge segment</li>
            <li><b>shead</b>: at source above the edge segment</li>
            <li><b>thead</b>: at target above the edge segment</li>
            <li><b>head</b>: at center above the edge segment</li>
            <li><b>anywhere</b>: anywhere</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="center"/>
      <xs:enumeration value="tcentr"/>
      <xs:enumeration value="scentr"/>
      <xs:enumeration value="anywhere"/>
      <xs:enumeration value="stail"/>
      <xs:enumeration value="ttail"/>
      <xs:enumeration value="tail"/>
      <xs:enumeration value="shead"/>
      <xs:enumeration value="thead"/>
      <xs:enumeration value="head"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Preferred Edge Label Positions -->

  <xs:simpleType name="preferredPlacement.type">
    <xs:annotation>
      <xs:documentation>
        The valid preferred label positions for edge labels.
        <p>
          <b>Note:</b>
          For a given edge label model, the set of valid
          preferred label positions is a subset of this enumeration that depends on the
          actual edge label model. This value is evaluated by automatic label layout algorithms and may differ
          from the actual label position.
        </p>
        <p>
          Valid values are:
          <ul>
            <li><b>target_right</b>: at target right from the edge segment</li>
            <li><b>target</b>: anywhere at the target</li>
            <li><b>target_left</b>: at target left from the edge segment</li>
            <li><b>target_on_edge</b>: at target on the edge segment</li>
            <li><b>source_right</b>: at source right from the edge segment</li>
            <li><b>source</b>: anywhere at the source</li>
            <li><b>source_left</b>: at source left from the edge segment</li>
            <li><b>source_on_edge</b>: at source on the edge segment</li>
            <li><b>center_right</b>: at center right from the edge segment</li>
            <li><b>center</b>: anywhere at the  center</li>
            <li><b>center_left</b>: at center left from the edge segment</li>
            <li><b>center_on_edge</b>: at center on the edge segment</li>
            <li><b>anywhere</b>: anywhere</li>
            <li><b>on_edge</b>: anywhere on the edge</li>
            <li><b>left</b>: anywhere left from the edge</li>
            <li><b>right</b>: anywhere right from the edge</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="target_right"/>
      <xs:enumeration value="target"/>
      <xs:enumeration value="target_left"/>
      <xs:enumeration value="target_on_edge"/>
      <xs:enumeration value="source_right"/>
      <xs:enumeration value="source"/>
      <xs:enumeration value="source_left"/>
      <xs:enumeration value="source_on_edge"/>
      <xs:enumeration value="center_right"/>
      <xs:enumeration value="center"/>
      <xs:enumeration value="center_left"/>
      <xs:enumeration value="center_on_edge"/>
      <xs:enumeration value="anywhere"/>
      <xs:enumeration value="on_edge"/>
      <xs:enumeration value="left"/>
      <xs:enumeration value="right"/>

    </xs:restriction>
  </xs:simpleType>

  <!-- horizontalTextPosition value type for labels -->
  <xs:simpleType name="horizontalTextPosition.type">
    <xs:annotation>
      <xs:documentation>
        The valid horizontal text vs. icon alignements for labels.
        <p>
          Valid values are:
          <ul>
            <li><b>left</b>: place text to the left of the icon</li>
            <li><b>right</b>: place text to the right of the icon</li>
            <li><b>center</b>: place text on center of the icon</li>
            <li><b>left_aligned</b>: align text to the left of the icon</li>
            <li><b>right_aligned</b>: align text to the right of the icon</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="left"/>
      <xs:enumeration value="right"/>
      <xs:enumeration value="center"/>
      <xs:enumeration value="left_aligned"/>
      <xs:enumeration value="right_aligned"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- verticalTextPosition value type for labels -->

  <xs:simpleType name="verticalTextPosition.type">
   <xs:annotation>
    <xs:documentation>
      The valid vertical text vs. icon alignements for labels.
      <p>
        Valid values are:
        <ul>
          <li><b>top</b>: place text above the icon</li>
          <li><b>bottom</b>: place text below the icon</li>
          <li><b>center</b>: place text on center of the icon</li>
        </ul>
      </p>
    </xs:documentation>
  </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="top"/>
      <xs:enumeration value="bottom"/>
      <xs:enumeration value="center"/>
    </xs:restriction>
  </xs:simpleType>

  <!--                             -->
  <!--  Geometric types     -->
  <!--                             -->

  <!-- Location defined by x,y coordinates -->
  <xs:attributeGroup name="Location.group">
    <xs:annotation>
      <xs:documentation>
          Attribute group that describes a two-dimensional location, specified by the x and y attribute.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="x" type="xs:double" use="required">
      <xs:annotation>
        <xs:documentation>
            The x coordinate of the point.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="y" type="xs:double" use="required">
      <xs:annotation>
        <xs:documentation>
            The y coordinate of the point.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:attributeGroup>

  <!-- Location defined by x,y coordinates and width,height -->
  <xs:attributeGroup name="Rectangle.group">
    <xs:annotation>
      <xs:documentation>
        Attribute group that describes a two-dimensional rectangle.
        <p>
          The location is specified by the x and y attribute, the dimension by the width and height attributes.
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="x" type="xs:double" use="required">
      <xs:annotation>
        <xs:documentation>
            The x coordinate of the rectangle.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="y" type="xs:double" use="required">
      <xs:annotation>
        <xs:documentation>
            The y coordinate of the rectangle.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="width" type="xs:double" use="required">
      <xs:annotation>
        <xs:documentation>
            The width of the rectangle.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="height" type="xs:double" use="required">
      <xs:annotation>
        <xs:documentation>
            The height of the rectangle.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:attributeGroup>

  <!-- type for required rectangles -->
  <xs:complexType name="Rectangle.type">
    <xs:annotation>
      <xs:documentation>
        Type definition for rectangles.
      </xs:documentation>
    </xs:annotation>
    <xs:attributeGroup ref="Rectangle.group"/>
  </xs:complexType>

  <!-- type for optional rectangles -->
  <xs:attributeGroup name="OpRectangle.group">
    <xs:annotation>
      <xs:documentation>
        Attribute group that describes a two-dimensional rectangle, where attribtue values are optional.
        <p>
          The location is specified by the x and y attribute, the dimension by the width and height attributes.
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="x" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
            The x coordinate of the rectangle.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="y" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
            The y coordinate of the rectangle.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="width" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
            The width of the rectangle.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="height" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
            The height of the rectangle.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:attributeGroup>

  <!-- type for a path -->
  <xs:complexType name="Path.type">
    <xs:annotation>
      <xs:documentation>
        Attribute group that describes a two-dimensional path, consisting of a point list together with optional source
        and target locations.
        <p>
          The source resp. target location is specified by the sx and sy resp. tx and ty attributes.
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="Point" minOccurs="0" maxOccurs="unbounded">
        <xs:annotation>
          <xs:documentation>
            Single control point for two dimensional paths.
          </xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:attributeGroup ref="Location.group"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="reversedPathRendering" type="xs:boolean" use="optional">
      <xs:annotation>
        <xs:documentation>
            true iff the path should be rendered in reverse order.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="sx" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
            The x coordinate of the source point.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="sy" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
            The y coordinate of the source point.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="tx" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
            The x coordinate of the target point.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="ty" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
            The y coordinate of the target point.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>


  <!--                             -->
  <!--     Misc Types       -->
  <!--                             -->

  <!-- color -->

  <xs:simpleType name="color.type">
    <xs:annotation>
      <xs:documentation>
        Simple type that encodes a color value.
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:pattern value="#(([A-F]|[0-9]){2}){3,4}"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Style for a line -->

  <xs:complexType name="LineStyle.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of a line style.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="color" type="color.type" use="optional">
      <xs:annotation>
        <xs:documentation>
            The color of the line.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="hasColor" type="xs:boolean" use="optional">
      <xs:annotation>
        <xs:documentation>
            Whether the line has a color set. If false, the line is invisible.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="type" type="lineType.type" use="optional">
      <xs:annotation>
        <xs:documentation>
            The type of the line.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="width" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
            The width of the line.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <!-- drop shadow style -->
  <xs:complexType name="DropShadow.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of a drop shadow.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="color" type="color.type" use="optional">
      <xs:annotation>
        <xs:documentation>
            The color of the drop shadow.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="offsetX" type="xs:byte" use="optional">
      <xs:annotation>
        <xs:documentation>
            The offset in x direction.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="offsetY" type="xs:byte" use="optional">
      <xs:annotation>
        <xs:documentation>
            The offset in y direction.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <!--                             -->
  <!--        Labels            -->
  <!--                             -->

  <!-- Basic properties of all kind of labels -->
  <xs:complexType name="Label.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the common attributes of node and edge labels.
      </xs:documentation>
    </xs:annotation>
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attributeGroup ref="OpRectangle.group"/>
        <xs:attribute name="visible" type="xs:boolean" use="optional">
          <xs:annotation>
            <xs:documentation>
              Whether the label is visible or not.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="alignment" type="alignment.type" use="optional">
          <xs:annotation>
            <xs:documentation>
              The alignment of the label.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="textColor" type="color.type" use="optional">
          <xs:annotation>
            <xs:documentation>
              The text color of the label.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="lineColor" type="color.type" use="optional">
          <xs:annotation>
            <xs:documentation>
              The border color of the label's content rectangle.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="hasLineColor" type="xs:boolean" use="optional">
          <xs:annotation>
            <xs:documentation>
              Whether the label border should be painted.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="backgroundColor" type="color.type" use="optional">
          <xs:annotation>
            <xs:documentation>
              The background color of the label's content rectangle.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="hasBackgroundColor" type="xs:boolean" use="optional">
          <xs:annotation>
            <xs:documentation>
              Whether the label background should be painted.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="fontFamily" type="xs:string" use="optional">
          <xs:annotation>
            <xs:documentation>
              The font family for the label text.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="fontSize" type="xs:unsignedByte" use="optional">
          <xs:annotation>
            <xs:documentation>
              The font size for the label text.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="fontStyle" type="fontStyle.type" use="optional">
          <xs:annotation>
            <xs:documentation>
              The font style for the label text.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="rotationAngle" type="xs:double" use="optional">
          <xs:annotation>
            <xs:documentation>
              The rotation angle style for the label.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="icon" type="xs:anyURI" use="optional">
          <xs:annotation>
            <xs:documentation>
              The URL of an icon for the label.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
    <xs:attribute name="image" type="xs:string" use="optional">
      <xs:annotation>
        <xs:documentation>
          Reference to an embedded image resource.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="iconData" type="xs:string" use="optional">
      <xs:annotation>
        <xs:documentation>
          Reference to an embedded arbitrary serializable resource.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
        <xs:attribute name="underlinedText" type="xs:boolean" use="optional">
          <xs:annotation>
            <xs:documentation>
              Whether to underline the label text.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="horizontalTextPosition" type="horizontalTextPosition.type" use="optional">
          <xs:annotation>
            <xs:documentation>
              The horizontal text position wrt to an optional icon.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="verticalTextPosition" type="verticalTextPosition.type" use="optional">
          <xs:annotation>
            <xs:documentation>
              The vertical text position wrt to an optional icon.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="iconTextGap" type="xs:byte" use="optional">
          <xs:annotation>
            <xs:documentation>
              The distance between the label text and an optional icon.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <!-- Node Labels -->
  <xs:complexType name="NodeLabel.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the additional attributes of node labels.
      </xs:documentation>
    </xs:annotation>
    <xs:simpleContent>
      <xs:extension base="Label.type">
        <xs:attribute name="modelName" type="nodeLabelModel.type" use="optional">
          <xs:annotation>
            <xs:documentation>
              The label model.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="modelPosition" type="nodeLabelPosition.type" use="optional">
          <xs:annotation>
            <xs:documentation>
              The actual label position in the current label model.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="autoSizePolicy" type="autoSizePolicy.type" use="optional">
          <xs:annotation>
            <xs:documentation>
              The auto size policy of the label.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <!-- Edge Labels -->
  <xs:complexType name="EdgeLabel.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the additional attributes of edge labels.
      </xs:documentation>
    </xs:annotation>
    <xs:simpleContent>
      <xs:extension base="Label.type">
        <xs:attribute name="modelName" type="edgeLabelModel.type" use="optional">
          <xs:annotation>
            <xs:documentation>
              The label model.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="modelPosition" type="edgeLabelPosition.type" use="optional">
          <xs:annotation>
            <xs:documentation>
              The actual label position in the current label model.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="preferredPlacement" type="preferredPlacement.type" use="optional">
          <xs:annotation>
            <xs:documentation>
              The preferred label position in the current label model.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="distance" type="xs:double" use="optional">
          <xs:annotation>
            <xs:documentation>
              The current label distance from the edge.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="ratio" type="xs:double" use="optional">
          <xs:annotation>
            <xs:documentation>
              The current label position along the edge, expressed as ratio from source to target.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="Geometry.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the geometry of simple graph elements.
      </xs:documentation>
    </xs:annotation>
    <xs:attributeGroup ref="Rectangle.group"/>
  </xs:complexType>
  
  <!--                             -->
  <!--      Nodes              -->
  <!--                             -->

  <!-- Generic attributes for all nodes -->
  <xs:complexType name="Node.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the common attributes of a node realizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="Geometry" minOccurs="0" maxOccurs="1" type="Geometry.type">
        <xs:annotation>
          <xs:documentation>
            The location and size of the node.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="Fill" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>
            The fill attributes of the node.
          </xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:attribute name="hasColor" type="xs:boolean" use="optional">
            <xs:annotation>
              <xs:documentation>
                Whether the node has a visible fill color.
              </xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="color" type="xs:string" use="optional">
            <xs:annotation>
              <xs:documentation>
                The first fill color.
              </xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="color2" type="xs:string" use="optional">
            <xs:annotation>
              <xs:documentation>
                The second fill color (for gradient fills).
              </xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="transparent" type="xs:boolean" use="optional">
            <xs:annotation>
              <xs:documentation>
                Whether the node is transparent.
              </xs:documentation>
            </xs:annotation>
          </xs:attribute>
        </xs:complexType>
      </xs:element>
      <xs:element name="BorderStyle" type="LineStyle.type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>
             The LineStyle of the border.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="NodeLabel" type="NodeLabel.type" minOccurs="0" maxOccurs="unbounded">
        <xs:annotation>
          <xs:documentation>
            The (optional) node label.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="selected" type="xs:boolean" use="optional">
      <xs:annotation>
        <xs:documentation>
          Whether the node is currently selected.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <!-- Shape Node -->
  <xs:complexType name="ShapeNode.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of a ShapeNodeRealizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="Node.type">
        <xs:sequence>
          <xs:element name="Shape" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                The actual shape of a ShapeNodeRealizer.
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:attribute name="type" type="shapeType.type" use="required">
                <xs:annotation>
                  <xs:documentation>
                    The shape type.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
            </xs:complexType>
          </xs:element>
          <xs:element name="DropShadow" type="DropShadow.type" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                The drop shadow.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- Image Node -->
  <xs:complexType name="ImageNode.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of an ImageNodeRealizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="Node.type">
        <xs:sequence>
          <xs:element name="Image">
            <xs:annotation>
              <xs:documentation>
                Encodes an image for an ImageNodeRealizer.
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:attribute name="href" type="xs:anyURI" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    The URL of an image for external image sources.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
              <xs:attribute name="alphaImage" type="xs:boolean" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    Whether to use alpha channel information from the image.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
              <xs:attribute name="refid" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    Reference to an inlined image resource.
                    <p>The refid must point to an existing inlined image resource in a toplevel graphml y:Resource
                      block.
                    </p>
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="Insets.type">
    <xs:annotation>
      <xs:documentation>
        Type that can be used to describe insets in both integer and double precision.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="top" type="xs:nonNegativeInteger" use="optional">
      <xs:annotation>
        <xs:documentation>
          The minimal inset at the top in integer precision.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="bottom" type="xs:nonNegativeInteger" use="optional">
      <xs:annotation>
        <xs:documentation>
          The minimal inset at the bottom in integer precision.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="left" type="xs:nonNegativeInteger" use="optional">
      <xs:annotation>
        <xs:documentation>
          The minimal inset at the left in integer precision.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="right" type="xs:nonNegativeInteger" use="optional">
      <xs:annotation>
        <xs:documentation>
          The minimal inset at the right in integer precision.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="topF" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The minimal inset at the top in double precision.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="bottomF" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The minimal inset at the bottom in double precision.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="leftF" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The minimal inset at the left in double precision.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="rightF" type="xs:double" use="optional">
      <xs:annotation>
        <xs:documentation>
          The minimal inset at the right in double precision.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <!-- Group Node -->
  <xs:complexType name="GroupNode.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of a GroupNodeRealizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="Node.type">
        <xs:sequence>
          <xs:element name="Shape" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                The actual shape of a GroupNodeRealizer.
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:attribute name="type" type="shapeType.type" use="required">
                <xs:annotation>
                  <xs:documentation>
                    The shape type.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
            </xs:complexType>
          </xs:element>
          <xs:element name="DropShadow" type="DropShadow.type" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                The drop shadow.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element name="State" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                The state of a GroupNodeRealizer (open/closed etc.).
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:attribute name="closed" type="xs:boolean" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    Whether the group is currently closed.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
              <xs:attribute name="innerGraphDisplayEnabled" type="xs:boolean" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    Whether to display the inner graph even in closed state.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
            </xs:complexType>
          </xs:element>
          <xs:element name="Insets" type="Insets.type" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                The minimal insets of a GroupNodeRealizer.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element name="BorderInsets" type="Insets.type" minOccurs="0" maxOccurs="1">
                <xs:annotation>
                  <xs:documentation>
                The extra insets of a GroupNodeRealizer.
                  </xs:documentation>
                </xs:annotation>
              </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- Proxy Shape Node -->
  <xs:complexType name="ProxyShapeNode.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of a ProxyShapeNodeRealizer in yFiles.
        <p>This Realizer can multiplex between several different realizers for a node.</p>
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="Realizers">
        <xs:annotation>
          <xs:documentation>
            List of subordinate realizers for this node realizer.
          </xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
          </xs:sequence>
          <xs:attribute name="active" type="xs:nonNegativeInteger" use="required">
            <xs:annotation>
              <xs:documentation>
                The list index of the currently active realizer (zero based).
              </xs:documentation>
            </xs:annotation>
          </xs:attribute>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="UserData.type">
            <xs:annotation>
              <xs:documentation>
                Type for the UserData that holds the actual state of a generic Node or Edge Realizer.
              </xs:documentation>
            </xs:annotation>
              <xs:attribute name="class" type="xs:string" use="required">
                <xs:annotation>
                  <xs:documentation>
                    Class name of the data holder instance.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
              <xs:attribute name="value" type="xs:string" use="required">
                <xs:annotation>
                  <xs:documentation>
                    String representation of the user data value.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
            </xs:complexType>
		  
  <!-- Generic Node -->
  <xs:complexType name="GenericNode.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of a GenericNodeRealizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="Node.type">
        <xs:sequence>
          <xs:element name="UserData" type="UserData.type" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                Represents the UserData that holds the actual state of this realizer instance.
              </xs:documentation>
            </xs:annotation>
          </xs:element>		  
        </xs:sequence>
        <xs:attribute name="configuration" type="xs:string" use="required">
          <xs:annotation>
            <xs:documentation>
              The name of the configuration. This configuration must have been registered previously.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- Generic Group Node -->
  <xs:complexType name="GenericGroupNode.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of a GenericGroupNodeRealizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="GenericNode.type">
	   <xs:sequence>
	    <xs:element name="State" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                The state of a GenericGroupNodeRealizer (open/closed etc.).
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:attribute name="closed" type="xs:boolean" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    Whether the group is currently closed.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
              <xs:attribute name="autoResize" type="xs:boolean" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    Whether the group node should automatically resize itself.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
			  <xs:attribute name="closedHeight" type="xs:double" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    The height of the group node in closed state.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
			  <xs:attribute name="closedWidth" type="xs:double" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    The width of the group node in closed state.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
            </xs:complexType>
          </xs:element>
		  <xs:element name="Insets" type="Insets.type" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                The minimal insets of a GroupNodeRealizer.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:element name="BorderInsets" type="Insets.type" minOccurs="0" maxOccurs="1">
            <xs:annotation>
              <xs:documentation>
                The extra insets of a GroupNodeRealizer.
              </xs:documentation>
            </xs:annotation>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- Element Definitions for  Nodes -->
  <xs:element name="ShapeNode" type="ShapeNode.type">
    <xs:annotation>
      <xs:documentation>
        ShapeNodeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="ImageNode" type="ImageNode.type">
    <xs:annotation>
      <xs:documentation>
        ImageNodeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="GroupNode" type="GroupNode.type">
    <xs:annotation>
      <xs:documentation>
        GroupNodeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="GenericNode" type="GenericNode.type">
    <xs:annotation>
      <xs:documentation>
        GenericNodeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="GenericGroupNode" type="GenericGroupNode.type">
    <xs:annotation>
      <xs:documentation>
        GenericGroupNodeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="ProxyShapeNode" type="ProxyShapeNode.type">
    <xs:annotation>
      <xs:documentation>
        ProxyShapeNodeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="ProxyAutoBoundsNode" type="ProxyShapeNode.type">
    <xs:annotation>
      <xs:documentation>
        ProxyAutoBoundsNodeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>

  <!--                             -->
  <!--      Edges              -->
  <!--                             -->

  <!-- Generic attributes for all edges -->
  <xs:complexType name="Edge.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the common attributes of an edge realizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="Path" type="Path.type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>
            The edge path.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="LineStyle" type="LineStyle.type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>
            The line style used to draw the edge.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="Arrows" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>
            The source and target arrows.
          </xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:attribute name="source" type="arrowType.type">
            <xs:annotation>
              <xs:documentation>
                The source arrow type.
              </xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="target" type="arrowType.type">
            <xs:annotation>
              <xs:documentation>
                The target arrow type.
              </xs:documentation>
            </xs:annotation>
          </xs:attribute>
        </xs:complexType>
      </xs:element>
      <xs:element name="EdgeLabel" type="EdgeLabel.type" minOccurs="0" maxOccurs="unbounded">
        <xs:annotation>
          <xs:documentation>
            The edge label(s).
          </xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="selected" type="xs:boolean" use="optional">
      <xs:annotation>
        <xs:documentation>
          Whether the edge currently is selected.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>

  <!-- Polyline edges -->
  <xs:complexType name="PolyLineEdge.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of a PolylineEdgeRealizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="Edge.type">
        <xs:sequence>
          <xs:element name="BendStyle">
            <xs:annotation>
              <xs:documentation>
               The style used to draw the bends.
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:attribute name="smoothed" type="xs:boolean" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    Whether to draw smooth instead of angular bends.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>


  <!-- Type of Arc edges -->
  <xs:simpleType name="arc.type">
    <xs:annotation>
      <xs:documentation>
        The arc types for ArcEdgeRealizers.
        <p>
          Valid values are:
          <ul>
            <li><b>fixedHeight</b>: fixed height, but variable ratio</li>
            <li><b>fixedRatio</b>: fixed ration, but variable height</li>
          </ul>
        </p>
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="fixedHeight"/>
      <xs:enumeration value="fixedRatio"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Arc edges -->
  <xs:complexType name="ArcEdge.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of an ArcEdgeRealizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="Edge.type">
        <xs:sequence>
          <xs:element name="Arc">
            <xs:annotation>
              <xs:documentation>
                The Arc.
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:attribute name="type" type="arc.type" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    The arc type.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
              <xs:attribute name="height" type="xs:double" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    The current height of the arc.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
              <xs:attribute name="ratio" type="xs:double" use="optional">
                <xs:annotation>
                  <xs:documentation>
                    The current ratio of the arc.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- QuadCurve edges -->
  <xs:complexType name="QuadCurveEdge.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of a QuadCurveEdgeRealizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="Edge.type">
        <xs:attribute name="straightness" type="xs:double" use="optional">
          <xs:annotation>
            <xs:documentation>
              The straightness of the curve.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- Generic edges -->
  <xs:complexType name="GenericEdge.type">
    <xs:annotation>
      <xs:documentation>
        Complex type that describes the attributes of an GenericEdgeRealizer in yFiles.
      </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="Edge.type">
        <xs:sequence>
          <xs:element name="UserData">
            <xs:annotation>
              <xs:documentation>
                Represents the UserData that holds the actual state of this realizer instance.
              </xs:documentation>
            </xs:annotation>
            <xs:complexType>
              <xs:attribute name="class" type="xs:string" use="required">
                <xs:annotation>
                  <xs:documentation>
                    Class name of the data holder instance.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
              <xs:attribute name="value" type="xs:string" use="required">
                <xs:annotation>
                  <xs:documentation>
                    String representation of the user data value.
                  </xs:documentation>
                </xs:annotation>
              </xs:attribute>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="configuration" type="xs:string" use="required">
          <xs:annotation>
            <xs:documentation>
              The name of the configuration. This configuration must have been registered previously.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- Element definitions for edges -->
  <xs:element name="PolyLineEdge" type="PolyLineEdge.type">
    <xs:annotation>
      <xs:documentation>
        PolyLineEdgeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="ArcEdge" type="ArcEdge.type">
    <xs:annotation>
      <xs:documentation>
        ArcEdgeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="BezierEdge" type="Edge.type">
    <xs:annotation>
      <xs:documentation>
        BezierEdgeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="SplineEdge" type="Edge.type">
    <xs:annotation>
      <xs:documentation>
        SplineEdgeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="QuadCurveEdge" type="QuadCurveEdge.type">
    <xs:annotation>
      <xs:documentation>
        QuadCurveEdgeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="GenericEdge" type="GenericEdge.type">
    <xs:annotation>
      <xs:documentation>
        GenericEdgeRealizer element definition.
      </xs:documentation>
    </xs:annotation>
  </xs:element>

  <!-- Shared resource block definitions -->

  <xs:complexType name="Resource.type" mixed="true">
    <xs:annotation>
      <xs:documentation>
        Complex type for a shared resource element inside a resource block container.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:annotation>
        <xs:documentation>
          The actual content. Note that arbitrary (wellformed) content is allowed here.
        </xs:documentation>
      </xs:annotation>
      <xs:any minOccurs="0" maxOccurs="1" processContents="skip"/>
    </xs:sequence>
    <xs:attribute name="id" use="required">
      <xs:annotation>
        <xs:documentation>
          The id of the shared resource. Needed to reference this resource.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="type" use="optional">
      <xs:annotation>
        <xs:documentation>
          The type of the shared resource.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="format" use="optional">
      <xs:annotation>
        <xs:documentation>
          The format of the shared resource.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>

  </xs:complexType>

  <xs:complexType name="ResourceBlock.type">
    <xs:annotation>
      <xs:documentation>
        Complex type for a shared resource block container.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="Resource" type="Resource.type" minOccurs="0" maxOccurs="unbounded">
        <xs:annotation>
          <xs:documentation>
            A shared resource element.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="Resources" type="ResourceBlock.type">
    <xs:annotation>
      <xs:documentation>
        Resource block element definition.
      </xs:documentation>
    </xs:annotation>
    <xs:key name="resource_id_key">
      <xs:annotation>
        <xs:documentation>
          Ensures: existence and uniqueness of the id attributes of
          each &lt;Resource> element in this resource block.
        </xs:documentation>
      </xs:annotation>
      <xs:selector xpath=".//y:Resource"/>
      <xs:field xpath="@id"/>
    </xs:key>
  </xs:element>
</xs:schema>
