1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
U
¬ý°dÝtã@sêddlmZddlZddlmZmZddlZddlZddl    m
m Z ddl mZddlmZddlmZddlmZddlmZdd    lmZmZmZmZmZdd
lmZdd lm Z ddl!m"m#Z$dd l%m&Z&dd l'm(Z(ddl)m*Z*ddl+m,Z,m-Z-ddl.m/Z/ddl0m1Z1m2Z2m3Z3m4Z4m5Z5erBddl6m7Z7ddl8m9Z9Gdd„dƒZ:d8dd„Z;d9ddœdd„Z<d:ddœdd„Z=ddd œd!d"„Z>d;dd%d&œd'd(„Z?d<d%d)œd*d+„Z@d,d,d-œd.d/„ZAd=dd0d%dd1œd2d3„ZBd4d0d0d4d5œd6d7„ZCdS)>é)Ú annotationsN)Ú TYPE_CHECKINGÚcast)Únpt)ÚPerformanceWarning)Úcache_readonly)Úfind_stack_level)Ú maybe_promote)Úensure_platform_intÚis_1d_only_ea_dtypeÚis_extension_array_dtypeÚ
is_integerÚneeds_i8_conversion)ÚExtensionDtype)Únotna)Úfactorize_from_iterable)Úensure_wrapped_if_datetimelike)Ú    DataFrame)ÚIndexÚ
MultiIndex)ÚSeries)Úcompress_group_indexÚdecons_obs_group_idsÚget_compressed_idsÚget_group_indexÚget_group_index_sorter)ÚExtensionArray)Ú
FrozenListc@sÌeZdZdZd)dddœdd„Zed    d
œd d „ƒZed d
œdd„ƒZdddœdd„Zdd„Z    edd
œdd„ƒZ
edd
œdd„ƒZ dd
œdd„Z d*dd „Z d!d"œd#d$„Zedd
œd%d&„ƒZedd
œd'd(„ƒZdS)+Ú
_Unstackera    
    Helper class to unstack data / pivot with multi-level index
 
    Parameters
    ----------
    index : MultiIndex
    level : int or str, default last level
        Level to "unstack". Accepts a name for the level.
    fill_value : scalar, optional
        Default value to fill in missing values if subgroups do not have the
        same set of labels. By default, missing values will be replaced with
        the default fill value for that data type, NaN for float, NaT for
        datetimelike, etc. For integer types, by default data will converted to
        float and missing values will be set to NaN.
    constructor : object
        Pandas ``DataFrame`` or subclass used to create unstacked
        response.  If None, DataFrame will be used.
 
    Examples
    --------
    >>> index = pd.MultiIndex.from_tuples([('one', 'a'), ('one', 'b'),
    ...                                    ('two', 'a'), ('two', 'b')])
    >>> s = pd.Series(np.arange(1, 5, dtype=np.int64), index=index)
    >>> s
    one  a    1
         b    2
    two  a    3
         b    4
    dtype: int64
 
    >>> s.unstack(level=-1)
         a  b
    one  1  2
    two  3  4
 
    >>> s.unstack(level=0)
       one  two
    a    1    3
    b    2    4
 
    Returns
    -------
    unstacked : DataFrame
    éÿÿÿÿNrÚNone)ÚindexÚreturncCsî|dkr t}||_| ¡|_|j |¡|_d|jj|jkr@dnd|_t|jj    ƒ|_
t|jj ƒ|_ |j   |j¡|_|j
  |j¡|_|j    |j|_t dd„|j
Dƒ¡}|jj}||}|t tj¡jkrâtjd|›dttƒd| ¡dS)    NrércSsg|]
}|j‘qS©)Úsize)Ú.0Z index_levelr$r$úRd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\pandas/core/reshape/reshape.pyÚ
<listcomp>ysz'_Unstacker.__init__.<locals>.<listcomp>z%The following operation may generate z& cells in the resulting pandas object.)Ú
stacklevel)rÚ constructorZremove_unused_levelsr!Ú_get_level_numberÚlevelÚcodesÚliftÚlistÚlevelsÚnew_index_levelsÚnamesÚnew_index_namesÚpopÚ removed_nameÚ removed_levelÚremoved_level_fullÚnpÚmaxr%ZiinfoÚint32ÚwarningsÚwarnrrÚ_make_selectors)Úselfr!r,r*Znum_rowsZ num_columnsZ    num_cellsr$r$r'Ú__init__as*
 
üz_Unstacker.__init__z-tuple[npt.NDArray[np.intp], list[np.ndarray]])r"c
Cs |j}t|jjƒ}t|jjƒ}|d|…||dd…||g}tdd„|d|…||dd…||gDƒƒ}t||ƒ\}}t|ƒ}t||ƒ}    |    |fS)Nr#css|]}t|ƒVqdS©N©Úlen©r&Úxr$r$r'Ú    <genexpr>–sz2_Unstacker._indexer_and_to_sort.<locals>.<genexpr>)    r,r/r!r-r0ÚtuplerrBr)
r>Úvr-ÚlevsÚto_sortÚsizesÚ
comp_indexÚobs_idsÚngroupsÚindexerr$r$r'Ú_indexer_and_to_sortŠs  &4
z_Unstacker._indexer_and_to_sortzlist[np.ndarray]cs|j\‰}‡fdd„|DƒS)Ncsg|]}| ˆ¡‘qSr$©Útake)r&Úline©rNr$r'r(¡sz,_Unstacker.sorted_labels.<locals>.<listcomp>)rO)r>rIr$rSr'Ú sorted_labelsžs
z_Unstacker.sorted_labelsz
np.ndarray)Úvaluesr"cCs|j\}}tj||dd}|S)Nr)Úaxis)rOÚalgosZtake_nd)r>rUrNÚ_Ú sorted_valuesr$r$r'Ú_make_sorted_values£s
z_Unstacker._make_sorted_valuesc
CsØ|j}|jdd…}tdd„|Dƒƒ}t||ƒ\}}t|ƒ}t|ƒ}|jj|j|j    }||f|_
|jd|||j    }t j t   |j
¡td}    |     |d¡|     ¡t|jƒkr¶tdƒ‚||_|    |_| t  |¡¡|_dS)Nrcss|]}t|ƒVqdSr@rArCr$r$r'rE®sz-_Unstacker._make_selectors.<locals>.<genexpr>©ÚdtypeTz0Index contains duplicate entries, cannot reshape)r1rTrFrrBr
r!Zlevshaper,r.Ú
full_shaper8ÚzerosÚprodÚboolÚputÚsumÚ
ValueErrorÚ group_indexÚmaskZ searchsortedÚarangeÚ
compressor)
r>Ú
new_levelsZremaining_labelsZ level_sizesrKrLrMÚstrideÚselectorrer$r$r'r=©s 
 z_Unstacker._make_selectorsr`cCst|j ¡ƒSr@)r`reÚall©r>r$r$r'Úmask_allÂsz_Unstacker.mask_allz2tuple[npt.NDArray[np.intp], npt.NDArray[np.bool_]]cCs6tjt|jƒtjd}|j|dd\}}|| d¡fS)Nr[r©Ú
fill_valuer)r8rfrBr!ZintpÚget_new_valuesÚany)r>Z    dummy_arrÚ
new_valuesrer$r$r'Ú arange_resultÆsz_Unstacker.arange_resultrcCsn|jdkr|dd…tjf}|dkr:|jddkr:tdƒ‚| ||¡\}}| |¡}|j}|j||||j    dS)Nr#z-must pass column labels for multi-column data)r!Úcolumnsr\)
Úndimr8ÚnewaxisÚshapercrpÚget_new_columnsÚ    new_indexr*r\)r>rUÚ value_columnsrorXrtr!r$r$r'Ú
get_resultÎs
 
ÿz_Unstacker.get_resultc Cs |jdkr|dd…tjf}| |¡}|j\}}|jd}||}||f}|j}    |j}
|
r”t|ƒr”|     |||¡ 
dd¡     |¡} tj |t d} | | fS|j } |
r´|j } tj|| d} nTt| tƒrâ|  ¡}|j|| d} || dd…<n&t| |ƒ\} }tj|| d} |  |¡| j}tj|t d} t|j ƒr>| d¡}|  d¡} n|j|dd}t ||     d¡|||| |  d¡¡t|j ƒr˜|  d¡} t| ƒ} |  |j ¡} | | fS)    Nr#ér[Úi8F)ÚcopyÚu1zM8[ns])rur8rvrZr]rwrermrBÚreshapeZswapaxesZonesr`r\ÚemptyÚ
isinstancerÚconstruct_array_typeÚ_emptyr    ÚfillÚnamer^rÚviewZastypeÚ
libreshapeÚunstackr)r>rUrorYÚlengthÚwidthriZ result_widthZ result_shaperermrrZnew_maskr\Úclsr†r$r$r'rpÝsd
 
 
 
 ÿþÿ
 
 
 ù 
 z_Unstacker.get_new_valuesz Index | None)rzc    sì|dkrB|jdkr"|jj|jdS|jjd|jjd}| |j¡St|jƒ|j}t|ƒ}t     t 
|¡|¡‰t |t ƒr¨|j |jf}|j|jf}‡fdd„|jDƒ}n||jg}|j|jg}ˆg}|j}| t ||¡¡t |||ddS)Nr©r†)Úitemcsg|]}| ˆ¡‘qSr$rP©r&Zlab©Z
propagatorr$r'r(Asz._Unstacker.get_new_columns.<locals>.<listcomp>F©r0r-r2Zverify_integrity)r.r6Ú_renamer5ÚinsertÚ    _na_valueÚrenamerBr8Úrepeatrfr‚rr0r7r2r-r†Ú    _repeaterÚappendÚtile)    r>rzÚlevrir‹rhÚ    new_namesÚ    new_codesÚrepeaterr$rr'rx,s6
 
ÿþ ÿz_Unstacker.get_new_columnscCs\t|jƒt|jƒkr8|j |j¡}|jrXt |dd¡}n t|jƒ|j}t |¡|j}|S)Nrr)rBr7r6Z get_indexerr.r8r“rf)r>rrir$r$r'r—Rsz_Unstacker._repeatercs†‡fdd„ˆjdd…Dƒ}tˆjƒdkrrˆjd|d}}|dk ¡r\| t|ƒ|j¡}| |¡ ˆjd¡St    ˆj|ˆjddS)Ncsg|]}| ˆj¡‘qSr$)rQrgrrlr$r'r(dsz(_Unstacker.new_index.<locals>.<listcomp>rr#rFr‘)
rTrBr1rqr“r”rQr•r3r)r>Z result_codesr,Ú level_codesr$rlr'ryas üz_Unstacker.new_index)rN)N)Ú__name__Ú
__module__Ú __qualname__Ú__doc__r?rrOrTrZr=rmrsr{rprxr—ryr$r$r$r'r3s&-)
O&rcsztˆƒdkr|S|j‰ˆˆjkr&ˆg‰‡fdd„ˆDƒ‰‡fdd„tˆjƒDƒ}‡fdd„ˆDƒ}‡fdd„ˆDƒ}‡fdd„ˆDƒ}‡fdd„|Dƒ}‡fd    d„|Dƒ}‡fd
d„|Dƒ}    td d „|Dƒƒ}
t||
d d d} t| d d\} } t| | |
|d d}|st    | dd}n"t
|| g|| g|    dgd d}t |t ƒrl|  ¡}||_|jd|d}|}|}|}nàt |jt
ƒr¶|}ˆr²ˆ d¡‰|jˆ|d}‡fdd„ˆDƒ‰q~|S|j d d}||_|jd|d}t |t ƒrê|j}n|j}t |t
ƒst‚|jdg|}|jjg|}|jdg}|D]}| | |jd¡¡q.t
|||d d}t |t ƒrp||_n||_|S)Nrcsg|]}ˆ |¡‘qSr$)r+©r&Úi©r!r$r'r(sz%_unstack_multiple.<locals>.<listcomp>csg|]}|ˆkr|‘qSr$r$r£)Úclocsr$r'r(ƒscsg|]}ˆj|‘qSr$©r0r£r¥r$r'r(…scsg|]}ˆj|‘qSr$©r-r£r¥r$r'r(†scsg|]}ˆj|‘qSr$©r2r£r¥r$r'r(‡scsg|]}ˆj|‘qSr$r§r£r¥r$r'r(ˆscsg|]}ˆj|‘qSr$r¨r£r¥r$r'r(‰scsg|]}ˆj|‘qSr$r©r£r¥r$r'r(Šscss|]}t|ƒVqdSr@rArCr$r$r'rEŒsz$_unstack_multiple.<locals>.<genexpr>F)ÚsortÚxnull)rª)r«Ú__placeholder__rr‘rncs g|]}|ˆkr|n|d‘qS©r#r$©r&rG)Úvalr$r'r(«s©Údeepr)rBr!r2ÚrangeÚnlevelsrFrrrrrr‚rr~r‰rtr4ÚAssertionErrorr0r†r-r˜rQ)Údatar¦roZrlocsZclevelsZccodesZcnamesZrlevelsZrcodesZrnamesrwrdZcomp_idsrLZ recons_codesZ dummy_indexÚdummyZ    unstackedrhr›rœÚresultZunstcolsZrecÚ new_columnsr$)r¦r!r¯r'Ú_unstack_multipleusz 
ü 
   ÿ r¹zSeries | DataFrame)ÚobjcCsât|ttfƒr0t|ƒdkr(t|||dS|d}t|ƒsL|dksL|j |¡t|tƒr€t|jt    ƒrpt
|||dS|j j ddSn^t|jt    ƒs¤t dt|jƒ›dƒ‚n:t|jƒrºt|||ƒSt|j||jd    }|j|jd|d
SdS) Nr#rnrr¬F©Údropnaz'index must be a MultiIndex to unstack, z  was passed©r,r*©rzro)r‚rFr/rBr¹r r!r+rrÚ_unstack_frameÚTÚstackrcÚtyper r\Ú_unstack_extension_seriesrZ_constructor_expanddimr{Ú_values)rºr,roÚ    unstackerr$r$r'r‰Ìs4  
  ÿ
 ÿÿr‰rcCsZt|jtƒst‚t|j||jd}|jsB|jj||d}| |¡S|j    |j
|j |dSdS)Nr½rnr¾) r‚r!rr´rÚ _constructorZ_can_fast_transposeZ_mgrr‰r{rÄrt)rºr,rorÅZmgrr$r$r'r¿ðs
ÿr¿r)Úseriesr"cCs(| ¡}|j||d}|j d¡|_|S)a'
    Unstack an ExtensionArray-backed Series.
 
    The ExtensionDtype is preserved.
 
    Parameters
    ----------
    series : Series
        A Series with an ExtensionArray for values
    level : Any
        The level name or number.
    fill_value : Any
        The user-level (not physical storage) fill value to use for
        missing values introduced by the reshape. Passed to
        ``series.values.take``.
 
    Returns
    -------
    DataFrame
        Each column of the DataFrame will have the same dtype as
        the input Series.
    )r,ror)Zto_framer‰rtZ    droplevel)rÇr,roZdfr·r$r$r'rÃýsrÃrTr`)Úframer¼cs²dd„}|j\}‰|j |¡}t|jtƒr8t|||dSt|jtƒrÀt|jjƒ}‡fdd„|jj    Dƒ}||jƒ\}}    | 
|¡| 
t   |    |¡  ¡¡t|jjƒ}
|
 
|jj¡t|||
dd} nTtt||j|jfƒŽ\} \} }    |  ˆ¡t   |    |¡  ¡f}t| ||jj|jjgdd} |js||jr|t|jjƒ}|d}t|ƒrp| ¡}| d    d„| ¡Dƒ¡}t||ˆƒ}n
|j  ¡}n
|j  ¡}|r¤t|ƒ}||}| |} |j|| d
S) zÀ
    Convert DataFrame to Series with multi-level Index. Columns become the
    second level of the resulting hierarchical index
 
    Returns
    -------
    stacked : Series or DataFrame
    cSs,|jr|t t|ƒ¡fSt|ƒ\}}||fSr@)Z    is_uniquer8rfrBr)r!r-Ú
categoriesr$r$r'Ú    factorize(s zstack.<locals>.factorize)Ú    level_numr¼csg|]}| ˆ¡‘qSr$©r–r©ÚKr$r'r(7szstack.<locals>.<listcomp>Fr‘rcSsg|]\}}|j‘qSr$©rÄ)r&rXÚcolr$r$r'r(Usr¥)rwrtr+r‚rÚ_stack_multi_columnsr!r/r0r-r˜r8r™Úravelr2r†ÚzipÚmapr–rÚ_is_homogeneous_typeÚdtypesrÄr rƒÚ_concat_same_typeÚitemsÚ"_reorder_for_extension_array_stackrZ_constructor_sliced)rÈr,r¼rÊÚNrËrhrœZclevZclabr›ryr0Zilabr-rÖr\Úarrrrrer$rÍr'rÁsV
 
 
 ÿü 
ÿ 
rÁr»csšt‡fdd„|Dƒƒr4ˆ}|D]‰t|ˆ|d}qnbtdd„|DƒƒrŽˆ}‡fdd„|Dƒ}|r–| d¡‰t|ˆ|d}‡fdd„|Dƒ}q\ntd    ƒ‚|S)
Nc3s|]}|ˆjjkVqdSr@)rtr2©r&rš©rÈr$r'rEksz!stack_multiple.<locals>.<genexpr>r»css|]}t|tƒVqdSr@)r‚ÚintrÜr$r$r'rEqscsg|]}ˆj |¡‘qSr$)rtr+rÜrÝr$r'r(wsz"stack_multiple.<locals>.<listcomp>rcs g|]}|ˆkr|n|d‘qSr­r$r®©ršr$r'r(~szTlevel should contain all level names or all level numbers, not a mixture of the two.)rkrÁr4rc)rÈr,r¼r·r$)rÈršr'Ústack_multiplehs
ÿràr)rtr"cCsœt|jƒdkr&|jdj|jddSdd„t|jdd…|jdd…ƒDƒ}t|Ž}dd    „t |¡Dƒ}t|Ž}tj    d
d„t||jƒDƒ|jdd…d S) zBCreates a MultiIndex from the first N-1 levels of this MultiIndex.r|rrcs"g|]\‰}‡fdd„|Dƒ‘qS)cs g|]}|dkrˆ|nd‘qS)rNr$)r&Úcrßr$r'r(sz8_stack_multi_column_index.<locals>.<listcomp>.<listcomp>r$)r&r-r$rßr'r(Žsÿz-_stack_multi_column_index.<locals>.<listcomp>Nrcss|]\}}|VqdSr@r$)r&ÚkeyrXr$r$r'rE•sz,_stack_multi_column_index.<locals>.<genexpr>cSs*g|]"\}}d|kr"t||jdn|‘qS)Nr[)rr\)r&Znew_levršr$r$r'r(›sÿr©)
rBr0r’r2rÓr-Ú    itertoolsÚgroupbyrZ from_arrays)rtrHZtuplesZ unique_tuplesZnew_levsr$r$r'Ú_stack_multi_column_index‰sþ
ý úrårÞ)rÈrËr¼r"c#    svdddœdd„}|jdd}|j}t|tƒs0t‚||jdkr†|}t||jdƒD](}|||ƒ}||d|ƒ}    | ||    ¡}qR||_}| ¡s¬|d    |ƒ}
|j    |
dd
}|j}t
t|ƒ}t |ƒ} i} |j d } t t|jd ƒƒ}|  t| ƒd¡}t ||¡}t|ƒ‰g}| D]z}z|j |¡}Wn&tk
rF| |¡Yq
YnXt|tƒs^t|ƒ}n |j|j}|ˆkr°|jdd…|j|f}| |jjd ¡|_|j|d j}n¸|jr<t|jj d    ƒr<||j|jj d    }||j|}| !¡ "d d„| #¡Dƒ¡}|j$\}}t %||¡ &||¡j' (¡}| |¡}n,|j)rV||j|j}n|jdd…|f}|j*dkr|| (¡}|| |<q
t|ƒd    kr |  +|¡} t|ƒ}t|j,tƒræt-|j,j ƒ}t-|j,j.ƒ}‡fdd„|j,jDƒ}n*t/|j,ƒ\}} | g}| 0ˆ¡g}|j,j1g}| | ¡| t 2||¡¡| |jj.|¡t|||dd}!|j3| |!| d}"|rr|"j4d    dd}"|"S)NrÞr©rËrtcSs||jkr|j|S|S)zì
        Logic for converting the level number to something we can safely pass
        to swaplevel.
 
        If `level_num` matches a column name return the name from
        position `level_num`, otherwise return `level_num`.
        r©rær$r$r'Ú_convert_level_number§s
 
z3_stack_multi_columns.<locals>._convert_level_numberFr°r#r)r,rVr)rtcSsg|]\}}|j‘qSr$rÏ)r&rXrDr$r$r'r(õsz(_stack_multi_columns.<locals>.<listcomp>csg|]}| ˆ¡‘qSr$rÌr©Zlevsizer$r'r(sr‘)r!rtrk)rVÚhow)5r~rtr‚rr´r³r²Z    swaplevelZ _is_lexsortedZ
sort_indexrrår0ÚsortedÚsetr-r“rBr8rQZget_locÚKeyErrorr˜ÚsliceÚstopÚstartÚlocZreindexrUrÕr rÖZilocrƒr×rØrwrfr€rÀrÒZ_is_mixed_typeruÚ
differencer!r/r2rr–r†r™rÆr¼)#rÈrËr¼rçÚthisZmi_colsZ roll_columnsr¤Zlev1Zlev2Z level_to_sortr¸Znew_dataZ
level_valsržZlevel_vals_nanZlevel_vals_usedZ    drop_colsrârðZ    slice_lenÚchunkZ value_slicer\ZsubsetrÚrÎÚidxrhr›rœZ    old_codesZ
old_levelsryr·r$rèr'rѤsœ 
 
 
 
 
 
 
 
 
 
 
ÿÿ
 
 
 
ÿrÑr)rÛÚn_rowsÚ    n_columnsr"cCs&t ||¡ ||¡j ¡}| |¡S)aæ
    Re-orders the values when stacking multiple extension-arrays.
 
    The indirect stacking method used for EAs requires a followup
    take to get the order correct.
 
    Parameters
    ----------
    arr : ExtensionArray
    n_rows, n_columns : int
        The number of rows and columns in the original DataFrame.
 
    Returns
    -------
    taken : ExtensionArray
        The original `arr` with elements re-ordered appropriately
 
    Examples
    --------
    >>> arr = np.array(['a', 'b', 'c', 'd', 'e', 'f'])
    >>> _reorder_for_extension_array_stack(arr, 2, 3)
    array(['a', 'c', 'e', 'b', 'd', 'f'], dtype='<U1')
 
    >>> _reorder_for_extension_array_stack(arr, 3, 2)
    array(['a', 'd', 'b', 'e', 'c', 'f'], dtype='<U1')
    )r8rfr€rÀrÒrQ)rÛrõrörôr$r$r'rÙ's!rÙ)N)N)N)rT)T)rT)DÚ
__future__rrãÚtypingrrr;Únumpyr8Zpandas._libs.reshapeZ_libsr€rˆZpandas._typingrZ pandas.errorsrZpandas.util._decoratorsrZpandas.util._exceptionsrZpandas.core.dtypes.castr    Zpandas.core.dtypes.commonr
r r r rZpandas.core.dtypes.dtypesrZpandas.core.dtypes.missingrZpandas.core.algorithmsÚcoreZ
algorithmsrWZpandas.core.arrays.categoricalrZpandas.core.constructionrZpandas.core.framerZpandas.core.indexes.apirrZpandas.core.seriesrZpandas.core.sortingrrrrrZpandas.core.arraysrZpandas.core.indexes.frozenrrr¹r‰r¿rÃrÁràrårÑrÙr$r$r$r'Ú<module>sL              D
W$ !J!ÿ