рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рдХреНрд╡реАрди (quine) рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкрд╛рда рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реИред рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡рд╛рд▓реА рдлрд╛рдЗрд▓ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИред
Quines рдХреЛ рд▓рдЧрднрдЧ рд╕рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреБрдЫ рд╡рд┐рджреЗрд╢реА рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рдеред рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рдПрдХ рдХреНрд╡реАрди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдПрдХ Win32 рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдПрдХ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЕрдкрдирд╛ рдкрд╛рда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдПрдХ рд╣реА рдорд╢реАрди рдХреЛрдб рдХреЛ рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк рд╕рдВрдЦреНрдпрд╛ 48 рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕реА рджреЛ-рдмрд╛рдЗрдЯ рдЕрдиреБрджреЗрд╢ рдХреЛ mnemonically рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдзрдХреНрдХрд╛ 48 (рдпрд╛ рдзрдХреНрдХрд╛ 30h),
рдФрд░ рдбреАрдмреА рдбреЗрдЯрд╛ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
db 06Ah, 030h (рдпрд╛ db 106.48)ред
рд╡рд┐рдХрд▓реНрдк db 'j0' рднреА рд╕рдВрднрд╡ рд╣реИред рдЗрди рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕рдВрдХрд▓рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╣реА рдорд╢реАрди рдХреЛрдб рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдПрдХ рдорд╛рддреНрд░рд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдпреБрдХреНрдд рдПрдХ рдЕрд╕реЗрдВрдмрд▓рд░ рдХреНрд╡реАрди рд▓рд┐рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ - рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╣рдЬрд╛рд░реЛрдВ рд▓рд╛рдЗрдиреЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдВрдЧреАред рдЗрд╕рд▓рд┐рдП, рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдЬрд┐рд╕реЗ рд╣рдо рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдкреНрд░рдкрддреНрд░ рдореЗрдВ DB рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдХреНрд╡реАрди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реИ
рд╕реНрд░реЛрдд 1.386 .model flat,stdcall .code q: db 16- .... db 16- end q
(MASM рдХреЛрдбрд╛рдВрддрд░рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдореБрд╢реНрдХрд┐рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдХреНрд╡реАрди рдХреЛ рд▓рд┐рдЦрдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реИ - рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╢реАрди рдХреЛрдб рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк рд╕рд╛рдзрд╛рд░рдг рдЕрд╕реЗрдВрдмрд▓рд░ mnemonics рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдХрд░ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдиреАрдЪреЗ рд╕реНрд░реЛрдд 2 рджреЗрдЦреЗрдВред рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╕реВрддреНрд░реЛрдВ 1 рдФрд░ 2 рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдПрдХ рд╣реА рдорд╢реАрди рдХреЛрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИред
рд╕реНрд░реЛрдд 2 ; @echo off ; ml /c /coff quine.cmd ; pause ; if errorlevel 1 goto exit ; link /subsystem:windows /section:.text,RW quine.obj ; pause ; del quine.obj ; goto exit .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc bStr = 25 ; - , qLen = len * 5 + (len / bStr + 1) * 4 + len1 + 10 ; stLen = (qLen / 1000h + 1) * 1000h ; .code ; *** 1 - *** start: cld mov edx,[esp] ; kernel32.dll - 2 sub esp,stLen ; mov edi,esp mov stAddr,edi lea esi,text xor ecx,ecx mov cl,len1 rep movsb ; '.386 .model flat ...' lea esi,start mov bl,bStr cycl: mov eax,ecx ; . ? div bl or ah,ah jnz comma mov ax,0A0Dh ; - db stosw mov eax,' bd' stosd dec edi jmp j1 comma: mov al,',' ; - , stosb j1: mov al,'h' ; 16- - h shl eax,16 lodsb mov ah,al and al,0Fh cmp al,10 sbb al,69h das ; xchg al,ah shr al,4 cmp al,10 sbb al,69h das ; shl eax,8 mov al,'0' ; 0 stosd inc ecx cmp ecx,len jb cycl mov ax,0A0Dh ; 'end q' stosw mov eax,' dne' stosd mov eax,'q' stosd ; *** 2 - API *** xor dx,dx c2: cmp word ptr [edx],'ZM' ; MZ- kernel32? je c1 c3: sub edx,10000h jmp c2 c1: mov ecx,[edx+3Ch] cmp dword ptr [edx+ecx],'EP' ; PE-? jne c3 mov ecx,[edx+ecx+78h] add ecx,edx ; kernel32 push ecx mov eax,[ecx+20h] add eax,edx ; xor ebx,ebx xor ecx,ecx cycl2: mov esi,[eax+4*ebx] add esi,edx lea edi,GPAname mov cl,len2 repe cmpsb ; GetProcAddress je found inc ebx jmp cycl2 found: pop ecx mov eax,[ecx+24h] add eax,edx mov bx,[eax+2*ebx] ; GetProcAddress mov eax,[ecx+1ch] add eax,edx mov ebx,[eax+4*ebx] add ebx,edx mov edi,edx ; EBX - GetProcAddress ; EDI - kernel32 ( - user32) xor ecx,ecx ; mov cl,tlen lea esi,tbl cycl3: cmp cl,tlen-tlen2 jne j2 push ecx push offset DLLname call eax ; user32.dll LoadLibrary pop ecx mov edi,eax j2: dec cl push ecx push [esi+4*ecx] push edi call ebx ; GetProcAddress pop ecx mov [esi+4*ecx],eax or cl,cl jnz cycl3 ; *** 3 - MessageBox *** push NULL call dword ptr _GetModuleHandle mov hInst,eax call dword ptr _GetCurrentThreadId push eax push NULL push offset hProc push WH_CBT ; call dword ptr _SetWindowsHookEx mov hook,eax push MB_OK push offset capt push stAddr push 0 call dword ptr _MessageBox ; push 0 call dword ptr _ExitProcess ; *** hProc proc code:dword,wParam:dword,lParam:dword ; local coord:RECT pusha cmp code,HCBT_ACTIVATE ; ? jne exit push 0FFFFh push wParam call dword ptr _GetDlgItem mov ebx,eax ; lea eax,coord push eax push ebx call dword ptr _GetClientRect ; add coord.right,20 push NULL push NULL push WM_GETFONT push ebx mov edi,_SendMessage call edi ; mov esi,eax push SW_HIDE push ebx call dword ptr _ShowWindow ; push NULL push hInst push 0FFFFh push wParam push coord.bottom push coord.right push coord.top push coord.left push WS_CHILD+WS_VISIBLE+ES_MULTILINE+ES_READONLY push stAddr push offset cname push WS_EX_WINDOWEDGE call dword ptr _CreateWindowEx ; EDIT STATIC ; , push NULL push esi push WM_SETFONT push eax call edi ; push hook call dword ptr _UnhookWindowsHookEx ; popa xor eax,eax ret exit: popa push lParam push wParam push code push hook call dword ptr _CallNextHookEx ; ret hProc endp ; *** capt db 'Quine',0 ; GPAname db 'GetProcAddress',0 len2 equ $ - GPAname GDIname db 'GetDlgItem',0 ; GCRname db 'GetClientRect',0 SMname db 'SendMessageA',0 SWname db 'ShowWindow',0 CWEname db 'CreateWindowExA',0 UWHEname db 'UnhookWindowsHookEx',0 CNHEname db 'CallNextHookEx',0 SWHEname db 'SetWindowsHookExA',0 MBname db 'MessageBoxA',0 LLname db 'LoadLibraryA',0 GMHname db 'GetModuleHandleA',0 GCTIname db 'GetCurrentThreadId',0 EPname db 'ExitProcess',0 DLLname db 'user32.dll',0 cname db 'EDIT',0 ; text db '.386',13,10,'.model flat,stdcall',13,10,'.code',13,10,'q:' ; len1 equ $ - text tbl label dword ; , _GetDlgItem dd offset GDIname ; user32.dll _GetClientRect dd offset GCRname _SendMessage dd offset SMname _ShowWindow dd offset SWname _CreateWindowEx dd offset CWEname _UnhookWindowsHookEx dd offset UWHEname _CallNextHookEx dd offset CNHEname _SetWindowsHookEx dd offset SWHEname _MessageBox dd offset MBname tbl2 label dword _LoadLibrary dd offset LLname ; kernel32.dll _GetModuleHandle dd offset GMHname _GetCurrentThreadId dd offset GCTIname _ExitProcess dd offset EPname tlen2 equ ($-tbl2) / 4 tlen equ ($-tbl) / 4 ; len equ $ - start ; ; *** , hInst dd ? ; hook dd ? ; stAddr dd ? ; end start :exit
рдкрд╛рда рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рдСрдкрд░реЗрд╢рди рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реИред рд╣рдо рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рддреАрди рднрд╛рдЧ рд╣реИрдВред рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рдХреНрд╡реАрди рдЯреЗрдХреНрд╕реНрдЯ рдмрдирддрд╛ рд╣реИ (рдпрд╛рдиреА рд╕реНрд░реЛрдд 1)ред рдПрдХрд▓ db рдирд┐рд░реНрджреЗрд╢ (рдЗрд╕рд▓рд┐рдП рд░рд╛рдиреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЪреМрдбрд╝рд╛рдИ) рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ bStr рд╕реНрдерд┐рд░рд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ - рдпрд╣ 25 рдкрд░ рд╕реЗрдЯ рд╣реИред рдЪреВрдВрдХрд┐ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рдПрдкреАрдЖрдИ рдлрд╝рдВрдХреНрд╢рди рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрддреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ GetProcAddress рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рд╣реИ, рдЬреЛ рдХрд░реНрдиреЗрд▓ 32.dll рдореЙрдбреНрдпреВрд▓ рдирд┐рд░реНрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдлрд┐рд░, GetProcAddress рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдмрд╛рдХреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрддреЗред рдЕрдВрдд рдореЗрдВ, рддреАрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ, рдХреНрд╡рд╛рди рд╕рдВрджреЗрд╢рдмреЙрдХреНрд╕ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рд╣реИред рдЪреВрдВрдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрд╛рда рд╕реНрдерд┐рд░ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд╣реАрдВ рднреА рдХреЙрдкреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реБрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╡рд┐рдВрдбреЛ рд╕реЗ рдкрд╛рда рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХреНрд╡реАрди рдХреЗ рддреАрд╕рд░реЗ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрджреЗрд╢ рдХрддрд╛рд░ рдмрдирд╛рдХрд░ рдФрд░ рдПрдХ рд╡рд┐рдВрдбреЛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдХрд░ред
рддреЛ, рд╕реНрд░реЛрдд 2 (рдЬреЛ рдХрд┐ рдХреНрд╡реАрди рдирд╣реАрдВ рд╣реИ) рдХреЛ рдмреИрдЪ рдлрд╝рд╛рдЗрд▓ quine.cmd рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ quine.exe рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд▓рд╛, quine.exe рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдВрдбреЛ рд╕реЗ, рдорд╛рдЙрд╕ рдЪрдпрдирд┐рдд рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ quine.asm рдлрд╝рд╛рдЗрд▓ рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВред рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, quine.asm рдореЗрдВ - рдПрдХ рдкреВрд░реНрдг рдХреНрд╡реАрди (рд╕реНрд░реЛрдд 1 рджреЗрдЦреЗрдВ)ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╕рд╛рд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
ml / c / coff quine.asm
рд▓реЗрдХрд┐рди рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ
рд▓рд┐рдВрдХ / рд╕рдмрд╕рд┐рд╕реНрдЯрдо: рд╡рд┐рдВрдбреЛрдЬрд╝ / рд╕реЗрдиреЗрдЯрд░:ред рдЯреЗрдХреНрд╕реНрдЯ / рдЖрд░рдбрдмреНрд▓реНрдпреВ рдХреНрд╡реАрди.рдмреЙрдЬ
(рд░рд╛рдЗрдЯ рдХреЛ рдХреЛрдб рд╕реЗрдХреНрд╢рди рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП)ред рдХреЛрдб рдХрд╛ рд▓реЗрди рдЕрдиреБрднрд╛рдЧ 820 рдмрд╛рдЗрдЯреНрд╕ рдерд╛ред
рдореИрдВрдиреЗ рдПрдХ рдЯрд░реНрдмреЛ рдбрд┐рдмрдЧрд░ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдбрд┐рдмрдЧ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд▓рд╛рдЗрди рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛
ExitProcess, 0 рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░реЗрдВ
рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ (рдЖрдк рдХреЛрдИ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ), рдФрд░ рд▓рд╛рдЗрди
\ masm32 \ рд╢рд╛рдорд┐рд▓ \ \ рдХрд░реНрдиреЗрд▓ 32.inc
рдЗрдирдХреЗрд▓реАрдм \ masm32 \ lib \ k рдЧрд┐рд░реНрд▓ 32.рд▓рд┐рдм
рдЕрдиреНрдпрдерд╛, рдбрд┐рдмрдЧрд░ рдлреНрд░реАрдЬрд╝ рдХрд░рддрд╛ рд╣реИ - рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдгред