рдпрд╣ рд▓реЗрдЦ рдПрдХ рдирд┐: рд╢реБрд▓реНрдХ рдЕрдиреБрд╡рд╛рдж рд╣реИред рдореВрд▓
рдпрд╣рд╛рдБ рд╣реИ ред
рдкрд░рд┐рдЪрдп
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд░рд╣рд╕реНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдзреБрдирд┐рдХ рд╡реЗрдм рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рдЬреЗрдПрд╕ рдХреЛрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝ рд░рд╣реА рд╣реИред рд╣рд╛рд▓ рддрдХ рддрдХ, рдХреНрд▓рд╛рдЗрдВрдЯ рднрд╛рдЧ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЦрд░реЛрдВрдЪ рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХреА рдЧрдИ рдереА рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдереАред рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рдХрд┐ рд╣рдореЗрдВ рдмрд╛рд░-рдмрд╛рд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдкрдбрд╝рд╛ред
рд╣рд░ рдХреЛрдИ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ MVC рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб JS рдХреЛрдб рдЕрдХреНрд╕рд░ рдЦрд░рд╛рдм рд╕рдВрд░рдЪрд┐рдд рд╣реЛрддрд╛ рд╣реИред
рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк backbone.js, underscore.js рдФрд░ jQuery рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╕рдорд╛рдзрд╛рди рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди
рд╣рдо рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рдХреИрд╕реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ? рдпрд╣рд╛рдБ рдореБрдЦреНрдп рдмрд┐рдВрджреБ рд╣реИрдВ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ:
- рд╣рдорд╛рд░реЗ рдбреЛрдореЗрди рдореЙрдбрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
- рдпрджрд┐ рдореЙрдбрд▓ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдореЙрдбрд▓ рдореЗрдВ рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдХреЛ рддреБрд░рдВрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
- MVC- рд╢реИрд▓реА рдХреЛрдб рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЖрд╕рд╛рди рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд░рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди "рдореВрд╡реА рдХреИрдЯрд▓реЙрдЧ" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рдЙрдкрдХрд░рдг
рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
рдПрдХ рдирдЬрд╝рд░ backbone.js рдкрд░
рдЗрд╕ рдврд╛рдВрдЪреЗ рдХрд╛ рдХрд╛рд░реНрдп рдЖрдкрдХреЛ рд╡рд┐рдЬреЗрдЯреНрд╕ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдирд╣реАрдВ рджреЗрдирд╛ рд╣реИ, рдФрд░ рдкреНрд░рд╕реНрддреБрддрд┐ рдХрд╛ рд╕реНрддрд░ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдирд╣реАрдВ рд╣реИ (рджреЗрдЦреЗрдВ)ред рдЗрд╕рдХрд╛ рдХрд╛рдо рдЖрдкрдХреЛ рдХреБрдЫ рдкреНрд░рдореБрдЦ рд╡рд╕реНрддреБрдПрдВ рджреЗрдирд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред
рд╣рдореЗрдВ рдореЙрдбрд▓, рд╕рдВрдЧреНрд░рд╣, рджреГрд╢реНрдп рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рд╡рд╕реНрддреБрдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдЖрджрд░реНрд╢
рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдореЙрдбрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛрдб рд▓рд┐рдЦреЗрдВ:
var Movie = Backbone.Model.extend({});
рдЕрдм рд╣рдо рд╡рд╕реНрддреБ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдордирдорд╛рдирд╛ рдЧреБрдг рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
matrix = new Movie(); matrix.set({ title: "The Matrix", format: "dvd' }); matrix.get('title');
рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп рдЖрдк рд╕реАрдзреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рднреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ:
matrix = new Movie({ title: "The Matrix", format: "dvd' });
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдореЙрдбрд▓ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп рдЖрдк рдХреБрдЫ рдЪреЗрдХ рдпрд╛ рдЕрдиреНрдп рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдЖрд░рдВрдн рдХрд░рдирд╛ ()ред рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп, рдпрд╣ рдЙрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдЖрдкрдиреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдерд╛ред
var Movie = Backbone.Model.extend({ initialize: function (spec) { if (!spec || !spec.title || !spec.format) { throw "InvalidConstructArgs"; } } });
рдЖрдк рдПрдХ рдорд╛рдиреНрдп () рд╡рд┐рдзрд┐ рдХреЛ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдХреБрдЫ рднреА рд▓реМрдЯрд╛рддреА рд╣реИ, рддреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ:
var Movie = Backbone.Model.extend({ validate: function (attrs) { if (attrs.title) { if (!_.isString(attrs.title) || attrs.title.length === 0 ) { return " "; } } } });
рд░реАрдврд╝ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдзрд┐рдХ рдкреВрд░реНрдг рдкрд░рд┐рдЪрд┐рдд рдХреЗ рд▓рд┐рдП, рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк
рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рд╕рдВрдЧреНрд░рд╣
рдмреИрдХрдмреЛрди рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореЙрдбрд▓ рдХреА рдПрдХ рдХреНрд░рдордмрджреНрдз рд╕реВрдЪреА рд╣реИред рдПрдХ рдирд┐рдпрдорд┐рдд рд╕рд░рдгреА рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕рдВрдЧреНрд░рд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддреБрд▓рдирд┐рддреНрд░ () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫрдВрдЯрдиреА рдирд┐рдпрдо рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ред
рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдореЙрдбрд▓ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╡рд╣рд╛рдБ рдПрдХ рд╡рд╕реНрддреБ рдЬреЛрдбрд╝рдирд╛ рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рджрд┐рдЦрддрд╛ рд╣реИ:
var MovieList = Backbone.Collection.extend({ model: Movie }); var library = new MovieList(); library.add({ title: "The Big Lebowski", format: "VHS" });
рдХреА рдкреНрд░рд╕реНрддреБрддрд┐
рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдмреИрдХрдмреЛрди рджреГрд╢реНрдп рдХрд┐рд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдореЙрдбрд▓ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдбреЛрдо рд╣реЗрд░рдлреЗрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ jQuery рдЦреЗрд▓ рдореЗрдВ рдЖрддрд╛ рд╣реИред DOM рдореЗрдВ рдореЙрдбрд▓ рдХреЗ рд╢реБрд░реБрдЖрддреА рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЗрдВрдЬрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╣рдо ICanHaz.js + рдореВрдВрдЫреЗрдВ.js рдмрдВрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ
рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреГрд╢реНрдп рд╣реИ:
var MovieView = Backbone.View.extend({ render: function() { var context = _.extend(this.model.toJSON(), {cid: this.model.cid}); this.el = ich.movie(context); return this; } });
рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛
рдЕрдм рддрдХ, рд╣рдордиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереА, рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдореЗрдВ рдХреИрд╕реЗ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдирд┐рдпрдВрддреНрд░рдХ
рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ, рд╣рдо рдЖрд╡реЗрджрди рдХреЗ рд╕рднреА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╣реЗрд░рдлреЗрд░ рдХреЗ рд▓рд┐рдП рдкрде рдФрд░ рдЙрдирд╕реЗ рдЬреБрдбрд╝реЗ рддрд░реАрдХреЛрдВ рдХрд╛ рднреА рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдВрдЧреЗред
var MovieAppController = Backbone.Controller.extend({ initialize: function(params) { this.model = new MovieAppModel(); this.view = new MovieAppView({ model: this.model }); params.append_at.append(this.view.render().el); }, routes: { "movie/add": "add", "movie/remove/:number": "remove", }, add: function() { app.model.movies.add(new Movie({ title: 'The Martix' + Math.floor(Math.random()*11), format: 'dvd' }));
рдпрд╣рд╛рдВ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЙрдбрд▓ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рдЬреЛ рдЕрдиреНрдп рд╕рднреА рдореЙрдбрд▓ рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛, рд╕рд╛рде рд╣реА рдЖрд╡реЗрджрди рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рднреАред
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЙрдбрд▓ рдлрд┐рд▓реНрдореЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛:
var MovieAppModel = Backbone.Model.extend({ initialize: function() { this.movies = new MovieList(); } });
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреГрд╢реНрдп рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
var MovieAppView = Backbone.View.extend({ initialize: function() { _.bindAll(this, "addMovie", "removeMovie"); this.model.movies.bind('add', this.addMovie); this.model.movies.bind('remove', this.removeMovie); }, render: function() { $(this.el).html(ich.app(this.model.toJSON())); this.movieList = this.$('#movieList'); return this; }, addMovie: function(movie) { var view = new MovieView({model: movie}); this.movieList.append(view.render().el); }, removeMovie: function(movie) { this.$('#movie_' + movie.cid).remove(); } });
рдареАрдХ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕реВрдЪрдХрд╛рдВрдХ рдлрд╝рд╛рдЗрд▓:
<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Movie App</title> <script src="js/lib/jquery.js"></script> <script src="js/lib/underscore.js"></script> <script src="js/lib/backbone.js"></script> <script src="js/lib/mustache.js"></script> <script src="js/lib/ICanHaz.js"></script> <script src="js/app/Movie.js"></script> <script src="js/app/MovieCollection.js"></script> <script src="js/app/MovieView.js"></script> <script src="js/app/MovieAppModel.js"></script> <script src="js/app/MovieAppView.js"></script> <script src="js/app/MovieAppController.js"></script> <script type="text/javascript"> $(function() { var movieApp = new MovieAppController({append_at: $('body')}); window.app = movieApp; Backbone.history.start(); }); </script> <script id="app" type="text/html"> <h1>Movie App</h1> <a href="#movie/add">add new movie</a> <ul id="movieList"></ul> </script> <script id="movie" type="text/html"> <li id="movie_{{ cid }}"><span class="title">{{ title }}</span> <span>{{ format }}</span> <a href="#movie/remove/{{ cid }}">x</a></li> </script> </head> <body> </body> </html>
рдкреВрд░рд╛ рдЖрд╡реЗрджрди рддреИрдпрд╛рд░ рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХрд╛ рдПрдХ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬреЛ рдпреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдЗрди рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рд╛рдж рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред