From 0fa71d8d8f4d9aa0873f6dfe6e3749ab0c0fa5d3 Mon Sep 17 00:00:00 2001 From: Tomasz Wlostowski Date: Tue, 1 Mar 2016 14:26:08 +0100 Subject: [PATCH 1/6] more accurate pushout force calculation for circle-segment collisions --- common/geometry/shape_collisions.cpp | 22 +++++++++++++++++----- include/geometry/shape_circle.h | 2 +- include/geometry/shape_segment.h | 2 +- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/common/geometry/shape_collisions.cpp b/common/geometry/shape_collisions.cpp index bb4f330a1d..773dcc9a2d 100644 --- a/common/geometry/shape_collisions.cpp +++ b/common/geometry/shape_collisions.cpp @@ -121,14 +121,26 @@ static inline bool Collide( const SHAPE_RECT& aA, const SHAPE_CIRCLE& aB, int aC static VECTOR2I pushoutForce( const SHAPE_CIRCLE& aA, const SEG& aB, int aClearance ) { - VECTOR2I nearest = aB.NearestPoint( aA.GetCenter() ); - VECTOR2I f (0, 0); + VECTOR2I f( 0, 0 ); - int dist = ( nearest - aA.GetCenter() ).EuclideanNorm(); - int min_dist = aClearance + aA.GetRadius(); + const VECTOR2I c = aA.GetCenter(); + const VECTOR2I nearest = aB.NearestPoint( c ); + + const int r = aA.GetRadius(); + + int dist = ( nearest - c ).EuclideanNorm(); + int min_dist = aClearance + r; if( dist < min_dist ) - f = ( aA.GetCenter() - nearest ).Resize ( min_dist - dist + 10 ); + { + for( int corr = 0; corr < 5; corr++ ) + { + f = ( aA.GetCenter() - nearest ).Resize( min_dist - dist + corr ); + + if( aB.Distance( c + f ) >= min_dist ) + break; + } + } return f; } diff --git a/include/geometry/shape_circle.h b/include/geometry/shape_circle.h index 700f61d860..a915ef97ce 100644 --- a/include/geometry/shape_circle.h +++ b/include/geometry/shape_circle.h @@ -63,7 +63,7 @@ public: { int rc = aClearance + m_radius; - return aSeg.Distance( m_center ) <= rc; + return aSeg.Distance( m_center ) < rc; } void SetRadius( int aRadius ) diff --git a/include/geometry/shape_segment.h b/include/geometry/shape_segment.h index 217368e72f..71ed5b17c4 100644 --- a/include/geometry/shape_segment.h +++ b/include/geometry/shape_segment.h @@ -59,7 +59,7 @@ public: bool Collide( const VECTOR2I& aP, int aClearance = 0 ) const { - return m_seg.Distance( aP ) <= ( m_width + 1 ) / 2 + aClearance; + return m_seg.Distance( aP ) < ( m_width + 1 ) / 2 + aClearance; } void SetSeg( const SEG& aSeg ) From 624c508ddac15ea4d7de104face3b61d433f37d7 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Tue, 1 Mar 2016 14:37:15 +0100 Subject: [PATCH 2/6] Fix an issue relative to the env vars initializations on Linux: they are not initialized if the value contains any non ASCII7 char, and if the locale is not set. The locale is now set before reading the env vars configuration. --- common/pgm_base.cpp | 47 ++++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/common/pgm_base.cpp b/common/pgm_base.cpp index fe6890ef8c..e0936e550b 100644 --- a/common/pgm_base.cpp +++ b/common/pgm_base.cpp @@ -488,10 +488,13 @@ bool PGM_BASE::initPgm() ReadPdfBrowserInfos(); // needs m_common_settings - loadCommonSettings(); - + // Init user language *before* calling loadCommonSettings, because + // env vars could be incorrectly initialized on Linux + // (if the value contains some non ASCII7 chars, the env var is not initialized) SetLanguage( true ); + loadCommonSettings(); + // Set locale option for separator used in float numbers SetLocaleTo_Default(); @@ -553,23 +556,8 @@ void PGM_BASE::loadCommonSettings() m_help_size.x = 500; m_help_size.y = 400; - wxString languageSel; - - m_common_settings->Read( languageCfgKey, &languageSel ); - setLanguageId( wxLANGUAGE_DEFAULT ); - m_common_settings->Read( showEnvVarWarningDialog, &m_show_env_var_dialog ); - // Search for the current selection - for( unsigned ii = 0; ii < DIM( s_Languages ); ii++ ) - { - if( s_Languages[ii].m_Lang_Label == languageSel ) - { - setLanguageId( s_Languages[ii].m_WX_Lang_Identifier ); - break; - } - } - m_editor_name = m_common_settings->Read( wxT( "Editor" ) ); wxString entry, oldPath; @@ -629,6 +617,26 @@ bool PGM_BASE::SetLanguage( bool first_time ) { bool retv = true; + if( first_time ) + { + setLanguageId( wxLANGUAGE_DEFAULT ); + // First time SetLanguage is called, the user selected language id is set + // from commun user config settings + wxString languageSel; + + m_common_settings->Read( languageCfgKey, &languageSel ); + + // Search for the current selection + for( unsigned ii = 0; ii < DIM( s_Languages ); ii++ ) + { + if( s_Languages[ii].m_Lang_Label == languageSel ) + { + setLanguageId( s_Languages[ii].m_WX_Lang_Identifier ); + break; + } + } + } + // dictionary file name without extend (full name is kicad.mo) wxString dictionaryName( wxT( "kicad" ) ); @@ -652,9 +660,12 @@ bool PGM_BASE::SetLanguage( bool first_time ) GetChars( dictionaryName ), GetChars( m_locale->GetName() ) ); } - // how about a meaningful comment here. if( !first_time ) { + // If we are here, the user has selected an other language. + // Therefore the new prefered language name is stored in common config. + // Do NOT store the wxWidgets language Id, it can change between wxWidgets + // versions, for a given language wxString languageSel; // Search for the current selection From c7fecfa69ef5752d621b48d85a76210c5c847cb5 Mon Sep 17 00:00:00 2001 From: Chris Pavlina Date: Tue, 1 Mar 2016 09:39:17 -0500 Subject: [PATCH 3/6] Fix character encoding of two source files These had quotes and dashes from Windows-1252, replaced with ASCII --- gerbview/class_X2_gerber_attributes.cpp | 10 +++++----- gerbview/class_X2_gerber_attributes.h | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/gerbview/class_X2_gerber_attributes.cpp b/gerbview/class_X2_gerber_attributes.cpp index 52d59b19e8..0e08195ddd 100644 --- a/gerbview/class_X2_gerber_attributes.cpp +++ b/gerbview/class_X2_gerber_attributes.cpp @@ -35,7 +35,7 @@ * %TF.FileFunction,Copper,L1,Top*% * * Currently: - * .FileFunction .FileFunction Identifies the files function in the PCB. + * .FileFunction .FileFunction Identifies the file's function in the PCB. * Other Standard Attributes, not yet used in Gerbview: * .Part Identifies the part the file represents, e.g. a single PCB * .MD5 Sets the MD5 file signature or checksum. @@ -46,8 +46,8 @@ /* * class X2_ATTRIBUTE - * The attribute value consists of a number of substrings separated by a , -*/ + * The attribute value consists of a number of substrings separated by a "," + */ X2_ATTRIBUTE::X2_ATTRIBUTE() { @@ -162,8 +162,8 @@ bool X2_ATTRIBUTE::ParseAttribCmd( FILE* aFile, char *aBuffer, int aBuffSize, ch * Corresponding position substring: * Copper layer: L1, L2, L3...to indicate the layer position followed by Top, Inr or * Bot. L1 is always the top copper layer. E.g. L2,Inr. - * Extra layer, e.g. solder mask: Top or Bot defines the attachment of the layer. - * Drill/rout layer: E.g. 1,4 where 1 is the start and 4 is the end copper layer. The + * Extra layer, e.g. solder mask: Top or Bot - defines the attachment of the layer. + * Drill/rout layer: E.g. 1,4 - where 1 is the start and 4 is the end copper layer. The * pair 1,4 defines the span of the drill/rout file * Optional index. This can be used in instances where for example there are two solder * masks on the same side. The index counts from the PCB surface outwards. diff --git a/gerbview/class_X2_gerber_attributes.h b/gerbview/class_X2_gerber_attributes.h index cdd68b558f..fe77535b27 100644 --- a/gerbview/class_X2_gerber_attributes.h +++ b/gerbview/class_X2_gerber_attributes.h @@ -38,7 +38,7 @@ * %TF.FileFunction,Copper,L1,Top*% * * Currently: - * .FileFunction .FileFunction Identifies the files function in the PCB. + * .FileFunction .FileFunction Identifies the file's function in the PCB. * Other Standard Attributes, not yet used in Gerbview: * .Part Identifies the part the file represents, e.g. a single PCB * .MD5 Sets the MD5 file signature or checksum. @@ -48,7 +48,7 @@ /** * class X2_ATTRIBUTE - * The attribute value consists of a number of substrings separated by a , + * The attribute value consists of a number of substrings separated by a "," */ class X2_ATTRIBUTE @@ -138,8 +138,8 @@ public: * Corresponding position substring: * Copper layer: L1, L2, L3...to indicate the layer position followed by Top, Inr or * Bot. L1 is always the top copper layer. E.g. L2,Inr. - * Extra layer, e.g. solder mask: Top or Bot defines the attachment of the layer. - * Drill/rout layer: E.g. 1,4 where 1 is the start and 4 is the end copper layer. The + * Extra layer, e.g. solder mask: Top or Bot - defines the attachment of the layer. + * Drill/rout layer: E.g. 1,4 - where 1 is the start and 4 is the end copper layer. The * pair 1,4 defines the span of the drill/rout file * Optional index. This can be used in instances where for example there are two solder * masks on the same side. The index counts from the PCB surface outwards. From eea52027cc686477b2ec515df09c0bc7ea623244 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 1 Mar 2016 16:55:44 +0100 Subject: [PATCH 4/6] Use _WIN32 instead of __MINGW32__ in 2 conditional compilations which are Windows specific, not especially mingw32 specific. --- include/import_export.h | 2 +- include/kiway.h | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/include/import_export.h b/include/import_export.h index c31729eb30..672709f470 100644 --- a/include/import_export.h +++ b/include/import_export.h @@ -28,7 +28,7 @@ /// Macros which export functions from a DLL/DSO. /// See: http://gcc.gnu.org/wiki/Visibility -#if defined(__MINGW32__) +#if defined(_WIN32) #define APIEXPORT __declspec(dllexport) #define APIIMPORT __declspec(dllimport) #define APILOCAL diff --git a/include/kiway.h b/include/kiway.h index 406ab91f79..347c0bb92e 100644 --- a/include/kiway.h +++ b/include/kiway.h @@ -118,8 +118,10 @@ as such! As such, it is OK to use UTF8 characters: #define LIB_ENV_VAR wxT( "LD_LIBRARY_PATH" ) #elif defined(__WXMAC__) #define LIB_ENV_VAR wxT( "DYLD_LIBRARY_PATH" ) -#elif defined(__MINGW32__) +#elif defined(_WIN32) #define LIB_ENV_VAR wxT( "PATH" ) +#else + #error Platform support missing #endif From 59f6a720f08b536063a81256dbc6b382953a02ae Mon Sep 17 00:00:00 2001 From: Bernhard Stegmaier Date: Tue, 1 Mar 2016 15:19:00 -0500 Subject: [PATCH 5/6] Fix touchpad scrolling on OSX. --- common/draw_panel.cpp | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/common/draw_panel.cpp b/common/draw_panel.cpp index eabe08217b..6d2048989c 100644 --- a/common/draw_panel.cpp +++ b/common/draw_panel.cpp @@ -980,12 +980,7 @@ void EDA_DRAW_PANEL::OnMouseWheel( wxMouseEvent& event ) else if( wheelRotation > 0 ) { if( event.ShiftDown() && !event.ControlDown() ) - { - if( axis == 0 ) - cmd.SetId( ID_PAN_UP ); - else - cmd.SetId( ID_PAN_RIGHT ); - } + cmd.SetId( ID_PAN_UP ); else if( event.ControlDown() && !event.ShiftDown() ) cmd.SetId( ID_PAN_LEFT ); else if( offCenterReq ) @@ -996,12 +991,7 @@ void EDA_DRAW_PANEL::OnMouseWheel( wxMouseEvent& event ) else if( wheelRotation < 0 ) { if( event.ShiftDown() && !event.ControlDown() ) - { - if( axis == 0 ) - cmd.SetId( ID_PAN_DOWN ); - else - cmd.SetId( ID_PAN_LEFT ); - } + cmd.SetId( ID_PAN_DOWN ); else if( event.ControlDown() && !event.ShiftDown() ) cmd.SetId( ID_PAN_RIGHT ); else if( offCenterReq ) From 8dc0a33cc70016eff4fbe56fab505f7d68812d0f Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Thu, 3 Mar 2016 18:51:38 +0100 Subject: [PATCH 6/6] Remove a old useless font file (the Cyrillic fonte is, since a long time, in the current font file) --- common/pgm_base.cpp | 4 +- include/HersheyCyrillic.h.unused | 70 -------------------------------- 2 files changed, 2 insertions(+), 72 deletions(-) delete mode 100644 include/HersheyCyrillic.h.unused diff --git a/common/pgm_base.cpp b/common/pgm_base.cpp index e0936e550b..bbab313107 100644 --- a/common/pgm_base.cpp +++ b/common/pgm_base.cpp @@ -668,7 +668,7 @@ bool PGM_BASE::SetLanguage( bool first_time ) // versions, for a given language wxString languageSel; - // Search for the current selection + // Search for the current selection language name for( unsigned ii = 0; ii < DIM( s_Languages ); ii++ ) { if( s_Languages[ii].m_WX_Lang_Identifier == m_language_id ) @@ -681,7 +681,7 @@ bool PGM_BASE::SetLanguage( bool first_time ) m_common_settings->Write( languageCfgKey, languageSel ); } - // Test if floating point notation is working (bug in cross compilation, using wine) + // Test if floating point notation is working (bug encountered in cross compilation) // Make a conversion double <=> string double dtst = 0.5; wxString msg; diff --git a/include/HersheyCyrillic.h.unused b/include/HersheyCyrillic.h.unused deleted file mode 100644 index 18b17005a8..0000000000 --- a/include/HersheyCyrillic.h.unused +++ /dev/null @@ -1,70 +0,0 @@ -/* Hershey Cyrillic definition - * First shape has unicode value 0x410 -*/ -const static char* hershey_cyrillic[] = -{ - "H\\RFK[ RRFY[ RRIX[ RMUVU RI[O[ RU[[[", - "G]LFL[ RMFM[ RIFYFYLXF RMPUPXQYRZTZWYYXZU[I[ RUPWQXRYTYWXYWZU[", - "G]LFL[ RMFM[ RIFUFXGYHZJZLYNXOUP RUFWGXHYJYLXNWOUP RMPUPXQYRZTZWYYXZU[I[ RUPWQXRYTYWXYWZU[", - "I[NFN[ ROFO[ RKFZFZLYF RK[R[", - "F^NFNLMTLXKZJ[ RXFX[ RYFY[ RKF\\F RG[\\[ RG[Gb RH[Gb R[[\\b R\\[\\b", - "G\\LFL[ RMFM[ RSLST RIFYFYLXF RMPSP RI[Y[YUX[", - "CbRFR[ RSFS[ ROFVF RGGHHGIFHFGGFHFIGJIKMLONPWPYOZM[I\\G]F^F_G_H^I]H^G RNPLQKSJXIZH[ RNPMQLSKXJZI[G[FZEX RWPYQZS[X\\Z][ RWPXQYSZX[Z\\[^[_Z`X RO[V[", - "H\\LIKFKLLINGPFTFWGXIXLWNTOQO RTFVGWIWLVNTO RTOVPXRYTYWXYWZT[O[MZLYKWKVLUMVLW RWQXTXWWYVZT[", - "F^KFK[ RLFL[ RXFX[ RYFY[ RHFOF RUF\\F RXHLY RH[O[ RU[\\[", - "F^KFK[ RLFL[ RXFX[ RYFY[ RHFOF RUF\\F RXHLY RH[O[ RU[\\[ RN@N?M?M@NBPCTCVBW@", - "F^KFK[ RLFL[ RHFOF RLPSPUOVMWIXGYFZF[G[HZIYHZG RSPUQVSWXXZY[ RSPTQUSVXWZX[Z[[Z\\X RH[O[", - "E^MFMLLTKXJZI[H[GZGYHXIYHZ RXFX[ RYFY[ RJF\\F RU[\\[", - "F_KFK[ RLFRX RKFR[ RYFR[ RYFY[ RZFZ[ RHFLF RYF]F RH[N[ RV[][", - "F^KFK[ RLFL[ RXFX[ RYFY[ RHFOF RUF\\F RLPXP RH[O[ RU[\\[", - "G]QFNGLIKKJOJRKVLXNZQ[S[VZXXYVZRZOYKXIVGSFQF RQFOGMILKKOKRLVMXOZQ[ RS[UZWXXVYRYOXKWIUGSF", - "F^KFK[ RLFL[ RXFX[ RYFY[ RHF\\F RH[O[ RU[\\[", - "G]LFL[ RMFM[ RIFUFXGYHZJZMYOXPUQMQ RUFWGXHYJYMXOWPUQ RI[P[", - "G\\XIYLYFXIVGSFQFNGLIKKJNJSKVLXNZQ[S[VZXXYV RQFOGMILKKNKSLVMXOZQ[", - "I\\RFR[ RSFS[ RLFKLKFZFZLYF RO[V[", - "H]KFRV RLFSV RZFSVQYPZN[M[LZLYMXNYMZ RIFOF RVF\\F", - "F_RFR[ RSFS[ ROFVF RPILJJLIOIRJULWPXUXYW[U\\R\\O[LYJUIPI RPIMJKLJOJRKUMWPX RUXXWZU[R[OZLXJUI RO[V[", - "H\\KFX[ RLFY[ RYFK[ RIFOF RUF[F RI[O[ RU[[[", - "F^KFK[ RLFL[ RXFX[ RYFY[ RHFOF RUF\\F RH[\\[ R[[\\b R\\[\\b", - "F]KFKQLSOTRTUSWQ RLFLQMSOT RWFW[ RXFX[ RHFOF RTF[F RT[[[", - "BcGFG[ RHFH[ RRFR[ RSFS[ R]F][ R^F^[ RDFKF ROFVF RZFaF RD[a[", - "BcGFG[ RHFH[ RRFR[ RSFS[ R]F][ R^F^[ RDFKF ROFVF RZFaF RD[a[ R`[ab Ra[ab", - "F`PFP[ RQFQ[ RIFHLHFTF RQPXP[Q\\R]T]W\\Y[ZX[M[ RXPZQ[R\\T\\W[YZZX[", /* Ъ */ - "CaHFH[ RIFI[ REFLF RIPPPSQTRUTUWTYSZP[E[ RPPRQSRTTTWSYRZP[ R[F[[ R\\F\\[ RXF_F RX[_[", /* Ы */ - "H]MFM[ RNFN[ RJFQF RNPUPXQYRZTZWYYXZU[J[ RUPWQXRYTYWXYWZU[", /* Ь */ - "H]LIKFKLLINGQFSFVGXIYKZNZSYVXXVZS[P[MZLYKWKVLUMVLW RSFUGWIXKYNYSXVWXUZS[ RPPYP", /* Э */ - "CbHFH[ RIFI[ REFLF RE[L[ RVFSGQIPKOOORPVQXSZV[X[[Z]X^V_R_O^K]I[GXFVF RVFTGRIQKPOPRQVRXTZV[ RX[ZZ\\X]V^R^O]K\\IZGXF RIPOP", /* Ю */ - "G]WFW[ RXFX[ R[FOFLGKHJJJLKNLOOPWP ROFMGLHKJKLLNMOOP RRPPQORLYKZJZIY RPQOSMZL[J[IYIX RT[[[", /* Я */ - "I]NONPMPMONNPMTMVNWOXQXXYZZ[ RWOWXXZZ[[[ RWQVRPSMTLVLXMZP[S[UZWX RPSNTMVMXNZP[", /* letter */ - "H\\XFWGQINKLNKQKULXNZQ[S[VZXXYUYSXPVNSMQMNNLPKS RXFWHUIQJNLLN RQMONMPLSLUMXOZQ[ RS[UZWXXUXSWPUNSM", - "H\\MMM[ RNMN[ RJMUMXNYPYQXSUT RUMWNXPXQWSUT RNTUTXUYWYXXZU[J[ RUTWUXWXXWZU[", - "HZMMM[ RNMN[ RJMXMXRWM RJ[Q[", - "F]NMNQMWLZK[ RWMW[ RXMX[ RKM[M RI[H`H[[[[`Z[", - "H[LSXSXQWOVNTMQMNNLPKSKULXNZQ[S[VZXX RWSWPVN RQMONMPLSLUMXOZQ[", - "E`RMR[ RSMS[ ROMVM RJNIOHNIMJMKNMRNSPTUTWSXRZN[M\\M]N\\O[N RPTNUMVKZJ[ RPTNVLZK[I[HZGX RUTWUXVZZ[[ RUTWVYZZ[\\[]Z^X RO[V[", - "I[MOLMLQMONNPMTMWNXPXQWSTT RTMVNWPWQVSTT RQTTTWUXWXXWZT[P[MZLXLWMVNWMX RTTVUWWWXVZT[", - "G]LML[ RMMM[ RWMW[ RXMX[ RIMPM RTM[M RI[P[ RT[[[ RWNMZ", - "G]LML[ RMMM[ RWMW[ RXMX[ RIMPM RTM[M RI[P[ RT[[[ RWNMZ ROGOFNFNGOIQJSJUIVG", - "H\\MMM[ RNMN[ RJMQM RNTPTSSTRVNWMXMYNXOWN RPTSUTVVZW[ RPTRUSVUZV[X[YZZX RJ[Q[", - "G]NMNQMWLZK[J[IZJYKZ RWMW[ RXMX[ RKM[M RT[[[", - "G^LML[ RLMR[ RMMRY RXMR[ RXMX[ RYMY[ RIMMM RXM\\M RI[O[ RU[\\[", - "G]LML[ RMMM[ RWMW[ RXMX[ RIMPM RTM[M RMTWT RI[P[ RT[[[", - "H\\QMNNLPKSKULXNZQ[S[VZXXYUYSXPVNSMQM RQMONMPLSLUMXOZQ[ RS[UZWXXUXSWPUNSM", - "G]LML[ RMMM[ RWMW[ RXMX[ RIM[M RI[P[ RT[[[", - "G\\LMLb RMMMb RMPONQMSMVNXPYSYUXXVZS[Q[OZMX RSMUNWPXSXUWXUZS[ RIMMM RIbPb", - "H[WPVQWRXQXPVNTMQMNNLPKSKULXNZQ[S[VZXX RQMONMPLSLUMXOZQ[", - "I\\RMR[ RSMS[ RMMLRLMYMYRXM RO[V[", - "I[LMR[ RMMRY RXMR[P_NaLbKbJaK`La RJMPM RTMZM", - "H]RFRb RSFSb ROFSF RRPQNPMNMLNKQKWLZN[P[QZRX RNMMNLQLWMZN[ RWMXNYQYWXZW[ RSPTNUMWMYNZQZWYZW[U[TZSX RObVb", - "H\\LMW[ RMMX[ RXML[ RJMPM RTMZM RJ[P[ RT[Z[", - "G]LML[ RMMM[ RWMW[ RXMX[ RIMPM RTM[M RI[[[[`Z[", - "G]LMLTMVPWRWUVWT RMMMTNVPW RWMW[ RXMX[ RIMPM RTM[M RT[[[", - "CbHMH[ RIMI[ RRMR[ RSMS[ R\\M\\[ R]M][ REMLM ROMVM RYM`M RE[`[", - "CbHMH[ RIMI[ RRMR[ RSMS[ R\\M\\[ R]M][ REMLM ROMVM RYM`M RE[`[``_[", - "H]QMQ[ RRMR[ RLMKRKMUM RRTVTYUZWZXYZV[N[ RVTXUYWYXXZV[", /* ъ */ - "E_JMJ[ RKMK[ RGMNM RKTOTRUSWSXRZO[G[ ROTQURWRXQZO[ RYMY[ RZMZ[ RVM]M RV[][", /* ы */ - "J[OMO[ RPMP[ RLMSM RPTTTWUXWXXWZT[L[ RTTVUWWWXVZT[", /* ь */ - "H]LIKFKLLINGQFSFVGXIYKZNZSYVXXVZS[P[MZLYKWKVLUMVLW RSFUGWIXKYNYSXVWXUZS[ RPPYP", /* э */ - "DaIMI[ RJMJ[ RFMMM RF[M[ RVMSNQPPSPUQXSZV[X[[Z]X^U^S]P[NXMVM RVMTNRPQSQURXTZV[ RX[ZZ\\X]U]S\\PZNXM RJTPT", /* ю */ - "G\\VMV[ RWMW[ RZMOMLNKPKQLSOTVT ROMMNLPLQMSOT RTTQUPVNZM[ RTTRUQVOZN[L[KZJX RS[Z[" /* я */ -};