§
    ¹³ÙgÔš  ã                   óî   — d Z ddlmZ ddlmZmZ ddlmZ ddlZ	ddl
Z
dgZdd	„Zdd
„Z	 	 	 	 	 	 	 	 	 	 	 	 dd„Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d d„Z	 	 	 	 	 	 	 	 	 	 	 d!d„Z	 	 	 	 	 	 	 	 	 	 	 	 	 d"d„Zd#d„ZdS )$z'Draw a rustworkx graph with matplotlib.é    )ÚIterable)ÚisliceÚcycle)ÚNumberNÚmpl_drawTFc                 óä  — 	 ddl m} n"# t          $ r}t          d¦  «        |‚d}~ww xY w|€|                     ¦   «         }n|                     ¦   «         }|                     d¦  «         |€1|j        r|                     ¦   «         }n|                     d¦  «        }t          | f||||dœ|¤Ž | 
                    ¦   «          |                     ¦   «          |                     ¦   «         r|€|S dS )a�  Draw a graph with Matplotlib.

    .. note::

        Matplotlib is an optional dependency and will not be installed with
        rustworkx by default. If you intend to use this function make sure that
        you install matplotlib with either ``pip install matplotlib`` or
        ``pip install 'rustworkx[mpl]'``

    :param graph: A rustworkx graph, either a :class:`~rustworkx.PyGraph` or a
        :class:`~rustworkx.PyDiGraph`.
    :param dict pos: An optional dictionary (or
        a :class:`~rustworkx.Pos2DMapping` object) with nodes as keys and
        positions as values. If not specified a spring layout positioning will
        be computed. See `layout_functions` for functions that compute
        node positions.
    :param matplotlib.Axes ax: An optional Matplotlib Axes object to draw the
        graph in.
    :param bool arrows: For :class:`~rustworkx.PyDiGraph` objects if ``True``
        draw arrowheads. (defaults to ``True``) Note, that the Arrows will
        be the same color as edges.
    :param str arrowstyle: An optional string for directed graphs to choose
        the style of the arrowsheads. See
        :class:`matplotlib.patches.ArrowStyle` for more options. By default the
        value is set to ``'-\|>'``.
    :param int arrow_size: For directed graphs, choose the size of the arrow
        head's length and width. See
        :class:`matplotlib.patches.FancyArrowPatch` attribute and constructor
        kwarg ``mutation_scale`` for more info. Defaults to 10.
    :param bool with_labels: Set to ``True`` to draw labels on the nodes. Edge
        labels will only be drawn if the ``edge_labels`` parameter is set to a
        function. Defaults to ``False``.
    :param list node_list: An optional list of node indices in the graph to
        draw. If not specified all nodes will be drawn.
    :param list edge_list: An option list of edges in the graph to draw. If not
        specified all edges will be drawn
    :param int|list node_size: Optional size of nodes. If an array is
        specified it must be the same length as node_list. Defaults to 300
    :param node_color: Optional node color. Can be a single color or
        a sequence of colors with the same length as node_list. Color can be
        string or rgb (or rgba) tuple of floats from 0-1. If numeric values
        are specified they will be mapped to colors using the ``cmap`` and
        ``vmin``,``vmax`` parameters. See :func:`matplotlib.scatter` for more
        details. Defaults to ``'#1f78b4'``)
    :param str node_shape: The optional shape node. The specification is the
        same as the :func:`matplotlib.pyplot.scatter` function's ``marker``
        kwarg, valid options are one of
        ``['s', 'o', '^', '>', 'v', '<', 'd', 'p', 'h', '8']``. Defaults to
        ``'o'``
    :param float alpha: Optional value for node and edge transparency
    :param matplotlib.colors.Colormap cmap: An optional Matplotlib colormap
        object for mapping intensities of nodes
    :param float vmin: Optional minimum value for node colormap scaling
    :param float vmax: Optional minimum value for node colormap scaling
    :param float|sequence linewidths: An optional line width for symbol
        borders. If a sequence is specified it must be the same length as
        node_list. Defaults to 1.0
    :param float|sequence width: An optional width to use for edges. Can
        either be a float or sequence  of floats. If a sequence is specified
        it must be the same length as node_list. Defaults to 1.0
    :param str|sequence edge_color: color or array of colors (default='k')
        Edge color. Can be a single color or a sequence of colors with the same
        length as edge_list. Color can be string or rgb (or rgba) tuple of
        floats from 0-1. If numeric values are specified they will be
        mapped to colors using the ``edge_cmap`` and ``edge_vmin``,
        ``edge_vmax`` parameters.
    :param matplotlib.colors.Colormap edge_cmap: An optional Matplotlib
        colormap for mapping intensities of edges.
    :param float edge_vmin: Optional minimum value for edge colormap scaling
    :param float edge_vmax: Optional maximum value for node colormap scaling
    :param str style: An optional string to specify the edge line style.
        For example, ``'-'``, ``'--'``, ``'-.'``, ``':'`` or words like
        ``'solid'`` or ``'dashed'``. See the
        :class:`matplotlib.patches.FancyArrowPatch` attribute and kwarg
        ``linestyle`` for more details. Defaults to ``'solid'``.
    :param func labels: An optional callback function that will be passed a
        node payload and return a string label for the node. For example::

            labels=str

        could be used to just return a string cast of the node's data payload.
        Or something like::

            labels=lambda node: node['label']

        could be used if the node payloads are dictionaries.
    :param func edge_labels: An optional callback function that will be passed
        an edge payload and return a string label for the edge. For example::

            edge_labels=str

        could be used to just return a string cast of the edge's data payload.
        Or something like::

            edge_labels=lambda edge: edge['label']

        could be used if the edge payloads are dictionaries. If this is set
        edge labels will be drawn in the visualization.
    :param int font_size: An optional fontsize to use for text labels, By
        default a value of 12 is used for nodes and 10 for edges.
    :param str font_color: An optional font color for strings. By default
        ``'k'`` (ie black) is set.
    :param str font_weight: An optional string used to specify the font weight.
        By default a value of ``'normal'`` is used.
    :param str font_family: An optional font family to use for strings. By
        default ``'sans-serif'`` is used.
    :param str label: An optional string label to use for the graph legend.
    :param str connectionstyle: An optional value used to create a curved arc
        of rounding radius rad. For example,
        ``connectionstyle='arc3,rad=0.2'``. See
        :class:`matplotlib.patches.ConnectionStyle` and
        :class:`matplotlib.patches.FancyArrowPatch` for more info. By default
        this is set to ``"arc3"``.

    :returns: A matplotlib figure for the visualization if not running with an
        interactive backend (like in jupyter) or if ``ax`` is not set.
    :rtype: matplotlib.figure.Figure

    For Example:

    .. jupyter-execute::

        import matplotlib.pyplot as plt

        import rustworkx as rx
        from rustworkx.visualization import mpl_draw

        G = rx.generators.directed_path_graph(25)
        mpl_draw(G)
        plt.draw()
    r   Nú�matplotlib needs to be installed prior to running rustworkx.visualization.mpl_draw(). You can install matplotlib with:
'pip install matplotlib'Úw)r   r   é   r   )ÚposÚaxÚarrowsÚwith_labels)Úmatplotlib.pyplotÚpyplotÚImportErrorÚgcfÚ
get_figureÚset_facecolorÚaxesÚgcaÚadd_axesÚ
draw_graphÚset_axis_offÚdraw_if_interactiveÚisinteractive)	Úgraphr   r   r   r   ÚkwdsÚpltÚeÚcfs	            úX/granary/edev/quantum/lib/python3.11/site-packages/rustworkx/visualization/matplotlib.pyr   r   B   s&  € ðHØ'Ð'Ð'Ð'Ð'Ð'Ð'øÝð ð ð Ýð9ñ
ô 
ð ð		øøøøðøøøð 
€zØ�WŠW‰YŒYˆˆà�]Š]‰_Œ_ˆØ×Ò�SÑÔÐØ	€zØŒ7ð 	+Ø—’‘”ˆBˆBà—’˜\Ñ*Ô*ˆBåˆuÐU˜# "¨VÀÐUÐUÐPTÐUÐUÐUØ‡O‚OÑÔÐØ×ÒÑÔÐØ×ÒÑÔð  " *Øˆ	ð #- *ó   ‚	 ‰
(“#£(c                 óP  ‡ ‡‡‡‡‡‡‡— 	 ddl m} n"# t          $ r}t          d¦  «        |‚d}~ww xY wh d£Šh d£Šh d£Šh d£Š‰‰z  ‰z  ‰z  Št          ˆfd„|D ¦   «         ¦  «        r3d	                     ˆfd
„|D ¦   «         ¦  «        }t          d|› �¦  «        ‚|                     dd¦  «        Š‰r$ˆ ˆfd„‰                      ¦   «         D ¦   «         |d<   |                     dd¦  «        Š‰r#ˆfd„‰                      ¦   «         D ¦   «         |d<   ˆfd„| 	                    ¦   «         D ¦   «         }ˆfd„| 	                    ¦   «         D ¦   «         }	t          |	                     d¦  «        t          ¦  «        r|	d= ˆfd„| 	                    ¦   «         D ¦   «         }
ˆfd„| 	                    ¦   «         D ¦   «         }|€t          j        ‰ ¦  «        }t          ‰ |fi |¤Ž t!          ‰ |fd|i|	¤Ž |rt#          ‰ |fi |
¤Ž ‰rt%          ‰ |fi |¤Ž |                     ¦   «          dS )aé  Draw the graph using Matplotlib.

    Draw the graph with Matplotlib with options for node positions,
    labeling, titles, and many other drawing features.
    See draw() for simple drawing without labels or axes.

    Parameters
    ----------
    graph: A rustworkx :class:`~rustworkx.PyDiGraph` or
        :class:`~rustworkx.PyGraph`

    pos : dictionary, optional
        A dictionary with nodes as keys and positions as values.
        If not specified a spring layout positioning will be computed.
        See :mod:`rustworkx.drawing.layout` for functions that
        compute node positions.


    Notes
    -----
    For directed graphs, arrows  are drawn at the head end.  Arrows can be
    turned off with keyword arrows=False.

    r   Nr	   >   r   ÚcmapÚvmaxÚvminÚalphaÚlabelÚ	node_listÚ	node_sizeÚ
edgecolorsÚ
linewidthsÚ
node_colorÚ
node_shape>   r   r(   r)   ÚstyleÚwidthÚ	edge_cmapÚ	edge_listÚ	edge_vmaxÚ	edge_vminr*   r+   Ú
arrow_sizeÚ
arrowstyleÚ
edge_colorr/   ÚconnectionstyleÚmin_source_marginÚmin_target_margin>
   r   Úbboxr(   ÚlabelsÚ	font_sizeÚ
font_colorÚfont_familyÚfont_weightÚverticalalignmentÚhorizontalalignment>   r   r<   r(   Úrotater>   r?   Úedge_labelsr@   rA   rB   rC   c                 ó   •— g | ]}|‰v‘ŒS © rG   ©Ú.0ÚkÚ
valid_kwdss     €r"   ú
<listcomp>zdraw_graph.<locals>.<listcomp>C  s   ø€ Ð.Ð.Ð. AˆA�ZÐÐ.Ð.Ð.ó    z, c                 ó   •— g | ]}|‰v¯|‘Œ	S rG   rG   rH   s     €r"   rL   zdraw_graph.<locals>.<listcomp>D  s#   ø€ Ð!IÐ!IÐ!I¨°Q¸jÐ5HÐ5H !Ð5HÐ5HÐ5HrM   zReceived invalid argument(s): r=   c                 ó4   •— i | ]}| ‰‰|         ¦  «        “ŒS rG   rG   )rI   Úxr   Úlabel_fns     €€r"   ú
<dictcomp>zdraw_graph.<locals>.<dictcomp>I  s)   ø€ ÐNÐNÐN°A˜!˜X˜X e¨A¤hÑ/Ô/ÐNÐNÐNrM   rE   c                 óP   •— i | ]"}|d          |d         f ‰|d         ¦  «        “Œ#S )r   r   é   rG   )rI   rP   Úedge_label_fns     €r"   rR   zdraw_graph.<locals>.<dictcomp>L  sB   ø€ ð 
ð 
ð 
Ø23ˆQˆqŒT�1�Q”4ˆL˜-˜-¨¨!¬Ñ-Ô-ð
ð 
ð 
rM   c                 ó$   •— i | ]\  }}|‰v ¯	||“ŒS rG   rG   )rI   rJ   ÚvÚvalid_node_kwdss      €r"   rR   zdraw_graph.<locals>.<dictcomp>P  ó)   ø€ ÐGÐGÐG™$˜!˜Q°!°Ð2FÐ2F��AÐ2FÐ2FÐ2FrM   c                 ó$   •— i | ]\  }}|‰v ¯	||“ŒS rG   rG   )rI   rJ   rW   Úvalid_edge_kwdss      €r"   rR   zdraw_graph.<locals>.<dictcomp>Q  rY   rM   r(   c                 ó$   •— i | ]\  }}|‰v ¯	||“ŒS rG   rG   )rI   rJ   rW   Úvalid_label_kwdss      €r"   rR   zdraw_graph.<locals>.<dictcomp>T  s*   ø€ ÐIÐIÐI™4˜1˜a°1Ð8HÐ3HÐ3H�!�QÐ3HÐ3HÐ3HrM   c                 ó$   •— i | ]\  }}|‰v ¯	||“ŒS rG   rG   )rI   rJ   rW   Úvalid_edge_label_kwdss      €r"   rR   zdraw_graph.<locals>.<dictcomp>U  s*   ø€ ÐSÐSÐS¡  1¸Ð=RÐ8RÐ8R�q˜!Ð8RÐ8RÐ8RrM   r   )r   r   r   ÚanyÚjoinÚ
ValueErrorÚpopÚnode_indicesÚweighted_edge_listÚitemsÚ
isinstanceÚgetÚlistÚ	rustworkxÚspring_layoutÚ
draw_nodesÚ
draw_edgesÚdraw_labelsÚdraw_edge_labelsr   )r   r   r   r   r   r   r    Úinvalid_argsÚ	node_kwdsÚ	edge_kwdsÚ
label_kwdsÚedge_label_kwdsrU   rQ   r[   r_   rK   r]   rX   s   `           @@@@@@@r"   r   r   à   s  øøøøøøøø€ ð2Ø'Ð'Ð'Ð'Ð'Ð'Ð'øÝð ð ð Ýð9ñ
ô 
ð ð		øøøøðøøøðð ð €Oðð ð €Oð*ð ð Ððð ð Ðð ! ?Ñ2Ð5EÑEÐH]Ñ]€Jå
Ð.Ð.Ð.Ð.¨Ð.Ñ.Ô.Ñ/Ô/ð JØ—y’yÐ!IÐ!IÐ!IÐ!I¨TÐ!IÑ!IÔ!IÑJÔJˆÝÐH¸,ÐHÐHÑIÔIÐIà�xŠx˜ $Ñ'Ô'€HØð OØNÐNÐNÐNÐN¸×9KÒ9KÑ9MÔ9MÐNÑNÔNˆˆX‰Ø—H’H˜]¨DÑ1Ô1€MØð 
ð
ð 
ð 
ð 
Ø7<×7OÒ7OÑ7QÔ7Qð
ñ 
ô 
ˆˆ]Ñð HÐGÐGÐG $§*¢*¡,¤,ÐGÑGÔG€IØGÐGÐGÐG $§*¢*¡,¤,ÐGÑGÔG€IÝ�)—-’- Ñ(Ô(­$Ñ/Ô/ð Ø�gÐØIÐIÐIÐI 4§:¢:¡<¤<ÐIÑIÔI€JØSÐSÐSÐS¨¯
ª
©¬ÐSÑSÔS€Oà
€{ÝÔ% eÑ,Ô,ˆåˆu�cÐ'Ð'˜YÐ'Ð'Ð'Ýˆu�cÐ6Ð6 &Ð6¨IÐ6Ð6Ð6Øð .Ý�E˜3Ð-Ð- *Ð-Ð-Ð-Øð 8Ý˜ Ð7Ð7 Ð7Ð7Ð7Ø×ÒÑÔÐÐÐs   Š ‘
0›+«0é,  ú#1f78b4Úoc                 óÎ  ‡— 	 ddl }ddl}ddlm} n"# t          $ r}t	          d¦  «        |‚d}~ww xY w|
€|                     ¦   «         }
|€|                      ¦   «         }t          |¦  «        dk    r|j         	                    d¦  «        S 	 t          j        ˆfd„|D ¦   «         ¦  «        }n&# t          $ r}t          d|› d�¦  «        |‚d}~ww xY wt          |t          ¦  «        rt!          ||||||	¦  «        }d}|
                     |dd…df         |dd…df         ||||||	||||¬¦  «        }|
                     d	d	d
d
d
d
¬¦  «         |                     d¦  «         |S )a†  Draw the nodes of the graph.

    This draws only the nodes of the graph.

    :param graph: A rustworkx graph, either a :class:`~rustworkx.PyGraph` or a
        :class:`~rustworkx.PyDiGraph`.

    :param dict pos: A dictionary with nodes as keys and positions as values.
        Positions should be sequences of length 2.

    :param Axes ax: An optional Matplotlib Axes object, if specified it will
        draw the graph in the specified Matplotlib axes.

    :param list node_list: If specified only draw the specified node indices.
        If not specified all nodes in the graph will be drawn.

    :param float|array node_size: Size of nodes. If an array it must be the
        same length as node_list. Defaults to 300

    node_color : color or array of colors (default='#1f78b4')
        Node color. Can be a single color or a sequence of colors with the same
        length as node_list. Color can be string or rgb (or rgba) tuple of
        floats from 0-1. If numeric values are specified they will be
        mapped to colors using the cmap and vmin,vmax parameters. See
        matplotlib.scatter for more details.

    node_shape :  string (default='o')
        The shape of the node.  Specification is as matplotlib.scatter
        marker, one of 'so^>v<dph8'.

    alpha : float or array of floats (default=None)
        The node transparency.  This can be a single alpha value,
        in which case it will be applied to all the nodes of color. Otherwise,
        if it is an array, the elements of alpha will be applied to the colors
        in order (cycling through alpha multiple times if necessary).

    cmap : Matplotlib colormap (default=None)
        Colormap for mapping intensities of nodes

    vmin,vmax : floats or None (default=None)
        Minimum and maximum for node colormap scaling

    linewidths : [None | scalar | sequence] (default=1.0)
        Line width of symbol border

    edgecolors : [None | scalar | sequence] (default = node_color)
        Colors of node borders

    label : [None | string]
        Label for legend

    Returns
    -------
    matplotlib.collections.PathCollection
        `PathCollection` of the nodes.

    r   Nr	   c                 ó    •— g | ]
}‰|         ‘ŒS rG   rG   )rI   rW   r   s     €r"   rL   zdraw_nodes.<locals>.<listcomp>Â  s   ø€ Ð3Ð3Ð3 A˜˜QœÐ3Ð3Ð3rM   zNode z has no position.r   )
ÚsÚcÚmarkerr%   r'   r&   r(   r-   r,   r)   ÚbothF©ÚaxisÚwhichÚbottomÚleftÚlabelbottomÚ	labelleftrT   )Ú
matplotlibÚmatplotlib.collectionsr   r   r   r   rd   ÚlenÚcollectionsÚPathCollectionÚnpÚasarrayÚKeyErrorÚ
IndexErrorrg   r   Úapply_alphaÚscatterÚtick_paramsÚ
set_zorder)r   r   r*   r+   r.   r/   r(   r%   r'   r&   r   r-   r,   r)   Úmplr…   r   r    ÚxyÚnode_collections    `                  r"   rl   rl   c  sú  ø€ ðR	Ø Ð Ð Ð Ø%Ð%Ð%Ð%Ø'Ð'Ð'Ð'Ð'Ð'Ð'øÝð ð ð Ýð9ñ
ô 
ð ð		øøøøðøøøð 
€zØ�WŠW‰YŒYˆàÐØ×&Ò&Ñ(Ô(ˆ	õ ˆ9�~„~˜ÒÐØŒ×-Ò-¨dÑ3Ô3Ð3ð>ÝŒZÐ3Ð3Ð3Ð3¨Ð3Ñ3Ô3Ñ4Ô4ˆˆøÝð >ð >ð >ÝÐ5 Ð5Ð5Ð5Ñ6Ô6¸AÐ=øøøøð>øøøõ �%�Ñ"Ô"ð Ý  ¨U°I¸tÀTÈ4ÑPÔPˆ
Øˆà—j’jØ
ˆ1ˆ1ˆ1ˆaˆ4ŒØ
ˆ1ˆ1ˆ1ˆaˆ4ŒØ
Ø
ØØØØØØØØð !ñ ô €Oð ‡N‚NØØØØØØð ñ ô ð ð ×Ò˜qÑ!Ô!Ð!ØÐs(   ƒ ’
1œ,¬1Â B/ Â/
CÂ9CÃCç      ð?rJ   Úsolidé
   Úarc3c                 óÄ  ‡	‡‡7‡8‡9‡:‡;— 	 ddl Š;ddl}ddl}ddl}ddlm} n"# t          $ r}t          d¦  «        |‚d}~ww xY w|€!t          | t          j	        ¦  «        r|rd}nd}‰€| 
                    ¦   «         Š|€|                      ¦   «         }t          |¦  «        dk    rg S |€!t          |                      ¦   «         ¦  «        }|€d}t          ¦   «         }|D ];}d|t!          ||d                  ¦  «        t!          ||d                  ¦  «        f<   Œ<|                     ¦   «         }t%          j        |¦  «        r¾t          |¦  «        t          |¦  «        k    ržt%          j        d„ |D ¦   «         ¦  «        r€‰	�t          ‰	‰;j        j        ¦  «        sJ ‚n|                     ¦   «         Š	|
€t1          |¦  «        }
|€t3          |¦  «        }‰;j                             |
|¬	¦  «        Š8ˆ8ˆ	fd
„|D ¦   «         }d„ }g }|}‰;j                             |¦  «        Š7t%          j        |¦  «                             ¦   «         Š:‰;j        j                             ||¦  «        }tA          |¦  «        D �]\  }}|d         d         |d         d         }!} |d         d         |d         d         }#}"d}$d}%t%          j        |¦  «        rb||         dd…         \  }&}'|| !                    |&¦  «                 }(|| !                    |'¦  «                 }) ||(|¦  «        }$ ||)|¦  «        }%n |||¦  «        x}$}%|$|k     r|}$|%|k     r|}%t          |¦  «        t          |¦  «        k    r	||         }*n4t          |¦  «        dk    r	|d         }*n||t          |¦  «        z           }*t%          j        |¦  «        rBt          |¦  «        t          |¦  «        k    r	||         }+n||t          |¦  «        z           }+n|}+t!          tE          |¦  «        ¦  «        |v rd},nd},‰;j         #                    | |!f|"|#f||$|%||*|+|d|,› �z   |d¬¦  «        }-| $                    |-¦  «         ‰ %                    |-¦  «         �Œ	t%          j&        t!          |¦  «        ¦  «        }t%          j'        t%          j(        |dd…dd…df         ¦  «        ¦  «        }.t%          j)        t%          j(        |dd…dd…df         ¦  «        ¦  «        }/t%          j'        t%          j(        |dd…dd…df         ¦  «        ¦  «        }0t%          j)        t%          j(        |dd…dd…df         ¦  «        ¦  «        }1|/|.z
  }2|1|0z
  Š9ˆˆ7ˆ9ˆ:ˆ;fd„}3d|2z  d‰9z  }5}4|.|4z
  |0|5z
  f|/|4z   |1|5z   ff}6‰ *                    |6¦  «         ‰ +                    ¦   «          ‰ ,                    dddddd¬¦  «         |S )a!  Draw the edges of the graph.

    This draws only the edges of the graph.

    Parameters
    ----------
    graph: A rustworkx graph

    pos : dictionary
        A dictionary with nodes as keys and positions as values.
        Positions should be sequences of length 2.

    edge_list : collection of edge tuples (default=graph.edge_list())
        Draw only specified edges

    width : float or array of floats (default=1.0)
        Line width of edges

    edge_color : color or array of colors (default='k')
        Edge color. Can be a single color or a sequence of colors with the same
        length as edge_list. Color can be string or rgb (or rgba) tuple of
        floats from 0-1. If numeric values are specified they will be
        mapped to colors using the edge_cmap and edge_vmin,edge_vmax
        parameters.

    style : string (default=solid line)
        Edge line style e.g.: '-', '--', '-.', ':'
        or words like 'solid' or 'dashed'.
        (See `matplotlib.patches.FancyArrowPatch`: `linestyle`)

    alpha : float or None (default=None)
        The edge transparency

    edge_cmap : Matplotlib colormap, optional
        Colormap for mapping intensities of edges

    edge_vmin,edge_vmax : floats, optional
        Minimum and maximum for edge colormap scaling

    ax : Matplotlib Axes object, optional
        Draw the graph in the specified Matplotlib axes.

    arrows : bool, optional (default=True)
        For directed graphs, if True set default to drawing arrowheads.
        Otherwise set default to no arrowheads. Ignored if `arrowstyle` is set.

        Note: Arrows will be the same color as edges.

    arrowstyle : str (default='-\|>' if directed else '-')
        For directed graphs and `arrows==True` defaults to '-\|>',
        otherwise defaults to '-'.

        See `matplotlib.patches.ArrowStyle` for more options.

    arrow_size : int (default=10)
        For directed graphs, choose the size of the arrow head's length and
        width. See `matplotlib.patches.FancyArrowPatch` for attribute
        ``mutation_scale`` for more info.

    node_size : scalar or array (default=300)
        Size of nodes. Though the nodes are not drawn with this function, the
        node size is used in determining edge positioning.

    node_list : list, optional (default=graph.node_indices())
       This provides the node order for the `node_size` array (if it is an
       array).

    node_shape :  string (default='o')
        The marker used for nodes, used in determining edge positioning.
        Specification is as a `matplotlib.markers` marker, e.g. one of
        'so^>v<dph8'.

    label : None or string
        Label for legend

    min_source_margin : int (default=0)
        The minimum margin (gap) at the beginning of the edge at the source.

    min_target_margin : int (default=0)
        The minimum margin (gap) at the end of the edge at the target.

    Returns
    -------
    list of matplotlib.patches.FancyArrowPatch
        `FancyArrowPatch` instances of the directed edges

    Notes
    -----
    For directed graphs, arrows are drawn at the head end.  Arrows can be
    turned off with keyword arrows=False or by passing an arrowstyle without
    an arrow on the end.

    Be sure to include `node_size` as a keyword argument; arrows are
    drawn considering the size of nodes.
    r   Nr	   z-|>ú-rJ   r   c                 ó8   — g | ]}t          |t          ¦  «        ‘ŒS rG   )rg   r   )rI   r{   s     r"   rL   zdraw_edges.<locals>.<listcomp>‰  s"   € Ð>Ð>Ð>¨a•J˜q¥&Ñ)Ô)Ð>Ð>Ð>rM   )r'   r&   c                 ó8   •— g | ]} ‰ ‰|¦  «        ¦  «        ‘ŒS rG   rG   )rI   r    Úcolor_normalr2   s     €€r"   rL   zdraw_edges.<locals>.<listcomp>”  s+   ø€ ÐEÐEÐE°Q�i�i  ¨Q¡¤Ñ0Ô0ÐEÐEÐErM   c                 ól   — |dv rt          j        d| z  ¦  «        dz  S t          j        | ¦  «        dz  S )Nzs^>v<drT   )rŠ   Úsqrt)Úmarker_sizer|   s     r"   Úto_marker_edgez"draw_edges.<locals>.to_marker_edgeš  s;   € Ø�XÐÐÝ”7˜1˜{™?Ñ+Ô+¨aÑ/Ð/å”7˜;Ñ'Ô'¨!Ñ+Ð+rM   rT   ç      Ð?ç        z, rad = )	r7   ÚshrinkAÚshrinkBÚmutation_scaleÚcolorÚ	linewidthr9   Ú	linestyleÚzorderc                 óp  •— t          j        | |k    ¦  «        �r‰dk    rd‰z  n‰}‰
j                             ¦   «                              | ¦  «        }d|z  }|dz  }|t          j        d|g¦  «        z   |t          j        ||g¦  «        z   |t          j        |dg¦  «        z   ||t          j        | dg¦  «        z   |t          j        | |g¦  «        z   |t          j        d|g¦  «        z   g}‰j                             ‰
j                             |¦  «        g d¢¦  «        }	n ‰| |g|¢R i |¤Ž}	|	S )Nr   g{®Gázt?gš™™™™™¹?ç      à?)r   é   r­   r­   r­   r­   r­   )rŠ   ÚallÚ	transDataÚinvertedÚ	transformr‹   ÚpathÚPath)ÚposAÚposBÚargsÚkwargsÚselfloop_htÚdata_locÚv_shiftÚh_shiftr²   Úretr   Úbase_connectionstyleÚhÚmax_nodesizer’   s             €€€€€r"   Ú_connectionstylez$draw_edges.<locals>._connectionstyleð  sX  ø€ åŒ6�$˜$’,ÑÔñ 	Dð 34°q²&°&˜% ,Ñ.Ð.¸aˆKð ”|×,Ò,Ñ.Ô.×8Ò8¸Ñ>Ô>ˆHØ˜KÑ'ˆGØ ‘mˆGð �2œ: q¨' lÑ3Ô3Ñ3à�2œ: w°Ð&8Ñ9Ô9Ñ9Ø�2œ: w° lÑ3Ô3Ñ3Øà�2œ:¨ x° mÑ4Ô4Ñ4Ø�2œ:¨ x°Ð&9Ñ:Ô:Ñ:Ø�2œ: q¨' lÑ3Ô3Ñ3ðˆDð ”(—-’- ¤× 6Ò 6°tÑ <Ô <Ð>SÐ>SÐ>SÑTÔTˆCˆCð 'Ð& t¨TÐC°DÐCÐCÐC¸FÐCÐCˆCàˆ
rM   gš™™™™™©?r}   Fr~   )-r…   Úmatplotlib.colorsÚmatplotlib.patchesÚmatplotlib.pathr   r   r   rg   rj   Ú	PyDiGraphr   r3   r‡   ri   rd   ÚdictÚtupleÚkeysrŠ   Úiterabler®   ÚcolorsÚColormapÚget_cmapÚminÚmaxÚ	NormalizeÚpatchesÚConnectionStyleÚarrayÚcolorConverterÚto_rgba_arrayÚ	enumerateÚindexÚreversedÚFancyArrowPatchÚappendÚ	add_patchr‹   ÚaminÚravelÚamaxÚupdate_datalimÚautoscale_viewr�   )<r   r   r3   r1   r8   r0   r(   r7   r6   r2   r5   r4   r   r   r)   r+   r*   r/   r9   r:   r;   r…   r   r    Úedge_pos_keysÚedge_posr¡   Úarrow_collectionr¦   Úarrow_colorsÚiÚedgeÚx1Úy1Úx2Úy2Úshrink_sourceÚshrink_targetÚsourceÚtargetÚsource_node_sizeÚtarget_node_sizeÚarrow_colorÚ
line_widthÚradÚarrowÚmirustworkxÚmaxxÚminyÚmaxyr
   rÀ   ÚpadxÚpadyÚcornersr½   r�   r¾   r¿   r’   s<            `  `                                          @@@@@r"   rm   rm   å  s¾  øøøøøøø€ ðlØ Ð Ð Ð Ø Ð Ð Ð Ø!Ð!Ð!Ð!ØÐÐÐØ'Ð'Ð'Ð'Ð'Ð'Ð'øÝð ð ð Ýð9ñ
ô 
ð ð		øøøøðøøøð ÐÝ�e�YÔ0Ñ1Ô1ð 	°fð 	ØˆJˆJàˆJà	€zØ�WŠW‰YŒYˆàÐØ—O’OÑ%Ô%ˆ	å
ˆ9�~„~˜ÒÐØˆ	àÐÝ˜×+Ò+Ñ-Ô-Ñ.Ô.ˆ	ð ÐØˆ
õ ‘F”F€MØð Cð CˆØ>Bˆ•u˜S  1¤œYÑ'Ô'­¨s°1°Q´4¬yÑ)9Ô)9Ð:Ñ;Ð;Ø×!Ò!Ñ#Ô#€Hõ
 	Œ�JÑÔðFå�‰_Œ_¥ H¡¤Ò-Ð-ÝŒFÐ>Ð>°:Ð>Ñ>Ô>Ñ?Ô?ð .ð Ð Ý˜i¨¬Ô)<Ñ=Ô=Ð=Ð=Ð=Ð=àŸš™œˆIØÐÝ˜J™œˆIØÐÝ˜J™œˆIØ”z×+Ò+°ÀÐ+ÑKÔKˆØEÐEÐEÐEÐE¸*ÐEÑEÔEˆ
ð,ð ,ð ,ð ÐØ€Nàœ;×6Ò6°ÑGÔGÐõ ”8˜IÑ&Ô&×*Ò*Ñ,Ô,€Lð ”:Ô,×:Ò:¸:ÀuÑMÔM€LÝ˜XÑ&Ô&ð 8ñ 8‰ˆˆ4Ø�a”˜”˜T !œW QœZˆBˆØ�a”˜”˜T !œW QœZˆBˆØˆØˆÝŒ;�yÑ!Ô!ð 	RØ& qœ\¨"¨1¨"Ô-‰NˆF�FØ(¨¯ª¸Ñ)@Ô)@ÔAÐØ(¨¯ª¸Ñ)@Ô)@ÔAÐØ*˜NÐ+;¸ZÑHÔHˆMØ*˜NÐ+;¸ZÑHÔHˆMˆMà,:¨N¸9ÀjÑ,QÔ,QÐQˆM˜MàÐ,Ò,Ð,Ø-ˆMàÐ,Ò,Ð,Ø-ˆMåˆ|ÑÔ¥ H¡¤Ò-Ð-Ø& qœ/ˆKˆKÝ�ÑÔ !Ò#Ð#Ø& qœ/ˆKˆKà& q­3¨|Ñ+<Ô+<Ñ'<Ô=ˆKåŒ;�uÑÔð 	Ý�5‰zŒz�S ™]œ]Ò*Ð*Ø" 1œX�
�
à" 1¥s¨5¡z¤z¡>Ô2�
�
àˆJõ •˜$‘”Ñ Ô  HÐ,Ð,ØˆCˆCàˆCà”×+Ò+Ø�ˆHØ�ˆHØ!Ø!Ø!Ø)ØØ Ø+Ð.>¸Ð.>Ð.>Ñ>ØØð ,ñ 
ô 
ˆð 	×Ò Ñ&Ô&Ð&Ø
�Š�UÑÔÐÑåŒz�% ™/œ/Ñ*Ô*€Hõ ”'�"œ( 8¨A¨A¨A¨q¨q¨q°!¨GÔ#4Ñ5Ô5Ñ6Ô6€KÝŒ7•2”8˜H Q Q Q¨¨¨¨1 WÔ-Ñ.Ô.Ñ/Ô/€DÝŒ7•2”8˜H Q Q Q¨¨¨¨1 WÔ-Ñ.Ô.Ñ/Ô/€DÝŒ7•2”8˜H Q Q Q¨¨¨¨1 WÔ-Ñ.Ô.Ñ/Ô/€DØˆ{Ñ€AØˆt‰€Aðð ð ð ð ð ð ð ð ðD ˜‘˜4 !™8ˆ$€DØ˜TÑ! 4¨$¡;Ð/°$¸±+¸tÀd¹{Ð1KÐK€GØ×Ò�gÑÔÐØ×ÒÑÔÐà‡N‚NØØØØØØð ñ ô ð ð Ðs   ‰   
?ª:º?é   ú
sans-serifÚnormalÚcenterc                 óê  — 	 ddl m} n"# t          $ r}t          d¦  «        |‚d}~ww xY w|€|                     ¦   «         }|€d„ |                      ¦   «         D ¦   «         }i }|                     ¦   «         D ]`\  }}||         \  }}t          |t          ¦  «        st          |¦  «        }|                     |||||||||	|
|j	        ||¬¦  «        }|||<   Œa| 
                    dddddd¬¦  «         |S )	aú  Draw node labels on the graph.

    Parameters
    ----------
    graph: A rustworkx graph

    pos : dictionary
        A dictionary with nodes as keys and positions as values.
        Positions should be sequences of length 2.

    labels : dictionary (default={n: n for n in graph})
        Node labels in a dictionary of text labels keyed by node.
        Node-keys in labels should appear as keys in `pos`.
        If needed use: `{n:lab for n,lab in labels.items() if n in pos}`

    font_size : int (default=12)
        Font size for text labels

    font_color : string (default='k' black)
        Font color string

    font_weight : string (default='normal')
        Font weight

    font_family : string (default='sans-serif')
        Font family

    alpha : float or None (default=None)
        The text transparency

    bbox : Matplotlib bbox, (default is Matplotlib's ax.text default)
        Specify text box properties (e.g. shape, color etc.) for node labels.

    horizontalalignment : string (default='center')
        Horizontal alignment {'center', 'right', 'left'}

    verticalalignment : string (default='center')
        Vertical alignment {'center', 'top', 'bottom', 'baseline',
                            'center_baseline'}

    ax : Matplotlib Axes object, optional
        Draw the graph in the specified Matplotlib axes.

    clip_on : bool (default=True)
        Turn on clipping of node labels at axis boundaries

    Returns
    -------
    dict
        `dict` of labels keyed on the nodes
    r   Nr	   c                 ó   — i | ]}||“ŒS rG   rG   )rI   Úns     r"   rR   zdraw_labels.<locals>.<dictcomp>r  s   € Ð5Ð5Ð5˜1�!�QÐ5Ð5Ð5rM   )
Úsizer§   ÚfamilyÚweightr(   rC   rB   r±   r<   Úclip_onr}   Fr~   )r   r   r   r   rd   rf   rg   ÚstrÚtextr¯   r�   )r   r   r=   r>   r?   r@   rA   r(   r<   rC   rB   r   r  r   r    Ú
text_itemsr   r)   rP   ÚyÚts                        r"   rn   rn   #  s]  € ðDØ'Ð'Ð'Ð'Ð'Ð'Ð'øÝð ð ð Ýð9ñ
ô 
ð ð		øøøøðøøøð 
€zØ�WŠW‰YŒYˆà€~Ø5Ð5 × 2Ò 2Ñ 4Ô 4Ð5Ñ5Ô5ˆà€JØ—L’L‘N”Nð ð ‰ˆˆ5Ø�Q”‰ˆˆAÝ˜%¥Ñ%Ô%ð 	Ý˜‘J”JˆEØ�GŠGØØØØØØØØØ 3Ø/Ø”lØØð ñ 
ô 
ˆð ˆ
�1‰ˆà‡N‚NØØØØØØð ñ ô ð ð Ðr#   r¬   c                 óP  — 	 ddl m} n"# t          $ r}t          d¦  «        |‚d}~ww xY w|€|                     ¦   «         }|€d„ |                      ¦   «         D ¦   «         }n|}i }|                     ¦   «         D �]�\  \  }}}||         \  }}||         \  }}||z  |d|z
  z  z   ||z  |d|z
  z  z   }}||f|                     ¦   «         v r.t          j        ||z
  ¦  «        }||k    r	|d|z  z  }n|d|z  z  }|r¢t          j	        ||z
  ||z
  ¦  «        dt          j
        z  z  dz  }|d	k    r|d
z  }|dk     r|d
z  }t          j        ||f¦  «        }|j                             t          j        |f¦  «        |                     d¦  «        ¦  «        d         }nd}|	€t          ddd¬¦  «        }	t!          |t"          ¦  «        st#          |¦  «        }|                     |||||||||
|||j        |	d|¬¦  «        } | |||f<   �Œ‘|                     dddddd¬¦  «         |S )aˆ  Draw edge labels.

    Parameters
    ----------
    graph: A rustworkx graph

    pos : dictionary
        A dictionary with nodes as keys and positions as values.
        Positions should be sequences of length 2.

    edge_labels : dictionary (default={})
        Edge labels in a dictionary of labels keyed by edge two-tuple.
        Only labels for the keys in the dictionary are drawn.

    label_pos : float (default=0.5)
        Position of edge label along edge (0=head, 0.5=center, 1=tail)

    font_size : int (default=10)
        Font size for text labels

    font_color : string (default='k' black)
        Font color string

    font_weight : string (default='normal')
        Font weight

    font_family : string (default='sans-serif')
        Font family

    alpha : float or None (default=None)
        The text transparency

    bbox : Matplotlib bbox, optional
        Specify text box properties (e.g. shape, color etc.) for edge labels.
        Default is {boxstyle='round', ec=(1.0, 1.0, 1.0), fc=(1.0, 1.0, 1.0)}.

    horizontalalignment : string (default='center')
        Horizontal alignment {'center', 'right', 'left'}

    verticalalignment : string (default='center')
        Vertical alignment {'center', 'top', 'bottom', 'baseline',
                            'center_baseline'}

    ax : Matplotlib Axes object, optional
        Draw the graph in the specified Matplotlib axes.

    rotate : bool (default=True)
        Rotate edge labels to lie parallel to edges

    clip_on : bool (default=True)
        Turn on clipping of edge labels at axis boundaries

    Returns
    -------
    dict
        `dict` of labels keyed by edge
    r   Nr	   c                 ó    — i | ]\  }}}||f|“ŒS rG   rG   )rI   ÚurW   Úds       r"   rR   z$draw_edge_labels.<locals>.<dictcomp>ì  s$   € ÐFÐFÐF¡  1 a�1�a�&˜!ÐFÐFÐFrM   r•   r¢   g       @ih  éZ   é´   i¦ÿÿÿ)r   rT   r£   Úround)r•   r•   r•   )ÚboxstyleÚecÚfcr   )r  r§   r  r  r(   rC   rB   Úrotationr±   r<   rª   r  r}   Fr~   )r   r   r   r   re   rf   rÇ   rŠ   ÚabsÚarctan2ÚpirÑ   r¯   Útransform_anglesÚreshaperÅ   rg   r  r  r�   )!r   r   rE   Ú	label_posr>   r?   r@   rA   r(   r<   rC   rB   r   rD   r  r   r    r=   r  Ún1Ún2r)   rå   ræ   rç   rè   rP   r  ÚdyÚangler“   Útrans_angler	  s!                                    r"   ro   ro   –  sÀ  € ðTØ'Ð'Ð'Ð'Ð'Ð'Ð'øÝð ð ð Ýð9ñ
ô 
ð ð		øøøøðøøøð 
€zØ�WŠW‰YŒYˆØÐØFÐF¨5×+CÒ+CÑ+EÔ+EÐFÑFÔFˆˆàˆØ€JØ!Ÿ<š<™>œ>ð 2!ñ 2!‰‰ˆˆR�%Ø�r”7‰ˆˆRØ�r”7‰ˆˆRà�‰N˜R 3¨¡?Ñ3Ñ3Ø�‰N˜R 3¨¡?Ñ3Ñ3ð ˆð �ˆ8�v—{’{‘}”}Ð$Ð$Ý”˜˜R™‘”ˆBØ�BŠwˆwØ�T˜B‘Y‘��à�T˜B‘Y‘�àð 	å”J˜r B™w¨¨R©Ñ0Ô0°C½"¼%±KÑ@À3ÑFˆEà�rŠzˆzØ˜‘�Ø�sŠ{ˆ{Ø˜‘�å”˜1˜a˜&Ñ!Ô!ˆBØœ,×7Ò7½¼À%ÀÑ8JÔ8JÈBÏJÊJÐW]ÑL^ÔL^Ñ_Ô_Ð`aÔbˆKˆKàˆKàˆ<Ý ¨_ÀÐQÑQÔQˆDÝ˜%¥Ñ%Ô%ð 	Ý˜‘J”JˆEà�GŠGØØØØØØØØØ 3Ø/Ø Ø”lØØØð ñ 
ô 
ˆð"  !ˆ
�B˜�8ÑÑà‡N‚NØØØØØØð ñ ô ð ð Ðr#   c                 óø  ‡
— 	 ddl Š
ddl}ddl}n"# t          $ r}t          d¦  «        |‚d}~ww xY wt	          | ¦  «        t	          |¦  «        k    rbt          | d         t          ¦  «        rG‰
j                             |¬¦  «        }| 	                    ||¦  «         | 
                    | ¦  «        }	nd	 t          j        ‰
j        j         
                    | ¦  «        g¦  «        }	n0# t          $ r# t          j        ˆ
fd„| D ¦   «         ¦  «        }	Y nw xY w	 t	          |¦  «        t	          |	¦  «        k    s|	j        t	          |¦  «        k    rQt          j        |	t	          |¦  «        df¦  «        }	|	d         |	dd…df<   |	d	         |	dd…df<   |	d
         |	dd…df<   t%          t'          t)          |¦  «        t	          |	¦  «        ¦  «        ¦  «        |	dd…df<   n# t*          $ r ||	dd…df<   Y nw xY w|	S )a!  Apply an alpha (or list of alphas) to the colors provided.

    Parameters
    ----------

    colors : color string or array of floats (default='r')
        Color of element. Can be a single color format string,
        or a sequence of colors with the same length as node_list.
        If numeric values are specified they will be mapped to
        colors using the cmap and vmin,vmax parameters.  See
        matplotlib.scatter for more details.

    alpha : float or array of floats
        Alpha values for elements. This can be a single alpha value, in
        which case it will be applied to all the elements of color. Otherwise,
        if it is an array, the elements of alpha will be applied to the colors
        in order (cycling through alpha multiple times if necessary).

    elem_list : array of rustworkx objects
        The list of elements which are being colored. These could be nodes,
        edges or labels.

    cmap : matplotlib colormap
        Color map for use if colors is a list of floats corresponding to points
        on a color mapping.

    vmin, vmax : float
        Minimum and maximum values for normalizing colors if a colormap is used

    Returns
    -------

    rgba_colors : numpy ndarray
        Array containing RGBA format values for each of the node colours.

    r   Nr	   )r%   c                 óN   •— g | ]!}‰j         j                             |¦  «        ‘Œ"S rG   )rÉ   rÒ   Úto_rgba)rI   r§   r’   s     €r"   rL   zapply_alpha.<locals>.<listcomp>m  s-   ø€ Ð#aÐ#aÐ#aÐQV C¤JÔ$=×$EÒ$EÀeÑ$LÔ$LÐ#aÐ#aÐ#arM   r­   )r   r   r   )r   r   )r   rT   rT   é   éÿÿÿÿ)r…   rÁ   Úmatplotlib.cmr   r‡   rg   r   ÚcmÚScalarMappableÚset_climr"  rŠ   rÑ   rÉ   rÒ   rb   r  Úresizeri   r   r   Ú	TypeError)rÉ   r(   Ú	elem_listr%   r'   r&   r…   r    ÚmapperÚrgba_colorsr’   s             @r"   rŽ   rŽ   0  sM  ø€ ðJ	Ø Ð Ð Ð Ø Ð Ð Ð ØÐÐÐÐøÝð ð ð Ýð9ñ
ô 
ð ð		øøøøðøøøõ ˆ6�{„{•c˜)‘n”nÒ$Ð$­°F¸1´I½vÑ)FÔ)FÐ$Ø”×&Ò&¨DÐ&Ñ1Ô1ˆØ�Š˜˜dÑ#Ô#Ð#Ø—n’n VÑ,Ô,ˆˆð
	cÝœ( C¤JÔ$=×$EÒ$EÀfÑ$MÔ$MÐ#NÑOÔOˆKˆKøÝð 	cð 	cð 	cÝœ(Ð#aÐ#aÐ#aÐ#aÐZ`Ð#aÑ#aÔ#aÑbÔbˆKˆKˆKð	cøøøð#õ
 ˆu‰:Œ:�˜KÑ(Ô(Ò(Ð(¨KÔ,<ÅÀIÁÄÒ,NÐ,NÝœ) Kµ#°i±.´.À!Ð1DÑEÔEˆKØ!,¨TÔ!2ˆK˜˜˜˜A˜ÑØ!,¨TÔ!2ˆK˜˜˜˜A˜ÑØ!,¨TÔ!2ˆK˜˜˜˜A˜ÑÝ ¥­¨e©¬µc¸+Ñ6FÔ6FÑ!GÔ!GÑHÔHˆ�A�A�A�q�DÑÐøÝð #ð #ð #Ø"ˆ�A�A�A�r�EÑÐÐð#øøøàÐs5   ƒ �
/š*ª/Â52C( Ã(*DÄDÄCG! Ç!G7Ç6G7)NNTF)NTF)Nru   rv   rw   NNNNNNNN)Nr•   rJ   r–   NNr—   NNNNTNru   Nrw   r˜   r   r   )Nrú   rJ   rû   rü   NNrý   rý   NT)Nr¬   r—   rJ   rû   rü   NNrý   rý   NTT)NNN)Ú__doc__Úcollections.abcr   Ú	itertoolsr   r   Únumbersr   ÚnumpyrŠ   rj   Ú__all__r   r   rl   rm   rn   ro   rŽ   rG   rM   r"   ú<module>r4     sÕ  ððd .Ð -à $Ð $Ð $Ð $Ð $Ð $Ø #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð à Ð Ð Ð à Ð Ð Ð ð ð€ð
[ð [ð [ð [ð|@ð @ð @ð @ðL ØØØØ
Ø	Ø	Ø	ØØØØ
ðð ð ð ðJ Ø
ØØ
Ø
ØØØØØØØØ
ØØØØØØð+{ð {ð {ð {ðB
 ØØØØØ
Ø	Ø ØØØðpð pð pð pðl ØØØØØØ
Ø	Ø ØØØØðWð Wð Wð WðtLð Lð Lð Lð Lð LrM   