
    <e                        d dl Z d dlZd dlZd dlZd dlmZ d dlmZ dZdZ	dZ
dZdZe j                            d	d
          Ze j                            ed          Ze j                            ed          Ze j                            ed          Ze j                            ed          Ze j                            ed          Z G d dej                  ZdZ G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d d e          Z G d! d"ej                  Z  G d# d$e          Z! G d% d&ej                  Z"e#d'k    r ej$                     	 	 	 dS )(    N)support)	os_helpers=  3hIElQAAAAAJAAAAHAAAAGQAAAAAAAAArAAAAAAAAACsAAAAFQAAAK0AAAAjAAAAwwAAAKEAAADn
AAAAMAAAAIkBAAAHAAAAugEAABYAAADCAQAAHAAAANkBAAALAAAA9gEAAEIBAAACAgAAFgAAAEUD
AAAeAAAAXAMAAKEAAAB7AwAAMgAAAB0EAAAFAAAAUAQAABsAAABWBAAAIQAAAHIEAAAJAAAAlAQA
AABSYXltb25kIEx1eHVyeSBZYWNoLXQAVGhlcmUgaXMgJXMgZmlsZQBUaGVyZSBhcmUgJXMgZmls
ZXMAVGhpcyBtb2R1bGUgcHJvdmlkZXMgaW50ZXJuYXRpb25hbGl6YXRpb24gYW5kIGxvY2FsaXph
dGlvbgpzdXBwb3J0IGZvciB5b3VyIFB5dGhvbiBwcm9ncmFtcyBieSBwcm92aWRpbmcgYW4gaW50
ZXJmYWNlIHRvIHRoZSBHTlUKZ2V0dGV4dCBtZXNzYWdlIGNhdGFsb2cgbGlicmFyeS4AV2l0aCBj
b250ZXh0BFRoZXJlIGlzICVzIGZpbGUAVGhlcmUgYXJlICVzIGZpbGVzAG11bGx1c2sAbXkgY29u
dGV4dARudWRnZSBudWRnZQBteSBvdGhlciBjb250ZXh0BG51ZGdlIG51ZGdlAG51ZGdlIG51ZGdl
AFByb2plY3QtSWQtVmVyc2lvbjogMi4wClBPLVJldmlzaW9uLURhdGU6IDIwMDMtMDQtMTEgMTQ6
MzItMDQwMApMYXN0LVRyYW5zbGF0b3I6IEouIERhdmlkIEliYW5leiA8ai1kYXZpZEBub29zLmZy
PgpMYW5ndWFnZS1UZWFtOiBYWCA8cHl0aG9uLWRldkBweXRob24ub3JnPgpNSU1FLVZlcnNpb246
IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9aXNvLTg4NTktMQpDb250ZW50
LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CkdlbmVyYXRlZC1CeTogcHlnZXR0ZXh0LnB5IDEuMQpQ
bHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD1uIT0xOwoAVGhyb2F0d29iYmxlciBNYW5n
cm92ZQBIYXkgJXMgZmljaGVybwBIYXkgJXMgZmljaGVyb3MAR3V2ZiB6YnFoeXIgY2ViaXZxcmYg
dmFncmVhbmd2YmFueXZtbmd2YmEgbmFxIHlicG55dm1uZ3ZiYQpmaGNjYmVnIHNiZSBsYmhlIENs
Z3ViYSBjZWJ0ZW56ZiBvbCBjZWJpdnF2YXQgbmEgdmFncmVzbnByIGdiIGd1ciBUQUgKdHJnZ3Jr
ZyB6cmZmbnRyIHBuZ255YnQgeXZvZW5lbC4ASGF5ICVzIGZpY2hlcm8gKGNvbnRleHQpAEhheSAl
cyBmaWNoZXJvcyAoY29udGV4dCkAYmFjb24Ad2luayB3aW5rIChpbiAibXkgY29udGV4dCIpAHdp
bmsgd2luayAoaW4gIm15IG90aGVyIGNvbnRleHQiKQB3aW5rIHdpbmsA
s  3hIElQAABQAGAAAAHAAAAEwAAAALAAAAfAAAAAAAAACoAAAAFQAAAKkAAAAjAAAAvwAAAKEAAADj
AAAABwAAAIUBAAALAAAAjQEAAEUBAACZAQAAFgAAAN8CAAAeAAAA9gIAAKEAAAAVAwAABQAAALcD
AAAJAAAAvQMAAAEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABQAAAAYAAAACAAAAAFJh
eW1vbmQgTHV4dXJ5IFlhY2gtdABUaGVyZSBpcyAlcyBmaWxlAFRoZXJlIGFyZSAlcyBmaWxlcwBU
aGlzIG1vZHVsZSBwcm92aWRlcyBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgbG9jYWxpemF0aW9u
CnN1cHBvcnQgZm9yIHlvdXIgUHl0aG9uIHByb2dyYW1zIGJ5IHByb3ZpZGluZyBhbiBpbnRlcmZh
Y2UgdG8gdGhlIEdOVQpnZXR0ZXh0IG1lc3NhZ2UgY2F0YWxvZyBsaWJyYXJ5LgBtdWxsdXNrAG51
ZGdlIG51ZGdlAFByb2plY3QtSWQtVmVyc2lvbjogMi4wClBPLVJldmlzaW9uLURhdGU6IDIwMDAt
MDgtMjkgMTI6MTktMDQ6MDAKTGFzdC1UcmFuc2xhdG9yOiBKLiBEYXZpZCBJYsOhw7FleiA8ai1k
YXZpZEBub29zLmZyPgpMYW5ndWFnZS1UZWFtOiBYWCA8cHl0aG9uLWRldkBweXRob24ub3JnPgpN
SU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9aXNvLTg4
NTktMQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBub25lCkdlbmVyYXRlZC1CeTogcHlnZXR0
ZXh0LnB5IDEuMQpQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD1uIT0xOwoAVGhyb2F0
d29iYmxlciBNYW5ncm92ZQBIYXkgJXMgZmljaGVybwBIYXkgJXMgZmljaGVyb3MAR3V2ZiB6YnFo
eXIgY2ViaXZxcmYgdmFncmVhbmd2YmFueXZtbmd2YmEgbmFxIHlicG55dm1uZ3ZiYQpmaGNjYmVn
IHNiZSBsYmhlIENsZ3ViYSBjZWJ0ZW56ZiBvbCBjZWJpdnF2YXQgbmEgdmFncmVzbnByIGdiIGd1
ciBUQUgKdHJnZ3JrZyB6cmZmbnRyIHBuZ255YnQgeXZvZW5lbC4AYmFjb24Ad2luayB3aW5rAA==
s  3hIElQcAAAAGAAAAHAAAAEwAAAALAAAAfAAAAAAAAACoAAAAFQAAAKkAAAAjAAAAvwAAAKEAAADj
AAAABwAAAIUBAAALAAAAjQEAAEUBAACZAQAAFgAAAN8CAAAeAAAA9gIAAKEAAAAVAwAABQAAALcD
AAAJAAAAvQMAAAEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABQAAAAYAAAACAAAAAFJh
eW1vbmQgTHV4dXJ5IFlhY2gtdABUaGVyZSBpcyAlcyBmaWxlAFRoZXJlIGFyZSAlcyBmaWxlcwBU
aGlzIG1vZHVsZSBwcm92aWRlcyBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgbG9jYWxpemF0aW9u
CnN1cHBvcnQgZm9yIHlvdXIgUHl0aG9uIHByb2dyYW1zIGJ5IHByb3ZpZGluZyBhbiBpbnRlcmZh
Y2UgdG8gdGhlIEdOVQpnZXR0ZXh0IG1lc3NhZ2UgY2F0YWxvZyBsaWJyYXJ5LgBtdWxsdXNrAG51
ZGdlIG51ZGdlAFByb2plY3QtSWQtVmVyc2lvbjogMi4wClBPLVJldmlzaW9uLURhdGU6IDIwMDAt
MDgtMjkgMTI6MTktMDQ6MDAKTGFzdC1UcmFuc2xhdG9yOiBKLiBEYXZpZCBJYsOhw7FleiA8ai1k
YXZpZEBub29zLmZyPgpMYW5ndWFnZS1UZWFtOiBYWCA8cHl0aG9uLWRldkBweXRob24ub3JnPgpN
SU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9aXNvLTg4
NTktMQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBub25lCkdlbmVyYXRlZC1CeTogcHlnZXR0
ZXh0LnB5IDEuMQpQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD1uIT0xOwoAVGhyb2F0
d29iYmxlciBNYW5ncm92ZQBIYXkgJXMgZmljaGVybwBIYXkgJXMgZmljaGVyb3MAR3V2ZiB6YnFo
eXIgY2ViaXZxcmYgdmFncmVhbmd2YmFueXZtbmd2YmEgbmFxIHlicG55dm1uZ3ZiYQpmaGNjYmVn
IHNiZSBsYmhlIENsZ3ViYSBjZWJ0ZW56ZiBvbCBjZWJpdnF2YXQgbmEgdmFncmVzbnByIGdiIGd1
ciBUQUgKdHJnZ3JrZyB6cmZmbnRyIHBuZ255YnQgeXZvZW5lbC4AYmFjb24Ad2luayB3aW5rAA==
s  3hIElQAAAAADAAAAHAAAADQAAAAAAAAAAAAAAAAAAABMAAAABAAAAE0AAAAQAAAAUgAAAA8BAABj
AAAABAAAAHMBAAAWAAAAeAEAAABhYsOeAG15Y29udGV4dMOeBGFiw54AUHJvamVjdC1JZC1WZXJz
aW9uOiAyLjAKUE8tUmV2aXNpb24tRGF0ZTogMjAwMy0wNC0xMSAxMjo0Mi0wNDAwCkxhc3QtVHJh
bnNsYXRvcjogQmFycnkgQS4gV0Fyc2F3IDxiYXJyeUBweXRob24ub3JnPgpMYW5ndWFnZS1UZWFt
OiBYWCA8cHl0aG9uLWRldkBweXRob24ub3JnPgpNSU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5
cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzog
N2JpdApHZW5lcmF0ZWQtQnk6IG1hbnVhbGx5CgDCpHl6AMKkeXogKGNvbnRleHQgdmVyc2lvbikA
sL  3hIElQAAAAABAAAAHAAAACQAAAADAAAALAAAAAAAAAA4AAAAeAEAADkAAAABAAAAAAAAAAAAAAAA
UHJvamVjdC1JZC1WZXJzaW9uOiBObyBQcm9qZWN0IDAuMApQT1QtQ3JlYXRpb24tRGF0ZTogV2Vk
IERlYyAxMSAwNzo0NDoxNSAyMDAyClBPLVJldmlzaW9uLURhdGU6IDIwMDItMDgtMTQgMDE6MTg6
NTgrMDA6MDAKTGFzdC1UcmFuc2xhdG9yOiBKb2huIERvZSA8amRvZUBleGFtcGxlLmNvbT4KSmFu
ZSBGb29iYXIgPGpmb29iYXJAZXhhbXBsZS5jb20+Ckxhbmd1YWdlLVRlYW06IHh4IDx4eEBleGFt
cGxlLmNvbT4KTUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFy
c2V0PWlzby04ODU5LTE1CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IHF1b3RlZC1wcmludGFi
bGUKR2VuZXJhdGVkLUJ5OiBweWdldHRleHQucHkgMS4zCgA=
xxLC_MESSAGESz
gettext.mozgettext_bad_major_version.mozgettext_bad_minor_version.mozugettext.mozmetadata.moc                       e Zd Zd ZdS )GettextBaseTestc                 0   |                      t          j        t          j                            t                    d                    t          j                            t                    st          j        t                     t          t          d          5 }|                    t          j        t                               d d d            n# 1 swxY w Y   t          t          d          5 }|                    t          j        t                                d d d            n# 1 swxY w Y   t          t"          d          5 }|                    t          j        t$                               d d d            n# 1 swxY w Y   t          t&          d          5 }|                    t          j        t(                               d d d            n# 1 swxY w Y   t          t*          d          5 }|                    t          j        t,                               d d d            n# 1 swxY w Y   |                     t          j                              | _        d| j        d<   t4          j                                         d S )Nr   wbr   LANGUAGE)
addCleanupr   rmtreeospathsplit	LOCALEDIRisdirmakedirsopenMOFILEwritebase64decodebytesGNU_MO_DATAMOFILE_BAD_MAJOR_VERSIONGNU_MO_DATA_BAD_MAJOR_VERSIONMOFILE_BAD_MINOR_VERSIONGNU_MO_DATA_BAD_MINOR_VERSIONUMOFILEUMO_DATAMMOFILEMMO_DATAenterContextEnvironmentVarGuardenvgettext_translationsclearselffps     (/usr/lib/python3.11/test/test_gettext.pysetUpzGettextBaseTest.setUpw   s6   	("'--	*B*B1*EFFFw}}Y'' 	#K	"""&$ 	62HHV'44555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6*D11 	HRHHV'(EFFGGG	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H*D11 	HRHHV'(EFFGGG	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H'4   	3BHHV'11222	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3'4   	3BHHV'11222	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3$$Y%B%D%DEE###%%%%%sZ   -CCC4-D--D14D1-FF
F
&-GG#&G#?-H88H<?H<N)__name__
__module____qualname__r,        r+   r   r   v   s#        & & & & &r1   r   s   3hIElQAAAAABAAAAHAAAACQAAAAAAAAAAAAAAAAAAAAsAAAAggAAAC0AAAAAUGx1cmFsLUZvcm1z
OiBucGx1cmFscz0yOyBwbHVyYWw9KG4gIT0gMSk7CiMtIy0jLSMtIyAgbWVzc2FnZXMucG8gKEVk
WCBTdHVkaW8pICAjLSMtIy0jLSMKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVU
Ri04CgA=
c                   >    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	S )
GettextTestCase1c                     t                               |            t          j        | _        t
          | _        t          j        d| j        dg           d S )Nr%   pgettextnames)	r   r,   r   curdir	localedirr   mofiler%   installr)   s    r+   r,   zGettextTestCase1.setUp   sG    d###	4>*FFFFFFr1   c                     | j         } |t          d          d            |t          d          d            |t          d          d            |t          d          d           d S N	albatrossmulluskbaconzRaymond Luxury Yach-tzThroatwobbler Mangrovenudge nudge	wink winkassertEqual_r)   eqs     r+   test_some_translationsz'GettextTestCase1.test_some_translations   v    
1[>>;'''
1Y<<!!!
1%&&(@AAA
1^k*****r1   c                 |    | j         } |t          dd          d            |t          dd          d           d S N
my contextrB   wink wink (in "my context")my other context!wink wink (in "my other context"))rE   r5   rG   s     r+   #test_some_translations_with_contextz4GettextTestCase1.test_some_translations_with_context   s[    
8L-00(	* 	* 	*
8&66.	0 	0 	0 	0 	0r1   c                     | j         } |t          d          d            |t          d          d            |t          d          d            |t          d          d           d S r>   rD   rG   s     r+   test_double_quotesz#GettextTestCase1.test_double_quotes   rJ   r1   c                     | j         } |t          d          d            |t          d          d            |t          d          d            |t          d          d           d S r>   rD   rG   s     r+   test_triple_single_quotesz*GettextTestCase1.test_triple_single_quotes   {    
1_{+++
1]W%%%
1)**,DEEE
1  +.....r1   c                     | j         } |t          d          d            |t          d          d            |t          d          d            |t          d          d           d S r>   rD   rG   s     r+   test_triple_double_quotesz*GettextTestCase1.test_triple_double_quotes   rV   r1   c                 F    | j         } |t          d          d           d S NzThis module provides internationalization and localization
support for your Python programs by providing an interface to the GNU
gettext message catalog library.zGuvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
trggrkg zrffntr pngnybt yvoenel.rD   rG   s     r+   test_multiline_stringsz'GettextTestCase1.test_multiline_strings   s>    
1 $ % %$	% 	% 	% 	% 	%r1   c                 H   | j         }| j        }t          | j        d          5 }t	          j        |          }d d d            n# 1 swxY w Y   |                                  |t          d          d           |                                  |t          d          d           dd l}|                    ddg	            |t          |j                    ||j        |j                    |t          |j	                    |t          |j
                   |`|`	d S )
NrbrB   rC   r@   rA   r   r%   ngettextr6   )rE   assertNotEqualr   r:   r%   GNUTranslationsr;   rF   builtinsr^   r5   )r)   rH   neqr*   tra   s         r+   test_the_alternative_interfacez/GettextTestCase1.test_the_alternative_interface   s[   !$+t$$ 	,'++A	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	
		
1][)))			
1Y<<!!!			J/	000
1ai
8QY'''
8QZ   Haj!!!s   AA	A	N)r-   r.   r/   r,   rI   rQ   rS   rU   rX   r[   rd   r0   r1   r+   r3   r3      s        G G G+ + +0 0 0+ + +/ / // / /% % %    r1   r3   c                   V    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd ZdS )GettextTestCase2c                     t                               |            t          j        | _        t          j        d| j                   t          j        d           t
          j        | _        d S Nr%   )	r   r,   r   r8   r9   r%   bindtextdomain
textdomainrF   r<   s    r+   r,   zGettextTestCase2.setUp   sR    d###y$.9999%%%r1   c                 `    |                      t          j        d          | j                   d S rh   )rE   r%   ri   r9   r<   s    r+   test_bindtextdomainz$GettextTestCase2.test_bindtextdomain   s+    /	::DNKKKKKr1   c                 T    |                      t          j                    d           d S rh   )rE   r%   rj   r<   s    r+   test_textdomainz GettextTestCase2.test_textdomain   s'    +--y99999r1   c                    t          t          d          5 }|                     t                    5 }t	          j        |           d d d            n# 1 swxY w Y   |j        }|                     |j        d           |                     |j	        d           |                     |j
        t                     d d d            d S # 1 swxY w Y   d S )Nr]   r   zBad version number 5)r   r   assertRaisesOSErrorr%   r`   	exceptionrE   errnostrerrorfilename)r)   r*   cmrr   s       r+   test_bad_major_versionz'GettextTestCase2.test_bad_major_version   sS   *D11 	KR""7++ ,r'+++, , , , , , , , , , , , , , , IY_a000Y/1GHHHY/1IJJJ	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	Ks5   CACA	CA	A CCCc                     t          t          d          5 }t          j        |           d d d            d S # 1 swxY w Y   d S Nr]   )r   r   r%   r`   r(   s     r+   test_bad_minor_versionz'GettextTestCase2.test_bad_minor_version   s    *D11 	(R#B'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s   8<<c                    | j         } ||                     d          d            ||                     d          d            ||                     d          d            ||                     d          d           d S r>   rD   rG   s     r+   rI   z'GettextTestCase2.test_some_translations       
466+,,,
466)g&&&
466*++-EFFF
466.!!;/////r1   c                     | j         } |t          j        dd          d            |t          j        dd          d           d S rL   )rE   r%   r5   rG   s     r+   rQ   z4GettextTestCase2.test_some_translations_with_context  sa    
7L-88(	* 	* 	*
7.>>.	0 	0 	0 	0 	0r1   c                     | j         } |t          j        ddd          d            |t          j        ddd          d           d S )Nr%   rM   rB   rN   rO   rP   )rE   r%   	dpgettextrG   s     r+   .test_some_translations_with_context_and_domainz?GettextTestCase2.test_some_translations_with_context_and_domain  se    
7YmDD(	* 	* 	*
7Y(:MJJ.	0 	0 	0 	0 	0r1   c                    | j         } ||                     d          d            ||                     d          d            ||                     d          d            ||                     d          d           d S r>   rD   rG   s     r+   rS   z#GettextTestCase2.test_double_quotes  r|   r1   c                    | j         } ||                     d          d            ||                     d          d            ||                     d          d            ||                     d          d           d S r>   rD   rG   s     r+   rU   z*GettextTestCase2.test_triple_single_quotes      
466/""K000
466-  '***
466.//1IJJJ
466$%%{33333r1   c                    | j         } ||                     d          d            ||                     d          d            ||                     d          d            ||                     d          d           d S r>   rD   rG   s     r+   rX   z*GettextTestCase2.test_triple_double_quotes%  r   r1   c                 R    | j         } ||                     d          d           d S rZ   rD   rG   s     r+   r[   z'GettextTestCase2.test_multiline_strings-  sB    
466 $ % %$	% 	% 	% 	% 	%r1   N)r-   r.   r/   r,   rl   rn   rw   rz   rI   rQ   r   rS   rU   rX   r[   r0   r1   r+   rf   rf      s        ! ! !L L L: : :K K K( ( (
0 0 00 0 00 0 00 0 04 4 44 4 4% % % % %r1   rf   c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )PluralFormsTestCasec                 R    t                               |            t          | _        d S N)r   r,   r   r:   r<   s    r+   r,   zPluralFormsTestCase.setUp9  s!    d###r1   c                     | j         }t          j        ddd          } ||d           t          j        ddd          } ||d           t          j        d          } ||d           d S )NThere is %s fileThere are %s files   Hay %s fichero   Hay %s ficheros)rE   r%   r^   r)   rH   xs      r+   test_plural_forms1z&PluralFormsTestCase.test_plural_forms1=  s    /1EqII
1/1EqII
1   O.//
1r1   c                     | j         }t          j        dddd          } ||d           t          j        dddd          } ||d           t          j        dd          } ||d           d S )NWith contextr   r   r   Hay %s fichero (context)r   Hay %s ficheros (context))rE   r%   	npgettextr5   r   s      r+   test_plural_context_forms1z.PluralFormsTestCase.test_plural_context_forms1F  s    n02FK K
1()))n02FK K
1)***^-?@@
1()))))r1   c                 d   | j         }t          | j        d          5 }t          j        |          }d d d            n# 1 swxY w Y   |                    ddd          } ||d           |                    ddd          } ||d           |                    d          } ||d           d S )Nr]   r   r   r   r   r   r   )rE   r   r:   r%   r`   r^   r)   rH   r*   rc   r   s        r+   test_plural_forms2z&PluralFormsTestCase.test_plural_forms2Q  s    $+t$$ 	,'++A	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,JJ)+?CC
1JJ)+?CC
1   II())
1   >AAc                 h   | j         }t          | j        d          5 }t          j        |          }d d d            n# 1 swxY w Y   |                    dddd          } ||d           |                    dddd          } ||d           t          j        dd          } ||d           d S )	Nr]   r   r   r   r   r   r   r   )rE   r   r:   r%   r`   r   r5   r   s        r+   test_plural_context_forms2z.PluralFormsTestCase.test_plural_context_forms2\  s   $+t$$ 	,'++A	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,KK*,@!E E
1()))KK*,@!E E
1)***^-?@@
1()))))r   c                     | j         }t          j        d          d                    fdt	          d          D                       } ||d           d S )N0 c                 @    g | ]}t           |                    S r0   str.0r   fs     r+   
<listcomp>z/PluralFormsTestCase.test_ja.<locals>.<listcomp>n  '    555Ac!!A$$ii555r1      00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000rE   r%   c2pyjoinranger)   rH   sr   s      @r+   test_jazPluralFormsTestCase.test_jak  sq    LGG5555s55566
1  Y  	Z  	Z  	Z  	Z  	Zr1   c                     | j         }t          j        d          d                    fdt	          d          D                       } ||d           d S )Nn != 1r   c                 @    g | ]}t           |                    S r0   r   r   s     r+   r   z/PluralFormsTestCase.test_de.<locals>.<listcomp>t  r   r1   r   10111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111r   r   s      @r+   test_dezPluralFormsTestCase.test_deq  sq    L""GG5555s55566
1  Y  	Z  	Z  	Z  	Z  	Zr1   c                     | j         }t          j        d          d                    fdt	          d          D                       } ||d           d S )Nzn>1r   c                 @    g | ]}t           |                    S r0   r   r   s     r+   r   z/PluralFormsTestCase.test_fr.<locals>.<listcomp>z  r   r1   r   00111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111r   r   s      @r+   test_frzPluralFormsTestCase.test_frw  sq    LGG5555s55566
1  Y  	Z  	Z  	Z  	Z  	Zr1   c                     | j         }t          j        d          d                    fdt	          d          D                       } ||d           d S )Nz)n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2r   c                 @    g | ]}t           |                    S r0   r   r   s     r+   r   z/PluralFormsTestCase.test_lv.<locals>.<listcomp>  r   r1   r   20111111111111111111101111111110111111111011111111101111111110111111111011111111101111111110111111111011111111111111111110111111111011111111101111111110111111111011111111101111111110111111111011111111r   r   s      @r+   test_lvzPluralFormsTestCase.test_lv}  sr    LDEEGG5555s55566
1  Y  	Z  	Z  	Z  	Z  	Zr1   c                     | j         }t          j        d          d                    fdt	          d          D                       } ||d           d S )Nzn==1 ? 0 : n==2 ? 1 : 2r   c                 @    g | ]}t           |                    S r0   r   r   s     r+   r   z/PluralFormsTestCase.test_gd.<locals>.<listcomp>  r   r1   r   20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222r   r   s      @r+   test_gdzPluralFormsTestCase.test_gd  sr    L233GG5555s55566
1  Y  	Z  	Z  	Z  	Z  	Zr1   c                     | j         }t          j        d          d                    fdt	          d          D                       } ||d           d S )Nzn==1 ? 0 : (n==2 ? 1 : 2)r   c                 @    g | ]}t           |                    S r0   r   r   s     r+   r   z0PluralFormsTestCase.test_gd2.<locals>.<listcomp>  r   r1   r   r   r   r   s      @r+   test_gd2zPluralFormsTestCase.test_gd2  sr    L455GG5555s55566
1  Y  	Z  	Z  	Z  	Z  	Zr1   c                     | j         }t          j        d          d                    fdt	          d          D                       } ||d           d S )Nz6n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2r   c                 @    g | ]}t           |                    S r0   r   r   s     r+   r   z/PluralFormsTestCase.test_ro.<locals>.<listcomp>  r   r1   r   10111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222r   r   s      @r+   test_rozPluralFormsTestCase.test_ro  sr    LQRRGG5555s55566
1  Y  	Z  	Z  	Z  	Z  	Zr1   c                     | j         }t          j        d          d                    fdt	          d          D                       } ||d           d S )NzEn%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2r   c                 @    g | ]}t           |                    S r0   r   r   s     r+   r   z/PluralFormsTestCase.test_lt.<locals>.<listcomp>  r   r1   r   20111111112222222222201111111120111111112011111111201111111120111111112011111111201111111120111111112011111111222222222220111111112011111111201111111120111111112011111111201111111120111111112011111111r   r   s      @r+   test_ltzPluralFormsTestCase.test_lt  sr    L`aaGG5555s55566
1  Y  	Z  	Z  	Z  	Z  	Zr1   c                     | j         }t          j        d          d                    fdt	          d          D                       } ||d           d S )NzPn%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2r   c                 @    g | ]}t           |                    S r0   r   r   s     r+   r   z/PluralFormsTestCase.test_ru.<locals>.<listcomp>  r   r1   r   20111222222222222222201112222220111222222011122222201112222220111222222011122222201112222220111222222011122222222222222220111222222011122222201112222220111222222011122222201112222220111222222011122222r   r   s      @r+   test_ruzPluralFormsTestCase.test_ru  sr    LkllGG5555s55566
1  Y  	Z  	Z  	Z  	Z  	Zr1   c                     | j         }t          j        d          d                    fdt	          d          D                       } ||d           d S )Nz#(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2r   c                 @    g | ]}t           |                    S r0   r   r   s     r+   r   z/PluralFormsTestCase.test_cs.<locals>.<listcomp>  r   r1   r   20111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222r   r   s      @r+   test_cszPluralFormsTestCase.test_cs  sr    L>??GG5555s55566
1  Y  	Z  	Z  	Z  	Z  	Zr1   c                     | j         }t          j        d          d                    fdt	          d          D                       } ||d           d S )Nz@n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2r   c                 @    g | ]}t           |                    S r0   r   r   s     r+   r   z/PluralFormsTestCase.test_pl.<locals>.<listcomp>  r   r1   r   20111222222222222222221112222222111222222211122222221112222222111222222211122222221112222222111222222211122222222222222222111222222211122222221112222222111222222211122222221112222222111222222211122222r   r   s      @r+   test_plzPluralFormsTestCase.test_pl  sr    L[\\GG5555s55566
1  Y  	Z  	Z  	Z  	Z  	Zr1   c                     | j         }t          j        d          d                    fdt	          d          D                       } ||d           d S )Nz:n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3r   c                 @    g | ]}t           |                    S r0   r   r   s     r+   r   z/PluralFormsTestCase.test_sl.<locals>.<listcomp>  r   r1   r   30122333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333012233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333r   r   s      @r+   test_slzPluralFormsTestCase.test_sl  sr    LUVVGG5555s55566
1  Y  	Z  	Z  	Z  	Z  	Zr1   c                     | j         }t          j        d          d                    fdt	          d          D                       } ||d           d S )NzNn==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5r   c                 @    g | ]}t           |                    S r0   r   r   s     r+   r   z/PluralFormsTestCase.test_ar.<locals>.<listcomp>  r   r1   r   01233333333444444444444444444444444444444444444444444444444444444444444444444444444444444444444444445553333333344444444444444444444444444444444444444444444444444444444444444444444444444444444444444444r   r   s      @r+   test_arzPluralFormsTestCase.test_ar  sr    LijjGG5555s55566
1  Y  	Z  	Z  	Z  	Z  	Zr1   c                 L   | j         } |t          t          j        d            |t          t          j        d            |t          t          j        d            |t          t          j        ddz  dz              |                      t          j        d          d          d	            |t          t          j        d
            |t          t          j        ddz  dz   ddz  z              |                      t          j        d          d          d           d S )Nzos.chmod('/etc/passwd',0777)z"(eval(foo) && ""zf"{os.system('sh')}"zn+i'  nzn+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+n+nr   e   z((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((n))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))()z)((((((((((((((((((((n)))))))))))))))))))))rp   
ValueErrorr%   r   rE   )r)   raisess     r+   test_securityz!PluralFormsTestCase.test_security  s	   "z7<)GHHHz7<)<===z7<)ABBBz7<ec)9:::5n55a88#>>>z7<)@AAAz7<US3u9)DEEE<&;<<Q??CCCCCr1   c                    t          j        d          |                     d                    fdt	          d          D                       d           t          j        d          |                     d                    fdt	          d          D                       d           t          j        d	          |                     d                    fd
t	          d          D                       d           t          j        d          |                     d                    fdt	          d          D                       d           d S )Nzn == n == nr   c              3   H   K   | ]}t           |                    V  d S r   r   r   s     r+   	<genexpr>z>PluralFormsTestCase.test_chained_comparison.<locals>.<genexpr>  1       = =qQQqTT = = = = = =r1      010z
1 < n == nc              3   H   K   | ]}t           |                    V  d S r   r   r   s     r+   r   z>PluralFormsTestCase.test_chained_comparison.<locals>.<genexpr>  r   r1   100z
n == n < 2c              3   H   K   | ]}t           |                    V  d S r   r   r   s     r+   r   z>PluralFormsTestCase.test_chained_comparison.<locals>.<genexpr>  r   r1   z	0 < n < 2c              3   H   K   | ]}t           |                    V  d S r   r   r   s     r+   r   z>PluralFormsTestCase.test_chained_comparison.<locals>.<genexpr>  r   r1   111)r%   r   rE   r   r   r)   r   s    @r+   test_chained_comparisonz+PluralFormsTestCase.test_chained_comparison  s9   L'' = = = =E!HH = = ===uEEEL&& = = = =E!HH = = ===uEEEL&& = = = =E!HH = = ===uEEEL%% = = = =E!HH = = ===uEEEEEr1   c                 h    |                       t          j        d          d          d           d S )N0123r   {   rE   r%   r   r<   s    r+   test_decimal_numberz'PluralFormsTestCase.test_decimal_number  s3    -f--a00#66666r1   c                     g d}|D ]H}|                      t                    5  t          j        |           d d d            n# 1 swxY w Y   Id S )N)zx>1z(n>1zn>1)z
42**42**420xaz1.01e2zn>0x1z+nz-nzn()zn(1)z1+nnzn n)rp   r   r%   r   )r)   invalid_expressionsexprs      r+   test_invalid_syntaxz'PluralFormsTestCase.test_invalid_syntax  s    
 
 
 ( 	# 	#D"":.. # #T"""# # # # # # # # # # # # # # #	# 	#s   AA	A	c                    |                       t          j        d          d          d           |                       t          j        d          d          d           |                       t          j        d          d          d           |                       t          j        d          d          d           d S )Nz	n?1?2:3:4r      r   r   z	n?1:3?4:5r   r<   s    r+   test_nested_condition_operatorz2PluralFormsTestCase.test_nested_condition_operator  s    2k22155q9992k22155q9992k22155q9992k22155q99999r1   c                 ^   t          j        d          }|                      |d          d           |                      |d          d           |                      |d          d           |                      |d          d           |                     t          |d           d S )	Nz2/n*3r      r   r   r   i)r%   r   rE   rp   ZeroDivisionErrorr   s     r+   test_divisionz!PluralFormsTestCase.test_division  s    L!!1q!!!1q!!!1q!!!2###+Q22222r1   c                    t          j        d          }|                      |d          d           |                      |d          d           |                     t                    5  |                      |d          d           d d d            n# 1 swxY w Y   |                     t                    5  |                      |d          d           d d d            n# 1 swxY w Y   |                     t                    5  |                      |d          d           d d d            n# 1 swxY w Y   |                     t          |d           |                     t          |d	           |                     t          |g            |                     t          |t                                 d S )
Nr   r   r   r   g      ?g       @g?2   2)r%   r   rE   assertWarnsDeprecationWarningrp   	TypeErrorobjectr   s     r+   test_plural_numberz&PluralFormsTestCase.test_plural_number  sO   L""1q!!!1q!!!011 	( 	(QQsVVQ'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(011 	( 	(QQsVVQ'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(011 	( 	(QQsVVQ'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	()Q,,,)Q---)Q+++)Q11111s6   - BB B> C**C.1C. D;;D?D?N)r-   r.   r/   r,   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r0   r1   r+   r   r   8  s              	* 	* 	*	  	  	 * * *Z Z ZZ Z ZZ Z ZZ Z ZZ Z ZZ Z ZZ Z ZZ Z ZZ Z ZZ Z ZZ Z ZZ Z ZZ Z ZD D D 	F 	F 	F7 7 7# # #: : :3 3 32 2 2 2 2r1   r   c                       e Zd Zd Zd ZdS )GNUTranslationParsingTestc                 <   t          t          d          5 }|                    t          j        t
                               d d d            n# 1 swxY w Y   t          t          d          5 }t          j        |          }d d d            d S # 1 swxY w Y   d S )Nr
   r]   )r   r   r   r   r   GNU_MO_DATA_ISSUE_17898r%   r`   r)   r*   rc   s      r+   !test_plural_form_error_issue17898z;GNUTranslationParsingTest.test_plural_form_error_issue17898   s   &$ 	B2HHV'(?@@AAA	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B&$ 	,2'++A	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,s#   -AAA/BBBc                    t          t          d          5 }|                    t          j        t
                               ddd           n# 1 swxY w Y   t          t          d          5 }t          j        |          }|                     |	                                d         d           ddd           dS # 1 swxY w Y   dS )zuChecks that comments like:

            #-#-#-#-#  messages.po (EdX Studio)  #-#-#-#-#

        are ignored.
        r
   Nr]   zplural-formsznplurals=2; plural=(n != 1);)
r   r   r   r   r   r  r%   r`   rE   infor  s      r+   *test_ignore_comments_in_headers_issue36239zDGNUTranslationParsingTest.test_ignore_comments_in_headers_issue36239  sL    &$ 	B2HHV'(?@@AAA	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B&$ 	W2'++AQVVXXn57UVVV	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	Ws$   -AAA/AB??CCN)r-   r.   r/   r  r  r0   r1   r+   r  r    s7        , , ,W W W W Wr1   r  c                   &    e Zd Zd Zd Zd Zd ZdS )UnicodeTranslationsTestc                 
   t                               |            t          t          d          5 }t	          j        |          | _        d d d            n# 1 swxY w Y   | j        j        | _        | j        j        | _        d S ry   )	r   r,   r   r   r%   r`   rc   rF   r5   r(   s     r+   r,   zUnicodeTranslationsTest.setUp  s    d###'4   	1B,R00DF	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1   AAAc                 b    |                      |                     d          t                     d S )Nr   )assertIsInstancerF   r   r<   s    r+   test_unicode_msgidz*UnicodeTranslationsTest.test_unicode_msgid  s(    dffRjj#.....r1   c                 X    |                      |                     d          d           d S )N   abÞu   ¤yzrD   r<   s    r+   test_unicode_msgstrz+UnicodeTranslationsTest.test_unicode_msgstr   s*    ))844444r1   c                     |                      dd          }|                     t          |t                               |                     |d           d S )Nu   mycontextÞr&  u   ¤yz (context version))r5   
assertTrue
isinstancer   rE   r)   rc   s     r+   test_unicode_context_msgstrz3UnicodeTranslationsTest.test_unicode_context_msgstr#  sN    MM/844
1c**+++677777r1   N)r-   r.   r/   r,   r$  r'  r,  r0   r1   r+   r  r    sP        ( ( (/ / /5 5 58 8 8 8 8r1   r  c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )UnicodeTranslationsPluralTestc                 
   t                               |            t          t          d          5 }t	          j        |          | _        d d d            n# 1 swxY w Y   | j        j        | _        | j        j        | _        d S ry   )	r   r,   r   r   r%   r`   rc   r^   r   r(   s     r+   r,   z#UnicodeTranslationsPluralTest.setUp*  s    d###&$ 	12,R00DF	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1)r!  c           	          | j         } |t          |                     ddd          t                                |t          |                     ddd          t                               d S Nr   r   r   )r)  r*  r^   r   r)   unlesss     r+   r$  z0UnicodeTranslationsPluralTest.test_unicode_msgid1  sc    z$--B22C88999z$--B22C8899999r1   c           
          | j         } |t          |                     dddd          t                                |t          |                     dddd          t                               d S r1  )r)  r*  r   r   r2  s     r+   test_unicode_context_msgidz8UnicodeTranslationsPluralTest.test_unicode_context_msgid6  sg    z$..RQ77==>>>z$..RQ77==>>>>>r1   c                 b   | j         }| j        }|                     ddd          } |t          |t                                ||d            |t          |t                               |                     ddd          } |t          |t                                ||d           d S )Nr   r   r   r      r   )rE   r)  r^   r*  r   r)   rH   r3  rc   s       r+   r'  z1UnicodeTranslationsPluralTest.test_unicode_msgstr;  s    MM,.BAFFz!S!!"""
1z!S!!"""MM,.BAFFz!S!!"""
1     r1   c                 *   | j         }| j        }|                     dddd          } |t          |t                                ||d           |                     dddd          } |t          |t                                ||d           d S )Nr   r   r   r   r   r7  r   )rE   r)  r   r*  r   r8  s       r+    test_unicode_msgstr_with_contextz>UnicodeTranslationsPluralTest.test_unicode_msgstr_with_contextF  s    NN>-/CQH Hz!S!!"""
1()))NN>-/CQH Hz!S!!"""
1)*****r1   N)r-   r.   r/   r,   r$  r5  r'  r:  r0   r1   r+   r.  r.  )  s_        * * *: : :
? ? ?
	! 	! 	!
+ 
+ 
+ 
+ 
+r1   r.  c                       e Zd Zd Zd ZdS )WeirdMetadataTestc                    t                               |            t          t          d          5 }	 t	          j        |          | _        n#  |                                   xY w	 d d d            d S # 1 swxY w Y   d S ry   )r   r,   r   r    r%   r`   rc   tearDownr(   s     r+   r,   zWeirdMetadataTest.setUpT  s    d###'4   	B 044 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s(   A4AA4A##A44A8;A8c                     | j                                         }|                     t          |          d           |                     |d         d           d S )N	   zlast-translatorz=John Doe <jdoe@example.com>
Jane Foobar <jfoobar@example.com>)rc   r  rE   len)r)   r  s     r+   test_weird_metadataz%WeirdMetadataTest.test_weird_metadata]  s_    v{{}}TA&&&/0K	M 	M 	M 	M 	Mr1   N)r-   r.   r/   r,   rB  r0   r1   r+   r<  r<  S  s7          M M M M Mr1   r<  c                       e Zd Zd ZdS )DummyGNUTranslationsc                     dS )Nfoor0   r<   s    r+   rF  zDummyGNUTranslations.fooe  s    ur1   N)r-   r.   r/   rF  r0   r1   r+   rD  rD  d  s#            r1   rD  c                       e Zd Zd ZdS )GettextCacheTestCasec                    t           j        | _        t          | _        |                     t          t          j                  d           t          j	        d| j                  }|                     t          t          j                  d           t          j	        d| j        t                    }|                     t          t          j                  d           |                     |j        t                     t          j	        d| j        t                    }|                     t          t          j                  d           |                     |j        t                     d S )Nr   r%   r   )class_r   )r   r8   r9   r   r:   rE   rA  r%   r&   translationrD  	__class__r+  s     r+   
test_cachezGettextCacheTestCase.test_cachej  s(   W233Q777	4>::W233Q777	4>';= = = 	W233Q777&:;;; 	4>';= = = 	W233Q777&:;;;;;r1   N)r-   r.   r/   rM  r0   r1   r+   rH  rH  i  s#        < < < < <r1   rH  c                       e Zd Zd ZdS )MiscTestCasec                 B    t          j        | t          ddh           d S )Nr   ENOENT)not_exported)r   check__all__r%   r<   s    r+   test__all__zMiscTestCase.test__all__  s2    T7+18*<	> 	> 	> 	> 	> 	>r1   N)r-   r.   r/   rT  r0   r1   r+   rO  rO    s#        > > > > >r1   rO  __main__)%r   r   r%   unittesttestr   test.supportr   r   r   r   r   r!   r   r   r   r   r   r   r   r    TestCaser   r  r3   rf   r   r  r  r.  r<  r`   rD  rH  rO  r-   mainr0   r1   r+   <module>r[     s6   				          " " " " " "8! 0! *	 GLL}--		i	.	.7<<	3QRR 7<<	3QRR 
',,y-
0
0
',,y-
0
0& & & & &h' & & &( L L L L L L L L^U% U% U% U% U% U% U% U%pD2 D2 D2 D2 D2/ D2 D2 D2NW W W W W W W W,8 8 8 8 8o 8 8 8('+ '+ '+ '+ '+O '+ '+ '+TM M M M M M M M"    72   
< < < < <? < < <4> > > > >8$ > > > zHMOOOGX8& r1   