
    Vh-                       d dl mZ d dlZd dlmZ d dlmZmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmc mc mZ d dlmZ ddddZ G d dej<                        ZddZ d Z!d Z"d Z# G d de      Z$y)    )annotationsN)Mapping)islicechain)GeneratorType)is_sequence)to_text)string_types)AnsibleVaultEncryptedUnicode)NativeJinjaText)wrap_var)StrictUndefinedTF)truefalsenullc                      e Zd Zd Zy)Json2Pythonc                x    |j                   t        vr|S t        j                  t        |j                            S )N)value)id	_JSON_MAPastConstant)selfnodes     O/home/dcms/DCMS/lib/python3.12/site-packages/ansible/template/native_helpers.py
visit_NamezJson2Python.visit_Name   s+    77)#K||)DGG"455    N)__name__
__module____qualname__r    r   r   r   r      s    6r   r   c                   | g}t               }	 |s	 y|j                  d      }t        |      }||v r&|j                  |       t	        |t
              rHt	        |t              r?|j                  |j                                |j                  |j                                n+t        |      r|j                  |       nt        |dd      ry)z
    Our helper function, which will also recursively check dict and
    list entries due to the fact that they may be repr'd and contain
    a key or value which contains jinja2 syntax and would otherwise
    lose the AnsibleUnsafe value.
    Tr   
__UNSAFE__F)setpopr   add
isinstanceAnsibleUndefinedr   extendkeysvaluesr   getattr)r   to_checkseenvalval_ids        r   
_is_unsafer2   %   s     wH5D
& # ll1oCT>c+,c7#OOCHHJ'OOCJJL)OOC S,.' r   c           
        t        t        | d            }|syd}t        |      dk(  r.|d   }t        |t              r|S t        |      }t        |      }n_t        | t              rt        ||       } g }| D ]+  }|st        |      rd}|j                  t        |             - dj                  |      }|j                  d      s|dv rU	 t        j                  t        j                  t               j!                  t        j"                  |d	
                        }|rt-        |      }|S # t$        t&        t(        t*        f$ r Y *w xY w)an  Return a string of concatenated compiled nodes. Throw an undefined error
    if any of the nodes is undefined.

    If the result of concat appears to be a dictionary, list or bool,
    try and convert it to such using literal_eval, the same mechanism as used
    in jinja2_native.

    Used in Templar.template() when jinja2_native=False and convert_data=True.
        F   r   T){[)TrueFalseevalmode)listr   lenr(   r   r2   r	   r   r   appendjoin
startswithr   literal_evalfix_missing_locationsr   visitparse	TypeError
ValueErrorSyntaxErrorMemoryErrorr   )nodesheadunsafeout
out_valuesvs         r   ansible_eval_concatrQ   G   s6    ua !DF
4yA~1gc?+JCcle]+$&E
 	*Ajmgaj)		* ggj! ~~j!S,=%=		""))M''		#F3C smJ :{K@ 		s   AD/ /E
Ec                    d}g }| D ]+  }|st        |      rd}|j                  t        |             - dj                  |      }|rt	        |      }|S )a  Return a string of concatenated compiled nodes. Throw an undefined error
    if any of the nodes is undefined. Other than that it is equivalent to
    Jinja2's default concat function.

    Used in Templar.template() when jinja2_native=False and convert_data=False.
    FTr5   )r2   r@   r	   rA   r   )rK   rM   r,   rP   rN   s        r   ansible_concatrS      s[     FF "*Q-Fgaj!	" ''&/CsmJr   c                   t        t        | d            }|syd}t        |      dk(  rQ|d   }t        |t              r|j
                  S t        |t              r|S t        |t              s|S t        |      }n_t        | t              rt        ||       } g }| D ]+  }|st        |      rd}|j                  t        |             - dj                  |      }	 t        j                  t        j                   |d	            }t        |t              r|d   }| | | }|rt+        |      }|S # t"        t$        t&        t(        f$ r |rt+        |      }|cY S w xY w)
a  Return a native Python type from the list of compiled nodes. If the
    result is a single node, its value is returned. Otherwise, the nodes are
    concatenated as strings. If the result can be parsed with
    :func:`ast.literal_eval`, the parsed value is returned. Otherwise, the
    string is returned.

    https://github.com/pallets/jinja/blob/master/src/jinja2/nativetypes.py
    r4   NFr6   r   Tr5   r;   r<   )r>   r   r?   r(   r   datar   r
   r2   r   r   r@   r	   rA   r   rC   rF   rG   rH   rI   rJ   r   )rK   rL   rM   rN   rO   rP   evaledquotes           r   ansible_native_concatrX      sZ    ua !DF
4yA~1g c7888Oc?+ J #|,JC e]+$&E
 	*Ajmgaj)		* ggj!!! IIc'	
 &,'A76(5'*&!M z;< 3-C
	s   *D0 0(EEc                  (    e Zd ZdZd Zd Zd Zd Zy)r)   z}
    A custom Undefined class, which returns further Undefined objects on access,
    rather than throwing an exception.
    c                &    |dk(  rt        |      | S )Nr$   )AttributeError)r   names     r   __getattr__zAnsibleUndefined.__getattr__   s    < !&&r   c                    | S Nr"   )r   keys     r   __getitem__zAnsibleUndefined.__getitem__       r   c                d    dj                  | j                  | j                  | j                        S )Nz3AnsibleUndefined(hint={0!r}, obj={1!r}, name={2!r}))format_undefined_hint_undefined_obj_undefined_name)r   s    r   __repr__zAnsibleUndefined.__repr__   s0    DKK    
 	
r   c                    | S r_   r"   )r   items     r   __contains__zAnsibleUndefined.__contains__   rb   r   N)r   r    r!   __doc__r]   ra   rh   rk   r"   r   r   r)   r)      s    
r   r)   )r   zt.Anyreturnbool)%
__future__r   r   collections.abcr   	itertoolsr   r   typesr   'ansible.module_utils.common.collectionsr   +ansible.module_utils.common.text.convertersr	   ansible.module_utils.sixr
   ansible.parsing.yaml.objectsr   ansible.utils.native_jinjar   ansible.utils.unsafe_proxyr   "ansible.module_utils.compat.typingmodule_utilscompattypingtjinja2.runtimer   r   NodeTransformerr   r2   rQ   rS   rX   r)   r"   r   r   <module>r      s{    #  # #  ? ? 1 E 6 / . . * 	6#%% 6D6r,HV r   