
    ki4d                        d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZmZ  e j        d          Z e j        d	          Z e j        d
          Z e j        d          Z e j        d          Z e j        d          Z e j        d          Z e
d          Zeee         eeef         f         Z G d d          Z G d de          ZdS )    N)OrderedDict)Any
CollectionListOptionalSequenceTypeVarUnion   )	Generator)OrderedDictType)choices_distributionchoices_distribution_unique#%z\$!@z\?z\^Tc                      e Zd ZU dZdZee         ed<   dZi ddddd	d
dddddddddddddddddddddddd d!dd"di d#d$d%d&d'd(d)dd*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d1d=d>d?d@dAdBi dCddDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdci dddedfd>dgdhdiddjddkd>dldmdnd5dodpdqddrddsdtdudvdwdxdydzd{d|d}d(i d~dddmddddddddddpddddddddddddddddddddi dd>ddddddddddadddddddddd5dddddddd1ddddi dddddddddddddddd5ddÓddœddǓddɓdd˓dd͓ddÓddddi dd(ddӓdddd1ddדddٓdd;ddܓddޓddddddddddddddddai ddדddÓddddddddddddddddddddddddd d;ddddi ddddddd	dǓd
dhdd-dddd[dddddddd1dddd7ddMddדddddddddWddMdmdddd Z	d!e
d"dfd#Zd"efd$Zd"efd%ZdSd)ed*ed+ed"efd,Zd"efd-Zd"efd.Zd"efd/Zd"eeef         fd0Zd"eeef         fd1ZdTd2ee         d3ed"efd4Zd"efd5ZdUd7ed"ee         fd8Zd"efd9Zd"efd:Z	 	 	 	 dVd<ee         d7ee         d=ed>ee         d"ee         f
d?Z	 	 dWd<ee         d7ee         d"ee         fd@Z dXd<ee         d"efdAZ!	 dWd<ee         d7ee         d"ee         fdBZ"	 	 	 	 	 dYdDedEedFed)ee         d*ee         d"efdGZ#dZdIed"efdJZ$dKe%j&        fdIedLed"efdMZ'dNe%j&        fdIedLed"efdOZ(d[dIedQed"efdRZ)dS (\  BaseProviderbaseN__lang__Faa)DJERETaf)ZAak)GHam)r   an)ESapn)INar)AEBHr   DZEGEHr   ILr%   IQJOKMKWLBLYMAMROMPSQASASDSOSSSYTDTNYEasastayc)PEaz)AZr%   be)BYbem)ZMber)r)   r3   bg)BGbhbbhobn)BDr%   bo)CNr%   br)FRbrxbs)BAbyn)r   ca)ADr#   rT   ITce)RUckb)r-   cmn)TWcrh)UAcs)CZcsb)PLcvcy)GBda)DKde)ATBECHDELILUdoidv)MVdz)BTel)GRCYen)AGAUrP   BWCArk   ri   HKIEr%   NGNZPHPKSGUSr   rI   ZWKEeo)r   es)ARBOCLCOCRCUDOECr#   GTHNMXNIPArC   PRPYSVr   UYVEet)EEeu)r#   rT   fa)IRff)SNfi)FIfil)r   fo)FOfr)r   ro   rT   rr   fur)r[   fy)NLrp   ga)r   gdgez)r   r   glgugvha)r   hakhe)r,   hihnehr)HRhsb)rp   ht)HThu)HUhy)AMiaid)IDigik)r   is)ISit)ro   r[   iuiwja)JPka)GEkk)KZkl)GLkm)KHknko)KRkokksku)TRkwky)KGlb)rr   lg)UGli)rn   r   lijln)CDlo)LAlt)LTlv)LVlzhmagmaimg)MGmhrmi)r   mk)MKmlmn)MNmnimrms)MYmt)MTmy)MMnannb)NOnds)rp   r   ne)NPnhn)r   niu)NUr   nl)AWrn   r   nnnrnsoocom)r   r   orospa)r%   r   pap)ANr  CWplps)AFpt)BRPTquzrajro)ROru)r]   rb   rw)RWsasatscsdseshssi)LKsidsk)SKsl)SIso)r   r   r   r:   sq)ALMLsr)MERSssstsv)r   SEsw)r   TZszlta)r%   r+  tcytetg)TJth)THthetitigtk)TMtltntr)rz   r   tsttug)rR   ukunmuruz)UZ)VN)rn   )ro   )r   )rR   r   r   r`   )veviwawaewalwoxhyiyoyuezhzu	generatorreturnc                     || _         dS )zc
        Base class for fake data providers
        :param generator: `Generator` instance
        N)rc  )selfrc  s     h/var/www/html/Pagina-Ingenieria-Requisitos/venv/lib/python3.11/site-packages/faker/providers/__init__.py__init__zBaseProvider.__init__  s    
 #    c                     |                                  }|dz   |                     t          j        |                   z   S )z<Generate a random underscored i18n locale code (e.g. en_US)._)language_coderandom_elementr   language_locale_codes)rf  rl  s     rg  localezBaseProvider.locale%  sH     **,,!!2=A 	
ri  c                 d    |                      t          j                                                  S )z/Generate a random i18n language code (e.g. en).)rm  r   rn  keysrf  s    rg  rl  zBaseProvider.language_code1  s'     ""<#E#J#J#L#LMMMri  r   '     minmaxstepc                 J    | j         j                            ||dz   |          S )aZ  Generate a random integer between two integers ``min`` and ``max`` inclusive
        while observing the provided ``step`` value.

        This method is functionally equivalent to randomly sampling an integer
        from the sequence ``range(min, max + 1, step)``.

        :sample: min=0, max=15
        :sample: min=0, max=15, step=3
        rt  )rc  random	randrange)rf  ru  rv  rw  s       rg  
random_intzBaseProvider.random_int6  s%     ~$..sC!GTBBBri  c                 B    | j         j                            dd          S )z!Generate a random digit (0 to 9).r   	   rc  ry  randintrr  s    rg  random_digitzBaseProvider.random_digitB       ~$,,Q222ri  c                 B    | j         j                            dd          S )z*Generate a random non-zero digit (1 to 9).rt  r}  r~  rr  s    rg  random_digit_not_nullz"BaseProvider.random_digit_not_nullG  r  ri  c                 B    | j         j                            dd          S )z1Generate a random digit above value two (2 to 9).r   r}  r~  rr  s    rg  random_digit_above_twoz#BaseProvider.random_digit_above_twoL  r  ri  c                     | j         j                            dd          r | j         j                            dd          S dS )zGenerate a random digit (0 to 9) or an empty string.

        This method will return an empty string 50% of the time,
        and each digit has a 1/20 chance of being generated.
        r   rt  r}   r~  rr  s    rg  random_digit_or_emptyz"BaseProvider.random_digit_or_emptyQ  A     > ((A.. 	>(00A6662ri  c                     | j         j                            dd          r | j         j                            dd          S dS )zGenerate a random non-zero digit (1 to 9) or an empty string.

        This method will return an empty string 50% of the time,
        and each digit has a 1/18 chance of being generated.
        r   rt  r}  r  r~  rr  s    rg  random_digit_not_null_or_emptyz+BaseProvider.random_digit_not_null_or_empty]  r  ri  digitsfix_lenc                 l   ||                                  }|dk     rt          d          |rW|dk    rB| j        j                            t          d|dz
            t          d|          dz
            S t          d          | j        j                            dt          d|          dz
            S )aX  Generate a random integer according to the following rules:

        - If ``digits`` is ``None`` (default), its value will be set to a random
          integer from 1 to 9.
        - If ``fix_len`` is ``False`` (default), all integers that do not exceed
          the number of ``digits`` can be generated.
        - If ``fix_len`` is ``True``, only integers with the exact number of
          ``digits`` can be generated.

        :sample: fix_len=False
        :sample: fix_len=True
        :sample: digits=3
        :sample: digits=3, fix_len=False
        :sample: digits=3, fix_len=True
        Nr   z7The digit parameter must be greater than or equal to 0.
   rt  z=A number of fixed length cannot have less than 1 digit in it.)r  
ValueErrorrc  ry  r  pow)rf  r  r  s      rg  random_numberzBaseProvider.random_numberi  s      >//11FA::VWWW 	Izz~,44SVaZ5H5H#bRX//\]J]^^^ !`aaa>(00CFOOa4GHHHri  c                 |    | j         j                            t          t          dt          j                            S )z-Generate a random ASCII letter (a-z and A-Z).letters)rc  ry  choicegetattrstringascii_lettersrr  s    rg  random_letterzBaseProvider.random_letter  s,     ~$++GFIvG[,\,\]]]ri     lengthc                 l    |                      t          t          dt          j                  |          S )zwGenerate a list of random ASCII letters (a-z and A-Z) of the specified ``length``.

        :sample: length=10
        r  r  )random_choicesr  r  r  )rf  r  s     rg  random_letterszBaseProvider.random_letters  s6    
 ""FIv';<< # 
 
 	
ri  c                 T    | j         j                            t          j                  S )z/Generate a random lowercase ASCII letter (a-z).)rc  ry  r  r  ascii_lowercaserr  s    rg  random_lowercase_letterz$BaseProvider.random_lowercase_letter        ~$++F,BCCCri  c                 T    | j         j                            t          j                  S )z/Generate a random uppercase ASCII letter (A-Z).)rc  ry  r  r  ascii_uppercaserr  s    rg  random_uppercase_letterz$BaseProvider.random_uppercase_letter  r  ri  abcelementsuniqueuse_weightingc                    ||n| j         }t          |t                    r$t          |t                    st	          d          |rt
          nt          }|-| j        j        	                    dt          |                    }|r"|t          |          k    rt	          d          t          |t                    rct          |d          s&t          |                                          |_        |j        }|r!t          |                                          nd}n&|r | j        j                            ||          S |}d} |t          |          || j        j        |          S )a	  Generate a list of randomly sampled objects from ``elements``.

        Set ``unique`` to ``False`` for random sampling with replacement, and set ``unique`` to
        ``True`` for random sampling without replacement.

        If ``length`` is set to ``None`` or is omitted, ``length`` will be set to a random
        integer from 1 to the size of ``elements``.

        The value of ``length`` cannot be greater than the number of objects
        in ``elements`` if ``unique`` is set to ``True``.

        The value of ``elements`` can be any sequence type (``list``, ``tuple``, ``set``,
        ``string``, etc) or an ``OrderedDict`` type. If it is the latter, the keys will be
        used as the objects for sampling, and the values will be used as weighted probabilities
        if ``unique`` is set to ``False``. For example:

        .. code-block:: python

            # Random sampling with replacement
            fake.random_elements(
                elements=OrderedDict([
                    ("variable_1", 0.5),        # Generates "variable_1" 50% of the time
                    ("variable_2", 0.2),        # Generates "variable_2" 20% of the time
                    ("variable_3", 0.2),        # Generates "variable_3" 20% of the time
                    ("variable_4": 0.1),        # Generates "variable_4" 10% of the time
                ]), unique=False
            )

            # Random sampling without replacement (defaults to uniform distribution)
            fake.random_elements(
                elements=OrderedDict([
                    ("variable_1", 0.5),
                    ("variable_2", 0.2),
                    ("variable_3", 0.2),
                    ("variable_4": 0.1),
                ]), unique=True
            )

        :sample: elements=('a', 'b', 'c', 'd'), unique=False
        :sample: elements=('a', 'b', 'c', 'd'), unique=True
        :sample: elements=('a', 'b', 'c', 'd'), length=10, unique=False
        :sample: elements=('a', 'b', 'c', 'd'), length=4, unique=True
        :sample: elements=OrderedDict([
                        ("a", 0.45),
                        ("b", 0.35),
                       ("c", 0.15),
                       ("d", 0.05),
                   ]), length=20, unique=False
        :sample: elements=OrderedDict([
                       ("a", 0.45),
                       ("b", 0.35),
                       ("c", 0.15),
                       ("d", 0.05),
                   ]), unique=True
        NzFUse OrderedDict only to avoid dependency on PYTHONHASHSEED (See #363).rt  zOSample length cannot be longer than the number of unique elements to pick from.
_key_cacher  )__use_weighting__
isinstancedictr   r  r   r   rc  ry  r  lenhasattrtuplerq  r  valuessample)rf  r  r  r  r  fnchoicesprobabilitiess           rg  random_elementszBaseProvider.random_elements  sm   | *7)BH^h%% 	gj;.O.O 	gefff,2L((8L>^*221c(mmDDF 	pfs8}},,noooh%% 	!8\22 =&+HMMOO&<&<#)G8EOE(//"3"34444MM F~,33HfEEEG Mr'NNN!	
 
 
 	
ri  c                 2    |                      ||d          S )a\  Generate a list of objects randomly sampled from ``elements`` with replacement.

        For information on the ``elements`` and ``length`` arguments, please refer to
        :meth:`random_elements() <faker.providers.BaseProvider.random_elements>` which
        is used under the hood with the ``unique`` argument explicitly set to ``False``.

        :sample: elements=('a', 'b', 'c', 'd')
        :sample: elements=('a', 'b', 'c', 'd'), length=10
        :sample: elements=OrderedDict([
                     ("a", 0.45),
                     ("b", 0.35),
                     ("c", 0.15),
                     ("d", 0.05),
                 ])
        :sample: elements=OrderedDict([
                     ("a", 0.45),
                     ("b", 0.35),
                     ("c", 0.15),
                     ("d", 0.05),
                 ]), length=20
        Fr  r  rf  r  r  s      rg  r  zBaseProvider.random_choices  s    4 ##HfU#CCCri  c                 <    |                      |d          d         S )aW  Generate a randomly sampled object from ``elements``.

        For information on the ``elements`` argument, please refer to
        :meth:`random_elements() <faker.providers.BaseProvider.random_elements>` which
        is used under the hood with the ``unique`` argument set to ``False`` and the
        ``length`` argument set to ``1``.

        :sample: elements=('a', 'b', 'c', 'd')
        :sample size=10: elements=OrderedDict([
                     ("a", 0.45),
                     ("b", 0.35),
                     ("c", 0.15),
                     ("d", 0.05),
                 ])
        rt  r  r   r  )rf  r  s     rg  rm  zBaseProvider.random_element  s"    " ##HQ#77::ri  c                 2    |                      ||d          S )a  Generate a list of objects randomly sampled from ``elements`` without replacement.

        For information on the ``elements`` and ``length`` arguments, please refer to
        :meth:`random_elements() <faker.providers.BaseProvider.random_elements>` which
        is used under the hood with the ``unique`` argument explicitly set to ``True``.

        :sample: elements=('a', 'b', 'c', 'd', 'e', 'f')
        :sample: elements=('a', 'b', 'c', 'd', 'e', 'f'), length=3
        Tr  r  r  s      rg  random_samplezBaseProvider.random_sample,  s     ##HfT#BBBri  r  numberlegec                     |r|r|S |rdnd}|rdnd}t          || j        j                            ||          z  dz            }|||k     r|}|||k    r|}|S )a1  Generate a random integer near ``number`` according to the following rules:

        - If ``le`` is ``False`` (default), allow generation up to 140% of ``number``.
          If ``True``, upper bound generation is capped at 100%.
        - If ``ge`` is ``False`` (default), allow generation down to 60% of ``number``.
          If ``True``, lower bound generation is capped at 100%.
        - If a numerical value for ``min`` is provided, generated values less than ``min``
          will be clamped at ``min``.
        - If a numerical value for ``max`` is provided, generated values greater than
          ``max`` will be clamped at ``max``.
        - If both ``le`` and ``ge`` are ``True``, the value of ``number`` will automatically
          be returned, regardless of the values supplied for ``min`` and ``max``.

        :sample: number=100
        :sample: number=100, ge=True
        :sample: number=100, ge=True, min=120
        :sample: number=100, le=True
        :sample: number=100, le=True, max=80
        :sample: number=79, le=True, ge=True, min=80
        d   <      )intrc  ry  r  )	rf  r  r  r  ru  rv  _min_maxr  s	            rg  randomize_nb_elementsz"BaseProvider.randomize_nb_elements:  s    8  	" 	M ssb!ssc$./77dCCCcIJJ?rCxxB?rCxxB	ri  ###textc                 4    t                                fd|          }t                               fd|          }t                               fd|          }t                               fd|          }t
                               fd|          }|S )aJ  Generate a string with each placeholder in ``text`` replaced according
        to the following rules:

        - Number signs ('#') are replaced with a random digit (0 to 9).
        - Percent signs ('%') are replaced with a random non-zero digit (1 to 9).
        - Dollar signs ('$') are replaced with a random digit above two (2 to 9).
        - Exclamation marks ('!') are replaced with a random digit or an empty string.
        - At symbols ('@') are replaced with a random non-zero digit or an empty string.

        Under the hood, this method uses :meth:`random_digit() <faker.providers.BaseProvider.random_digit>`,
        :meth:`random_digit_not_null() <faker.providers.BaseProvider.random_digit_not_null>`,
        :meth:`random_digit_or_empty() <faker.providers.BaseProvider.random_digit_or_empty>`,
        and :meth:`random_digit_not_null_or_empty() <faker.providers.BaseProvider.random_digit_not_null_or_empty>`
        to generate the random values.

        :sample: text='Intel Core i%-%%##K vs AMD Ryzen % %%##X'
        :sample: text='!!! !!@ !@! !@@ @!! @!@ @@! @@@'
        c                 F    t                                                    S N)strr  xrf  s    rg  <lambda>z'BaseProvider.numerify.<locals>.<lambda>t  s    c$*;*;*=*=&>&> ri  c                 F    t                                                    S r  )r  r  r  s    rg  r  z'BaseProvider.numerify.<locals>.<lambda>u      c$*D*D*F*F&G&G ri  c                 F    t                                                    S r  )r  r  r  s    rg  r  z'BaseProvider.numerify.<locals>.<lambda>v  s    S)D)D)F)F%G%G ri  c                 F    t                                                    S r  )r  r  r  s    rg  r  z'BaseProvider.numerify.<locals>.<lambda>w  r  ri  c                 F    t                                                    S r  )r  r  r  s    rg  r  z'BaseProvider.numerify.<locals>.<lambda>x  s    C(K(K(M(M$N$N ri  )_re_hashsub_re_perc_re_dol_re_excl_re_at)rf  r  s   ` rg  numerifyzBaseProvider.numerifya  s    & ||>>>>EE||GGGGNN{{GGGGNN||GGGGNNzzNNNNPTUUri  z????r  c                 D     t                                fd|          S )aS  Generate a string with each question mark ('?') in ``text``
        replaced with a random character from ``letters``.

        By default, ``letters`` contains all ASCII letters, uppercase and lowercase.

        :sample: text='Random Identifier: ??????????'
        :sample: text='Random Identifier: ??????????', letters='ABCDE'
        c                 .                                   S r  rm  r  r  rf  s    rg  r  z%BaseProvider.lexify.<locals>.<lambda>  s    D$7$7$@$@ ri  )_re_qmr  rf  r  r  s   ` `rg  lexifyzBaseProvider.lexify{  s'     zz@@@@@$GGGri  z## ??c                 V    |                      |                     |          |          S )au  Generate a string with each placeholder in ``text`` replaced according to the following rules:

        - Number signs ('#') are replaced with a random digit (0 to 9).
        - Percent signs ('%') are replaced with a random non-zero digit (1 to 9).
        - Dollar signs ('$') are replaced with a random digit above two (2 to 9).
        - Exclamation marks ('!') are replaced with a random digit or an empty string.
        - At symbols ('@') are replaced with a random non-zero digit or an empty string.
        - Question marks ('?') are replaced with a random character from ``letters``.

        By default, ``letters`` contains all ASCII letters, uppercase and lowercase.

        Under the hood, this method uses :meth:`numerify() <faker.providers.BaseProvider.numerify>` and
        and :meth:`lexify() <faker.providers.BaseProvider.lexify>` to generate random values for number
        signs and question marks respectively.

        :sample: letters='ABCDE'
        :sample: text='Product Number: ????-########'
        :sample: text='Product Number: ????-########', letters='ABCDE'
        :sample: text='Order: ##??-$'
        )r  )r  r  r  s      rg  bothifyzBaseProvider.bothify  s&    * {{4==..{@@@ri  ^^^^upperc                      t           j        dd         |r                                t                               fd|          S )a  Generate a string with each circumflex ('^') in ``text``
        replaced with a random hexadecimal character.

        By default, ``upper`` is set to False. If set to ``True``, output
        will be formatted using uppercase hexadecimal characters.

        :sample: text='MAC Address: ^^:^^:^^:^^:^^:^^'
        :sample: text='MAC Address: ^^:^^:^^:^^:^^:^^', upper=True
        Nic                 .                                   S r  r  r  s    rg  r  z%BaseProvider.hexify.<locals>.<lambda>  s    T%8%8%A%A ri  )r  	hexdigitsr  _re_cirr  )rf  r  r  r  s   `  @rg  hexifyzBaseProvider.hexify  sM     "3B3' 	&mmooG{{AAAAA4HHHri  )r   rs  rt  )NF)r  )r  NFN)r  N)r  )r  FFNN)r  )r  F)*__name__
__module____qualname____provider__r   r   r  __annotations__r  rn  r   rh  ro  rl  r  r{  r  r  r  r
   r  r  boolr  r  r   r  r  r  ElementsTyper   r  r  rm  r  r  r  r  r  r  r  r   ri  rg  r   r      sY        L"Hhsm""" g 	g 	g	
 	g 	w 	 
J 	gKL 	wMN 	wOP 	lQR 	gST 	wUV 	|WX 	gYZ 	w[\ 	w] ^ 	l_` 	lab 	gcd 	wef 	ggh 	wij 	&kl 	gmn 	wop 	wqr 	wst 	guv 	wwx 	gyz 	g{| 	g}~ 	2  @ 	wAB 	gCD 	gEF 	lGH 	 
It 	guv 	 
wd 	gef 	lgh 	gij 	gkl 	gmn 	wop 	gqr 	&st 	wuv 	lw  x 	gyz 	g{| 	|}~ 	g@ 	gAB 	gCD 	gEF 	wGH 	gIJ 	gKL 	wMN 	gOP 	wQR 	gST 	gUV 	gWX 	gY  Z 	g[\ 	g]^ 	g_` 	gab 	lcd 	gef 	ggh 	gij 	gkl 	gmn 	gop 	gqr 	gst 	guv 	wwx 	gyz 	g{  | 	g}~ 	g@ 	gAB 	gCD 	lEF 	wGH 	gIJ 	gKL 	gMN 	gOP 	wQR 	wST 	wUV 	gWX 	wYZ 	g[\ 	g]  ^ 	g_` 	gab 	wcd 	gef 	ggh 	gij 	gkl 	wmn 	gop 	|qr 	gst 	wuv 	|wx 	 yz 	g{| 	g}~ 	w  @ 	gAB 	lCD 	gEF 	gGH 	lIJ 	!KL 	gMN 	gOP 	lQR 	wST 	wUV 	gWX 	lYZ 	g[\ 	g]^ 	w_` 	ga  b 	lcd 	gef 	wgh 	gij 	wkl 	gmn 	gop 	&qr 	lst 	luv 	gwx 	gyz 	l{| 	l}~ 	w@ 	lAB 	wC  D 	gEF 	gGH 	gIJ 	wKL 	lMN 	wOP 	gQR 	gST 	gUV 	lWX 	gYZ 	g[\ 	g]^ 	g_` 	wab 	lcd 	ge f &}  B## #$ # # # #

 

 

 

 

Ns N N N N

C 
Cc 
CC 
Cc 
C# 
C 
C 
C 
C3c 3 3 3 3
3s 3 3 3 3
3 3 3 3 3

uS#X 
 
 
 

c3h 
 
 
 
I IHSM I4 ITW I I I I8^s ^ ^ ^ ^

 
S 
(3- 
 
 
 
D D D D D
D D D D D %4 $(,]
 ]
q/]
 ]
 	]

  ~]
 
!]
 ]
 ]
 ]
B %4 $D Dq/D D 
!	D D D D8; ;|A ;Q ; ; ; ;( TXC C$QCCKC=C	!C C C C  !!% %% % 	%
 c]% c]% 
% % % %N S S    4 "(8L 	H 	H3 	H# 	HQT 	H 	H 	H 	H #*&:N A AC AC ASV A A A A.I I3 I I I I I I I Iri  r   c                   l     e Zd Z	 	 ddedee         dee         f fdZdeddfdZdd
e	defdZ
 xZS )DynamicProviderNprovider_namer  rc  c                    |st                      }t                                          |           |                    d          rt	          d          || _        g | _        |r|| _        t          | || j                   dS )a  
        A faker Provider capable of getting a list of elements to randomly select from,
        instead of using the predefined list of elements which exist in the default providers in faker.

        :param provider_name: Name of provider, which would translate into the function name e.g. faker.my_fun().
        :param elements: List of values to randomly select from
        :param generator: Generator object. If missing, the default Generator is used.

        :example:
        >>>from faker import Faker
        >>>from faker.providers import DynamicProvider

        >>>medical_professions_provider = DynamicProvider(
        >>>     provider_name="medical_profession",
        >>>     elements=["dr.", "doctor", "nurse", "surgeon", "clerk"],
        >>>)
        >>>fake = Faker()
        >>>fake.add_provider(medical_professions_provider)

        >>>fake.medical_profession()
        "dr."

        __zBProvider name cannot start with __ as it would be ignored by FakerN)	r   superrh  
startswithr  r  r  setattrget_random_value)rf  r  r  rc  	__class__s       rg  rh  zDynamicProvider.__init__  s    <  	$!I#####D)) 	cabbb* 	%$DMmT%:;;;;;ri  elementrd  c                 :    | j                             |           dS )zAdd new element.N)r  append)rf  r  s     rg  add_elementzDynamicProvider.add_element  s    W%%%%%ri  Tr  c                     | j         rt          | j                   dk    rt          d          |                     | j         d|          d         S )zReturns a random value for this provider.

        :param use_weighting: boolean option to use weighting. Defaults to True
        r   z=Elements should be a list of values the provider samples fromrt  )r  r  )r  r  r  r  )rf  r  s     rg  r  z DynamicProvider.get_random_value  sU    
 } 	^DM 2 2a 7 7\]]]##DM!=#YYZ[\\ri  )NN)T)r  r  r  r  r   r   r   rh  r  r  r  __classcell__)r  s   @rg  r  r    s         $(#'	*< *<*< 4.*< C=	*< *< *< *< *< *<X&3 &4 & & & &] ]d ]c ] ] ] ] ] ] ] ]ri  r  )rer  collectionsr   typingr   r   r   r   r   r	   r
   rc  r   r   utils.distributionr   r   compiler  r  r  r  r  r  r  r   floatr  r   r  r  ri  rg  <module>r     s   				  # # # # # # L L L L L L L L L L L L L L L L L L ! ! ! ! ! ! $ $ $ $ $ $ R R R R R R R R2:d2:d
"*U

2:d	D			E		
"*U

GCLLZ]OAuH$==>S
I S
I S
I S
I S
I S
I S
I S
Il9] 9] 9] 9] 9]l 9] 9] 9] 9] 9]ri  