Socket.io-client: рдЦрд░рд╛рдм рд╣реИрдВрдбрд╢реЗрдХ рд╡рд┐рдзрд┐ (рдХреЗрд╡рд▓ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп!)

рдХреЛ рдирд┐рд░реНрдорд┐рдд 23 рдЬреВрди 2017  ┬╖  13рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: socketio/socket.io-client

рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐:

  • [x] рдПрдХ рдмрдЧ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдВ
  • [] рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ

рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░

рдореЗрд░реЗ рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЗрдбрд░ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ {"code":2,"message":"Bad handshake method"} рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде 400 рдорд┐рд▓рддрд╛ рд╣реИ (рдпрджрд┐ рдореИрдВ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рддреЛ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)ред

рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рдЪрд░рдг (рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдПрдХ рдмрдЧ рд╣реИ)

рдореИрдВ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдХреЛ рдирд┐рдореНрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ:

  const options = {
    transportOptions: {
      polling: {
        extraHeaders: {
          Authorization: "Bearer test"
        }
      }
    }
  };

рдореИрдВрдиреЗ рдпрд╣ рднреА рджреЗрдЦрд╛ рдХрд┐ рдЬрдм рдореИрдВ рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рд╢реАрд░реНрд╖рд▓реЗрдЦ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ рддреЛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬрдм рдореИрдВ рдЗрд╕реЗ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рддреЛ рдЬреАрдИрдЯреА рдХреЗ рдмрдЬрд╛рдп)

рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░

рд╣реИрдВрдбрд╢реЗрдХ рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЗрдбрд░ рдХреЗ рд╕рд╛рде рдПрдХ GET рдЕрдиреБрд░реЛрдз (рдХреБрдХреАрдЬрд╝ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рд╕реЗрдЯ рдЕрдк

  • рдУрдПрд╕: рдореИрдХ
  • рдмреНрд░рд╛рдЙрдЬрд╝рд░: рдХреНрд░реЛрдо 58
  • рд╕реЙрдХреЗрдЯ.рдЖрдИрдУ рд╕рдВрд╕реНрдХрд░рдг: 2.0.3

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдирдорд╕реНрддреЗ! рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкрд░ рдЙрдЪрд┐рдд рд╢реАрд░реНрд╖рд▓реЗрдЦ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ (рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рд╕реАрдУрдЖрд░рдПрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ):

const io = require('socket.io')(3000, {
  handlePreflightRequest: function (req, res) {
    var headers = {
      'Access-Control-Allow-Headers': 'Content-Type, Authorization',
      'Access-Control-Allow-Origin': 'http://localhost:3001',
      'Access-Control-Allow-Credentials': true
    };
    res.writeHead(200, headers);
    res.end();
  }
});

рдореИрдВрдиреЗ рд╡рд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝рд╛: https://github.com/darrachequesne/socket.io-fiddle/tree/extra-headers

рд╕рднреА 13 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╡рд╣реА рдореБрджреНрджрд╛, рдпрд╣рд╛рдВ .. рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реЙрдХреЗрдЯ рдХреЗ рдиреЛрдбрдЬ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЖрдИрдУ-рдХреНрд▓рд╛рдЗрдВрдЯ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдирд╣реАрдВ рд╣реИ

  • рдУрдПрд╕: рд╡рд┐рди
  • рдмреНрд░рд╛рдЙрдЬрд╝рд░: рдХреНрд░реЛрдо 59
  • рд╕реЙрдХреЗрдЯ.рдЖрдИрдУ рд╕рдВрд╕реНрдХрд░рдг: 2.0.3

рдирдорд╕реНрддреЗ! рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкрд░ рдЙрдЪрд┐рдд рд╢реАрд░реНрд╖рд▓реЗрдЦ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ (рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рд╕реАрдУрдЖрд░рдПрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ):

const io = require('socket.io')(3000, {
  handlePreflightRequest: function (req, res) {
    var headers = {
      'Access-Control-Allow-Headers': 'Content-Type, Authorization',
      'Access-Control-Allow-Origin': 'http://localhost:3001',
      'Access-Control-Allow-Credentials': true
    };
    res.writeHead(200, headers);
    res.end();
  }
});

рдореИрдВрдиреЗ рд╡рд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝рд╛: https://github.com/darrachequesne/socket.io-fiddle/tree/extra-headers

@darrachequesne рдореВрд▓ рдХреЗ рд▓рд┐рдП рдПрдХрд╛рдзрд┐рдХ рдбреЛрдореЗрди рдХреИрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

  1. 'рдкрд╣реБрдВрдЪ-рдирд┐рдпрдВрддреНрд░рдг-рдЕрдиреБрдорддрд┐ рджреЗрдВ-рдЙрддреНрдкрддреНрддрд┐': ' http://localhost :3001, http://localhost :3002'
  2. 'рдкрд╣реБрдВрдЪ-рдирд┐рдпрдВрддреНрд░рдг-рдЕрдиреБрдорддрд┐ рджреЗрдВ-рдЙрддреНрдкрддреНрддрд┐': [' http://localhost :3001, http://localhost :3002']
  3. 'рдкрд╣реБрдВрдЪ-рдирд┐рдпрдВрддреНрд░рдг-рдЕрдиреБрдорддрд┐ рджреЗрдВ-рдЙрддреНрдкрддреНрддрд┐': ' http://localhost :3001 http://localhost :3002'

@DaVincii рдЖрдк рдПрдХрд╛рдзрд┐рдХ рдбреЛрдореЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реЗрдбрд░ рдореВрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдЕрдкрдиреА рд╢реНрд╡реЗрддрд╕реВрдЪреА рдХреЛ

рд╕реНрдЯреИрдХреЛрд╡рдлреНрд▓реЛ рдкрд░ рдЗрд╕реЗ рдФрд░ рдпрд╣ рджреЗрдЦреЗрдВ

@DaVincii рдореИрдВрдиреЗ рд╢реВрдиреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдбреЛрдореЗрди рд╕реЗ рдореБрдХреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдХреЙрдиреНрд╕реНрдЯ рд╣реЗрдбрд░ = {
'рдкрд╣реБрдВрдЪ-рдирд┐рдпрдВрддреНрд░рдг-рдЕрдиреБрдорддрд┐ рджреЗрдВ-рд╢реАрд░реНрд╖рд▓реЗрдЦ': 'рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░, рдкреНрд░рд╛рдзрд┐рдХрд░рдг',
'рдкрд╣реБрдВрдЪ-рдирд┐рдпрдВрддреНрд░рдг-рдЕрдиреБрдорддрд┐ рджреЗрдВ-рдЙрддреНрдкрддреНрддрд┐': рд╢реВрдиреНрдп,
'рдкрд╣реБрдВрдЪ-рдирд┐рдпрдВрддреНрд░рдг-рдЕрдиреБрдорддрд┐ рджреЗрдВ-рдкреНрд░рдорд╛рдг-рдкрддреНрд░': рд╕рддреНрдп
};

рдХреЙрд░реНрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП
{
рд╣реИрдВрдбрд▓рдкреНрд░реАрдлреНрд▓рд╛рдЗрдЯ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ: рдлрдВрдХреНрд╢рди (рд░рд┐рдХ, рд░реЗрд╕) {
рд╡рд░ рд╣реЗрдбрд░ = {
'рдкрд╣реБрдВрдЪ-рдирд┐рдпрдВрддреНрд░рдг-рдЕрдиреБрдорддрд┐ рджреЗрдВ-рд╢реАрд░реНрд╖рд▓реЗрдЦ': 'рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░, рдкреНрд░рд╛рдзрд┐рдХрд░рдг',
'рдкрд╣реБрдВрдЪ-рдирд┐рдпрдВрддреНрд░рдг-рдЕрдиреБрдорддрд┐ рджреЗрдВ-рдЙрддреНрдкрддреНрддрд┐': req.headers.origin ,
'рдкрд╣реБрдВрдЪ-рдирд┐рдпрдВрддреНрд░рдг-рдЕрдиреБрдорддрд┐ рджреЗрдВ-рдкреНрд░рдорд╛рдг-рдкрддреНрд░': рд╕рддреНрдп
};
res.writeHead(200, рд╢реАрд░реНрд╖рд▓реЗрдЦ);
res.end ();
}
}

рдХреЙрд░реНрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП
{
рд╣реИрдВрдбрд▓рдкреНрд░реАрдлреНрд▓рд╛рдЗрдЯ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ: рдлрдВрдХреНрд╢рди (рд░рд┐рдХ, рд░реЗрд╕) {
рд╡рд░ рд╣реЗрдбрд░ = {
'рдкрд╣реБрдВрдЪ-рдирд┐рдпрдВрддреНрд░рдг-рдЕрдиреБрдорддрд┐ рджреЗрдВ-рд╢реАрд░реНрд╖рд▓реЗрдЦ': 'рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░, рдкреНрд░рд╛рдзрд┐рдХрд░рдг',
'рдкрд╣реБрдВрдЪ-рдирд┐рдпрдВрддреНрд░рдг-рдЕрдиреБрдорддрд┐ рджреЗрдВ-рдЙрддреНрдкрддреНрддрд┐': req.headers.origin ,
'рдкрд╣реБрдВрдЪ-рдирд┐рдпрдВрддреНрд░рдг-рдЕрдиреБрдорддрд┐ рджреЗрдВ-рдкреНрд░рдорд╛рдг-рдкрддреНрд░': рд╕рддреНрдп
};
res.writeHead(200, рд╢реАрд░реНрд╖рд▓реЗрдЦ);
res.end ();
}
}

'рдкрд╣реБрдВрдЪ-рдирд┐рдпрдВрддреНрд░рдг-рдЕрдиреБрдорддрд┐ рджреЗрдВ-рдЙрддреНрдкрддреНрддрд┐': req.headers.origin
рдЗрд╕рдиреЗ рдореЗрд░рд╛ рджрд┐рди рдмрдЪрд╛ рд▓рд┐рдпрд╛! рдЬрдм рдореИрдВрдиреЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛:
'рдкрд╣реБрдВрдЪ-рдирд┐рдпрдВрддреНрд░рдг-рдЕрдиреБрдорддрд┐ рджреЗрдВ-рдЙрддреНрдкрддреНрддрд┐': ' ',рдпрд╣ рдореБрдЭреЗ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рджреЗрдЧрд╛:"рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ 'рдкрд╣реБрдВрдЪ-рдирд┐рдпрдВрддреНрд░рдг-рдЕрдиреБрдорддрд┐-рдЙрддреНрдкрддреНрддрд┐' рд╢реАрд░реНрд╖рд▓реЗрдЦ рдХрд╛ рдорд╛рди рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ' ' рдЬрдм рдЕрдиреБрд░реЛрдз рдХрд╛ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдореЛрдб 'рд╢рд╛рдорд┐рд▓' рд╣реЛрддрд╛ рд╣реИред XMLHttpRequest рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдореЛрдб рдХреЛ withCredentials рд╡рд┐рд╢реЗрд╖рддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред ред"

рдпрд╣ рдЕрдм рдирд╡реАрдирддрдо socket.io рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕реЗ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╡реИрд╕реЗ рднреА рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП?
image

рдпрд╣ рдЕрдм рдирд╡реАрдирддрдо socket.io рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕реЗ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╡реИрд╕реЗ рднреА рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП?

@supertiger1234 handlePreflightRequest рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ

Screenshot 2020-07-20 at 20 16 00

рддреЛ рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

...
handlePreflightRequest: function(server, req, res) {
  var headers = {
    "Access-Control-Allow-Headers": "Content-Type, Authorization",
    "Access-Control-Allow-Origin": config.allowedOrigins,
    "Access-Control-Allow-Credentials": true,
  };

  res.writeHead(200, headers);
  res.end();
...

@supertiger1234 handlePreflightRequest рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ

я╕П рдпрджрд┐ рдЖрдк npm рд╕реЗ рдЕрднреА socket.io рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкреБрд░рд╛рдирд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЯрд╛рдЗрдкрд┐рдВрдЧ (@types рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЗрд╕рдореЗрдВ рдирдИ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╣реЛрдЧреА! рдЬреЛ рд╕реБрдкрд░ рднреНрд░рд╛рдордХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдирд╡реАрдирддрдо рд╕реЙрдХреЗрдЯ io рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реВрдВ?

рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП: рдпрд╣ рд╕рдорд╕реНрдпрд╛ рддрдм рднреА рд╣реЛрддреА рд╣реИ рдЬрдм рдПрдХ рдкреНрд░реА-3.0 рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдкреЛрд╕реНрдЯ-3.0 рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЧрд▓рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рдХреИрд╢ рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ socket.io.js рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред

рднрд╡рд┐рд╖реНрдп рдХреЗ рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ рджреЗрдЦреЗрдВ:

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

exilonX picture exilonX  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ledmago picture ledmago  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

yesterday24 picture yesterday24  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ahadcove picture ahadcove  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

BorntraegerMarc picture BorntraegerMarc  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ