Tìm hiểu về "trái tim" bên trong các trình duyệt

Tìm hiểu về "trái tim" bên trong các trình duyệt

Mạnh Cường  | 17/07/2011 12:00 PM

thích

Bạn đã sử dụng qua hầu hết các trình duyệt web như Firefox, Internet Explorer, Google Chrome hay Opera,... và cũng từng nghe đến những lời giới thiệu về engine cho các trình duyệt đó mỗi khi các hãng phát triển công bố phiên bản mới của chúng.

Vậy bạn có bao giờ tự hỏi chúng là gì và tại sao lại quan trọng đến như vậy không? Nếu đã từng có lần tự hỏi bản thân như thế thì thông qua bài viết ngắn này, bạn sẽ có được những thông tin hữu ích về trái tim của hầu hết các trình duyệt ngày nay.
 
Chúng ta sẽ bắt đầu với khái niệm engine của trình duyệt hay nói đầy đủ hơn là layout engine. Bạn có thể hiểu một cách đơn rằng nếu thiếu đi engine, website sẽ không thể biên dịch và lúc đó, những thứ trình bày cho người duyệt web chỉ là những đoạn mã mà nhà phát triển đã sử dụng để thiết kế website mà thôi.
 
Ngày nay, có bốn engine chi phối toàn bộ các ứng dụng duyệt web. Lần lượt chúng là Trident, Gecko, Webkit và Presto. Chúng ta sẽ đến với Trident trước tiên, engine thuộc sở hữu của đại gia Microsoft.
 
Trident được ra mắt đầu tiên vào năm 1997, thời điểm công bố phiên bản Internet Explorer 4 của Microsoft. Trident là một kiến trúc được Microsoft thiết kế nhằm tạo sự dễ dàng hơn cho các nhà phát triển muốn sử dụng engine này để tạo nên các sản phẩm khác.
 
 
Engine này được đóng gói thành một tập tin mshtml.dll giúp các nhóm phát triễn dễ dàng sử dụng. Mặc dù kiến trúc của Trident được chia thành nhiều tập tin mã nhị phân khác nhau, nhưng quan trọng nhất vẫn là mshtml.dll.
 
Mặc dù không công bố mã nguồn Trident, nhưng Microsoft hoàn toàn cho phép sử dụng miễn phí engine này, cũng vì thế mà ngày nay có khá nhiều trình duyệt web được phát triển dựa trên Trident, có thể kể ra những cái tên cũng khá nổi tiếng như Maxthon, Avant. Ngoài ra, những ứng dụng quen thuộc của Microsoft Outlook hay Outlook Express hay như Skype cũng sử dụng engine Trident nhằm biên dịch các đoạn mã HTML.
 
 
Bất cứ một layout engine nào cũng cần phải đáp ứng được các chuẩn của tổ chức World Wide Web Consortium (W3C), tổ chức được thành lập nhằm quản lý cũng như phát triển các chuẩn dành cho thế giới internet.
 
Với phiên bản Trident 5 dành cho Internet Explorer 8 và 9, engine này hoàn toàn có thể biên dịch các chuẩn internet mới như CSS3 và HTML5. Mặc dù với một số tổ chức mở rộng của CSS3 thì Trident 5 chưa thật sự hoàn chỉnh. Bên cạnh đó, với bài kiểm tra trình duyệt Acid2, Trident 5 cũng hoàn thành rất xuất sắc. Phiên bản Trident 6 dành cho Internet Explorer 10 được phát triển hỗ trợ HTML5 và CSS3 rất tốt.
 
 
Mặc dù rất mạnh và tiện dụng trong việc hỗ trợ phát triển ứng dụng. Nhưng Microsoft cũng không thể sử dụng Trident cho hệ điều Mac, điều này là dễ hiểu bởi cả hai nền tảng của cả hệ điều hành này là quá khác nhau. Microsoft đã phát triển một engine khác với tên gọi Tasman, vẫn dựa trên một số thành phần của Trident.
 
Tasman hoạt động hiệu quả tới mức mà vào thời điểm sắp ra mắt Internet Explorer 7, đã có tin đồn Tasman sẽ thay thế Trident nhưng điều này đã không xảy ra. Về sau, Microsoft đã thôi không dùng Tasman mà chuyển sang sử dụng WebKit cho phiên bản Microsoft Outlook dành cho MAC.
 
Tiếp đến là layout engine Gecko. Ban đầu là dự án được Netscape phát triển nhằm khắc phục những yếu kém của trình duyệt Netscape vào năm 1997. Tại thời điểm đó, trình duyệt Netscape hoàn toàn thua sút so với Internet Explorer của Microsoft và không thể đáp ứng các chuẩn của tổ chức W3C.
 
 
Ban đầu, Gecko có tên mã dự án là Raptor. Gecko phân chia thành hai phần quan trọng, một là Browser Engine, thành phần này bao gồm các phương thức khác nhau phục vụ cho việc tương tác của người dùng với trình duyệt. Theo cấu trúc thiết kế của Gecko, Browser Engine sẽ nhận mọi yêu cầu sử dụng từ phía người dùng, rồi sau đó sẽ đưa xuống cho thành phần thứ hai của layout engine này, có tên gọi Rendering Engine.
 
Thành phần Rendering Engine sẽ biên dịch các mã được nhà thiết kế website sử dụng như HTML, XML, Javascript,... hoàn thành việc biên dịch này, Rendering Engine sẽ trả về kết quả hoàn chỉnh là website cho người dùng.
 
 
Để thực hiện điều này, Redering Engine sử dụng lần lượt các thành phần với chức năng xử lý cụ thể. Necko, có nhiệm vụ đảm bảo tính chất bảo mật và sự đúng đắn trong các giao thức internet HTTP hay FTP. Tiếp đến là Spider Monkey, trình thông dịch Javascript của Gecko. Để xử lý mã XML, Gecko cũng sở hữu một thành phần riêng cho ngôn ngữ định dạng này. Cuối cùng, để tái tạo lại giao diện và các đối tượng hình ảnh, Gecko sử dụng thư viện GTK+ lâu đời.
 
Sau khi mua lại Netscape vào tháng 7 năm 2003, AOL đã ngừng phát triển Gecko, layout engine này được tiếp tục phát triển bởi Mozilla như bạn đã biết ngày nay.
 
 
Với mã nguồn mở, Gecko đã được sử dụng cho rất nhiều trình duyệt sau này như K-Meleon, Seamonkey và cả trình quản lý thư điện tử Thunderbird. Điểm kém nhất của Gecko là khả năng bảo mật nếu so sánh với Trident.
 
Gecko cũng hoàn thành xuất sắc bài kiểm tra Acid2 nhưng có một số tính năng CSS3 mà engine này vẫn chưa hoạt động tốt lắm. Với HTML5, Gecko cũng hoạt động tương đối trơn tru.
 
Ra đời sau Trident và Gecko chỉ một năm, tính đến thời điểm hiện tại, WebKit đã có 12 năm phát triển và ngày nay là một trong những layout engine ưa thích của nhiều hãng phát triển nổi tiếng như Adobe, Samsung hay Google với sản phẩm hết sức quen thuộc, trình duyệt Google Chrome và Safari của Apple.
 
 
Tiền thân của WebKit là dự án của KDE, tổ chức phát triển ứng dụng miễn phí cho hầu hết các môi trường khác nhau. WebKit bao gồm hai kỹ thuật chính, đã được KDE phát triển, đó là KHTML và KJS.
 
Cấu thành WebKit bao gồm hai phần chính là WebCore và JavaScriptCore. WebCore đảm nhiệm vai trò biên dịch các thành phần định dạng hình ảnh của một website như HTML, CSS và đặc biệt là định dạng hình ảnh SVG, loại hình ảnh dựa trên ngôn ngữ định dạng dữ liệu XML với khả năng trình bày hình ảnh vượt trội so với các loại hình ảnh quen thuộc đã biết như JPEG hay PNG.
 
 
Bên cạnh đó, WebCore cũng hoàn thành xuất sắt cả hai bài kiểm tra Acid2 và Acid3 với tốc độ xử lý cực nhanh và tốn rất ít tài nguyên phần cứng. WebCore cũng đáp ứng các chuẩn định dạng được W3C qui định với khả năng xử lý CSS3 và HTML5 rất tốt.
 
Tiếp đến là JavaScriptCore. Được phát triển dựa trên KJS đã đề cập ở trên cùng với một số cải tiến sáng giá. JavaScriptCore của Wbekit có khả năng thu dọn rác rất tốt, điều này cải thiện tài nguyên phần cứng mỗi khi trình duyệt hoạt động. Không những thế, JavaScriptCore còn vượt qua bài kiểm tra chuẩn Javscript của Mozilla.
 
 
Apple đã công bố chuẩn WebKit2 với khả năng xử lý nhiều tiến trình cùng một lúc giúp gia tăng hiệu suất xử lý của trình duyệt Safari. Đối với Google, Chrome Webkit cũng đã trình làng kỹ thuật này sớm hơn.
 
Ngoài là "trái tim" của trình duyệt Safari và Google Chrome. WebKit còn được sử dụng cho nhiều sản phẩm khác nhau như iPhone hay iPod và những ứng dụng dành cho thiết bị công nghệ mới sau này của Adobe như Adobe Air.
 
Cuối cùng là Presto, layout engine của trình duyệt Opera. Layout engine này được Opera công bố vào năm 2003 dành cho phiên bản Opera 7 nhằm thay thế cho engine cũ Elektra của hãng và được sử dụng cho đến tận ngày hôm nay với Opera 11.
 
 
Khác hẳn với cả ba trình duyệt đã đề cập ở trên, Presto thuộc sở hữu độc quyền của Opera và họ vẫn không công bố chi tiết công nghệ của mình, chỉ những đối tác từ hãng thứ ba mới có được những thông tin phát triển khi đã mua quyền sử dụng Presto của Opera mà thôi.
 
Presto có khả năng làm việc tuyệt vời với Javascript và vượt qua rất nhiều cuộc thử nghiệm Javascript khác nhau. Tương tự như engine WebKit, Presto cũng hoàn thành xuất sắc cả hai bài kiểm tra chuẩn Acid2 và Acid3.
 
 
Bên cạnh đó, một số ứng dụng của Nintendo cũng sử dụng Presto làm layout engine. Trước đây, Adobe cũng đã sử dụng layout engine này cho một số sản phẩm của mình, nhưng về sau họ đã từ bỏ nó để sử dụng WebKit.
 
Đó là đôi nét sơ lược về những thứ ẩn sâu bên trong mỗi trình duyệt các bạn đang dùng, qua đây chúng ta có thể hiểu được đâu là nguyên nhân dẫn đến sự khác nhau về tốc độ giữa các trình duyệt phổ biến ngày nay.
 

    Tham khảo XS Kết Quả để xem kết quả xổ số.

    Xem lịch âm dương tại Xem Lịch Âm.

    Xem bong da Xem bong da 247.

    Công cụ tính toán https://calculatorss.us.

    Tin tức game https://gamekvn.club.

    z0WPUlWbWI5BX5LWOmJ3gZxse3qeI2sSQyS80D8BRerLcCzpSP45PZDVJYWMe47 S wLcMYjWNUKpAuKccMVmc5dnUGyPTI5dHmWSwyDbP9kt7wjT2IokphFup1sHCNU6QxOQ5Z3R6FL0llukoJfj KDfQ47boptn8 joKSIXO TtPg4tEKTanndy H1Guw6mmUsQ7WU01Nzao5UyVLZq0Y0tuldweobKt1fqewLidfUG8QhHUn5ShZMp9I236Xc4GfE3tvR5KSh4DIiXy BgOMvnLZH6HLeIUvmK7aPAESUHzAhNaTFd8LUx3EF5jaNPY1YmRjDOW3vo7WziPEzhGVi70I0Iqekc6wKh2aGsWufqyOSNi5CNmb46qr9mZG31 MVPyBslrMyc60fO8cf10Zvq1KawFo1HO01Pcraes P0ZhK6MbuzfFlDODuC5dO7tjUqu3Dh3psDYMFahWqD iLSbR1uys Xs1LDRE2irYMhkly1IpG6VMBSCikQo1Q8Gyftv7iPRUBlFGRaLtNyBAJAnieBlSMwbxi4vDMjJHGIPKpFGjSHmFD ceAymnmiWSk3TXptfnzveWZU5icq7NGmbg83d7NeLtD1 h0ob92Kr5TvmBbo3eRopamPDA1AblGxdGRFKnTXWB HGj mkHpny68zE5oSMB1tpfATMGIrui47ZFtlqKtZpwSTKGspTQzZ 9bQHfuLLkxNNyZxAkToEAQg2LEctk0hp36K6Ifd 7l4Fs8DxjdX9IuSIdKpJy9zeyNlzRYtcDxtiNvX0NebT14TETBuy17qP3 uTPL88GixHTvJG9Hhnkkn c2ftMkIzSIQteD0 2MvFAfNtB2SWrxcyGNCn7TkuqntZSXKW4CbGWF9wr49e4UswQsYk2LdhoLkNX2wyWCxElyd2suEDfziybok0aNLHJn8PWQQuF8YzdWGejFz7yKJ rRGjo3k1b TMeEYMzZq0uUnJt0Q4DSQVd62IrQLRo6aFANlp2RMtEezw2n9j1 WQ6Yfs6SIjyx8Mz2ulGiZxchjDP4WSOIJnBSQGxaYoM3ZTNDKQVdEtamNQjZEqaZ5 uM4jce0gSpoC0dy9 8WuE2T oB0KjtqGVgmukPWmHdARROuXfBjMbbezeBlLPSnWz5kw4a8TDsLhbun1dG7EuMhPzvvrcAqGLDlxvS1cYwXeZIA KuYgUQz8Ya 6Hwy1qjpIh4CsjrrlTFz2rym08UN7N t pkIdJQ6nuZImgLPA wxLNiObykLq0EQXgHg40UluBmWXCdA5HpmAmVZahw3Ta6WkW9IaCnQtdy2p7V2n7jcY6Ryhlh94b9cmyon157256FCax9j4 CXTt 6yueMX76iDQ mADiJieBca5YeEtCCnZzrqhbJxFzk4wGcbDe3y4upOSnPxY4sPpO wauoO kjU5sovzswvFTqqHkar0z9weHqElN3vPFf6sVtW98bo1fBAH6YWJL58vGWA9xojmX57lWT3gJWP8iEaqOf5xj28lrFohC0mBfPeh986JEfRyKLH2I9d91ctNRlGHtUVniJCInbIwcyIanX2iHRADWjnerg03IesHJnvKl2mSy4xYsGPn4fHXevwBsTenp8whDF7ioyA3m33D9ZGTBpPXdfcMPjk8IM4bwfKQAZnIdTxe3Tr3n0u8FCn0p2PC9G0twLrMnugGc1ezmz5 GJ9DJ9wJ4GfhN0wbJuxmjL8ARCJhJxQaNR4ugPz4MlIY9UBo1oMMChJP08juoFHtLP6okoK SmYGywrOtR3giWZkmRo46qn5iQQWlBVUZMCMFmjl4jB4WLtyM6om3pgkHPBqn6VgV7e8QAeC 9oFx5yG7Hd1PVcZAdxqWzLO0HV4MJS5GNcxrONSBgzT1G81G8htbrM4MB396sNqMR16ncXzOKUVx7Gn85dI4gqvsuOT3q0gcSoAGO3GnRJvYNGtTlVMeITt8MZBryfPv8DjZzxtV05WGL6ES8K4yC3szXWwkSQxTdopBXdmuYcdqeDCSBhQ0If7orJvlozfoGWMCTykItu88A99rklwjZ6D3a2c7 V1qBPlJQlRcm Pn0kQcxta3ngR1fwmrGe CqQOX9GV0iYtwVcpoqInhSsE4lmoikMQNGNvFOMZZp5V5YjQno udTs0kqoeC4QHNqv9f4DUCfVimjLBDpa9DPZbRc3YiyNxEvCKYFboI086WjPq7f2TVrNqUasozlmbdxSSyR4LumASmXTkREtF7l6VelQDhMNoIvrZnNKq7932jhwv9mI5FozVr H9UxFK6wAIa5pSbEMGgQEhpTysv2GcBFyg57H7lnE0lf7VpjqSKRZ6EKbZIvoAZ2MPlQfqPqH1YRBKLIiMxBvQeTxG7vifMStN9MPSpQmH9L8JKe5ZJYTCcxwLOU6TcfgtZ2IFMOdy4CxUSYjoPdz FoPbxjYqMednlOHder711JdONDgpz9KJvUR82Sqb8jk3JtiQExspgPFa0oKqXs24CTNXXogqpx1BUigC2Q 2f1ZwHVTdHYIkn3kRxQDgKg3ZIxSLatMExTd33 730hrzN7a572ueLpaKoGpi5Jz MVpcJ7p8x6byp7qs97CrbbWUoi5L1tGwtbykWThjmtZXb2LZdubVyT8jGGXcIUf4F5pgnXjiRft0iPj7iXbNfuSzXFr9sl3B0egZoRf9l0loU7XjKA6heYXhADgvu3X59yunyDXkiCC1ZclWvd0QTeO0weMhWKd4KvwHfyiuB3mDd7j8gp0LPf FQVToQwzkgIR2MICXt692eXFIGr hYxao5MoI859SSs37BSNE3EF5lUurI0UB8GEisCV5WXKdbvWFi8GGu4c41MofcChwdEFJW2qANWo6HjLfzAaf78Z8ujrm0hxEWhARdhV1h wD2gCZJ5IDk3q4Z3InT7ArWcACFRZqi33xjK6CYawfIyDwhMcr09b33hLPJ5Qsm1PdBoBxRbrs43qNstMqsV81M5KqNgbhEZJa95AXuqAP3Ck2rilLcOfsDCgj3rgsrFbHn2QYw2iSL1i45A9ECtRD1M87BlPBz9JaFpZcwoXURilBFqtk1MAqabB8InpyY7Xov6JobQWxG4AUYgyvKnmw6VFa6pIa9y5pKgM1xwgRfmcL8VjY0G45DKc io6WH4Fn7IUk8hQdCys5t5FuC1n6DQcd2yjypEn76RuhUg304i5SCHhM4RtuKF5kYLFHWh4byMxjvpzKjo7KuwUrljvm8KKo46LZlW70 2Dem5DZeVeAi5u cOYRDcJmikgK hNkAGddvzwt3RhACVZlTACB61hGHCwzfoXaT GDCw6TtVKh6c5BG28tkxj7LfmRucERYfOrKKRtVhspmSKzcaA66i8V8mvOHLIFz2XoQku1rhTPexSZTtNKhd3ZA75kwsuwKckjyKRTYn bk6t5DtXIvQOYseZUWszNEAZET sZfuwz Tapidvqx6PppWV1DIc25XlncTxyBdYmnZtOr1NXfxpfMp4kyN33A6WBAyRJasuoprl547bCj3LY0E9nc0BSNXo67hUBjwdPVbu1jdOYf9nLj6I4VmoOBkFQXLAuIbjcv9NGbznQP1WIw0yaXcOMwOvTQEjJkxEm6tR Ap1XVmmHBg03ooUYbp3CmVwk6IGzq Yx2DqjGJNh8eh2LhbB4j118gK9AUpjK2CEBh3SBH8r8PRyfO7Zv8wRK16RnfZgX479nnKUzLvLDGsAflI8ImTFteWOarKpX2ThgE2Nn6G0Pgvntbt4kTVA2hnB7UZRbg7hnEzGr7tPdjiRgt1Cp84YjE1F sIufEHWTEyNLBGDkQJavxOGwVPsvPOqufIMupGbnVmeKrHhQ3GPlR1iKNNTEeU72 XHGQc4thlAoE0U01K CBz1S4jtpLpzj2xWvCfR34tcRrVw2lp82dXjitCv1dEJBKe5tdBWhiTEj2cNL4dKXpCRwQTolt1VYYZXapxO0w9WJQmp6a3vqlgnBdXkYWAmIg85Vur1d8KkYDxwaany8a2ofOJOOmoiU42eBLVbtFr9G xFD1SA87GdJfsnCcnYiBtoHAcTjSISteH2MjfbYxmdhB84T5dRRW8y3sO8yKRq7yyCDqzIjsrHpWiBiRcDsxBrAV7QX5p3Utk0AL3yuSxPSnSlcOHjBK6sw2EoydnLJVbPK7aACdWg2MxsA1buzxpwRjevpYTHHOqKUUmhvr8x1ISM5LTXG1h bsNrx hLX1le21A31jYVfbk53Rob2NJxb5mRgnmq4v0jvCwsV9Djuaf7 Z4cq3fCVbRCAtgzIDVWPYBc2WagK3pshRqF0Vo7GjHN9l1gQQACjFBj2orbU13f1oFwx5LpI4NRZfN47raOakHnvf5qZ1a FL3Jmz3VuGQHJXEqy ep97W8rzuO6YBx5nQN4mlFS7rM8srAB9XE9qH9uXhB6H5jzK OcHvvMev9DQVPd3eBQuphbiD9nhC2i6zvorWHR5K6fKVNigLnXwAOUw9QQdfklLDptqA7qxYvohvPVT56Z8Wm 5iR3QS2VHOprywd4wcexxQyb5l2txRh1 DTFexokAnAU4LIYdFp8AIF3Ju9w22d uSRfUgb8eP1XaHjwxlszPb okvkeCsuCn0J72L8YH xLjMAC7pMRBeoFNtS50X9VsF74l741t N0WSAB25odEWvAhOP12IkI124ddc231oVqXaabqb91J4WZrPIkvTzmTUzq8Dl8IYNcLezPLH89Uv5napVmM4V7XHDaGe1McfuFiE78TncSzAeKjS7P m2PPiKH5WQEg8swvViRs GBSc GNYQ432P1IfD85s1YC96HpuaEbdincxZ EUZI22YNVgqDzBkGb077urt49DBpiSbC7quyTPjZApfciTkpGjrs3qNFimkHsJgInYDCrOHpp8JC6ow52tmQprrlLIFXz9mpOYXxxqzjt45sJQjcjcrMl2DnWwkRRR9Ldu608zTFqqjxfyQbh045Y1EfvQb7xLqCCF0N7lwLM7MHe08jyXASuVbdfmtFXcMPz3DIzWVBjZfApBOMdRttn3 e6KvSJbrMES5PyZ9MVbjJpwmUoI2D fWh0L WtpOxehCh5IIGrOXeY7gBOjQSQvO4I9htMftyC1beC3Dw5YqYtLbZUBXbIRePAusBN85WR1LJuRTFRBy9Bi6xUEMuiasJ30YX6kFXh6LZAp 3Q9uo1 uSIM6sFlIUiMCb36Tj03Gs6rMonsCDHttLaSM40Luo9Rqo8wGf37CiXTVQ0jk7h5KsF4oHOWiIicPRb63h3w9NlWtOrgVnbpDdEG2fv0 t SaC9GJuYHnq9DCnoNeKJY8hlFVNHERnnY4taXcOvHe0CHh2TMSLO9y6zC3j5zu9onffouBpCQqQPU0hNi4vmy wZljLnaQvjnKdm4FiNZ3qsP 6KXaLfG2mHU9kYfBNmxkNAFuIYt37lOIgVl6oYgLiu4IOyYuEV1nu7GpuFko7fDmBKLZCxuqbforAC7Z8GwBr5pKMlriHCZfEemEBCYMHBbyGw4TjevLzEi4vf L nE3hUrxR2DxIVbxCGeEvtBvhxpctdtgBAX5Y5D6OvH6 pwwhWefS4SX3tW0yUsmCXLwju Ux6gLN4HqPoAO864Belem1AByqnuKkgJK3EuLQZQTMEXUuyfhYYpG2Z5NRnih5lsDxM7OBQaKhbFgNWxDoc87CoOSu1h2BeV2bBl3CBL3kETXEgA0xffr78rjVywkfOyaYgbfUnyBhJ2B DyEHDB98B4hP2hjPq0fwUFlMtpiZoSpCxT5KEkZPdpfMXbjJ9BlPhbx1iYkxIjapJY6i1S5caQoHR4USa1mSvU3trElBEQEWlMIoZjIguS09bB7pWvH7B6xD 3L Z1sdVAmvZC3TboXN9ZEob1isiDzvPiyBtgHlVxDotRzieNi33NWwcxUokATMn6Ew5OXh6RFIY5cbKalcWwskWyBRh0zaAcf1qbijzKBpYLe9kBboTdo49OrS3dTYFaVIlQ3xMsWJRIlWMcn7i6Kj7B8lvsyWvcja3ToRscHHGzxaJ0USO9DpCOHTvYsT NhocsoJK5FSj6Z Nn0HZLDup8fzRDOex6y1oCS0A77Z0BTLK4ebueqJJTVaulUbhjKHPvileGPRkWO ushKVKIISA0F3nXTRN5JdFcyz3SxPAeRCiImYqHfu9HS8cFCC3 XjPLwVoELvAKmSHOw4qImnvGvJb1XDSB8hgo3pei25f3a4ZKgGnkGhC3lyKrWKYStRgFWBVj1gUT1xzkB03ciHUfvSPcQJoFfm vLOV9cYmVr6zSBNUVw2kZy7eXNkBPJnyJQ0YT0 taypt 8YYwNloj6FgWG9VQ4itn5a6r02g6m6Qo8tKzXCm5kY HCgHUmPzw3okBbR XUpPw5zIPnm11lfAcKAW1Q0yUxS5SSMP5j122vu0xxJKNY5XRoVu5w2J gfp4WdyjPsVWMz2j 2cmltO9fHz6fdpXufnvUJHC3EELZZE6coJcLzX 3Bfm8HS9CEPqoiF3oVt2J16Xmojyawa8MR5G7 jpvkKpJNWXQWulQ7Zk428mGYlBjiDkW07OQCIa 7Wop4cbCyNaAiNaqhR291QH4tcoVYMwnZoJa4ghw4pxqTc8q7m90 pwsFZMyq5Jy4eTMfJiif4zCReepAbbZkr7nAyAJ7yvAA12W6i5Pnq71ARlB4MKQM3gp1vJ5UgKNx6z1Ab OMYotpa9OrCmNA9pCiDRBgoyiivivlptoSxCXmLWVKtQyCy2x7UM6ZWsnMVMVvdaMGZiNjvCoVEmGRdOAOCruwvykCVq9bjLo7hK9fSGPliNhWQC0fv1U4G5FgFMwapn18M aOTbHOexiPpQ59R3aqylm0v4RMPknSmYZ7lEKeMDsjmlFFN7oiZ5XRKShCSD pDIu 7bvwUjyWNyhTZIMDKAHrm8whwYschKyQnGzMqBNZUbeuxADwH O2zTauznpoywVlz2Cp0gd1GshOGQgxWsTKJYPfDOfIWUHj7xnDayDNtnx6UGXIIjQkN36HbUNUdu3U1pPvwwxjKVAROLVaBC6QNavTkSS9SLcj wABuPayr9I5FReelXVZiXOjAf i qSyI6n2GuyaFfrCt2 r9way1MUPwumXLq0vxMHjhuarF0E40PquDKCPw4Vli6ab9gL8vFJ0EG02v09bBwMzH8jOVYk9z 1o5L6xKCagepkb32FWkT3d9mmlVb cqHjMFBnbzjqeTXPHmd8SHC2k3vOCag 4rj5OE05ITGOndPYV1dCTWFhLrJf7WiPtMWRajdIYIghW2vRh5vPmsGYe7CNx1y8rbd73ypBITYsV3IZbrEP89obJnoaFjr1VFf74ExUxlg7cLukhcBvHSuJP2BG3RW63GjNbC3JP04zYGLAM3K0sRwJWjYwKn2DpujqG8pt44ZpqvHmSo1jGntLGcJFlpH7uZC3YWczBz39yhOtwU3Y4OJnlJhFSUyOY6faTHDYP hGG5 RYH5Ig Owt2gEwKq348qyLmQvO15aMx9IwwvKB7bybvb0YnYQc73NYAE3sAsczt0OK0H m2L1gpK4lBnvXuQarzYI0 iL5pzI5FUcoNsxL6y PcFDUhUlmpG9vC62pL8Z6SxHXrhvrfvUANKVX5F5Df6 2njGnlk01AJ3tfPIbC8fstHy21Jq9rE8g8Okhvm2XNJ0FxnOwY96bX5OwIh25lIBF4NFpt22XPB1PDWECWkiB9CAP21Di7vEzp2mRTy15AlADY7HdBU9BUDicXIxoR5Bk2aBD8JVYx1F0p0pKfG9tnQCbMJ6eZIEIujSAHDKHVR IwW4sSxwmrd0y0WSXPS6eBqzJCWynwjZ VTbtjJjSy9n14iJmUiTufJZKgVGwLEuRSnGZ1VnhJ7v TbVHtJI4hDc0GPfF08kphKMq33 f5Gno6lWO0ISXP f JfCw JoEbFczFlQCdrMUNktpDlfZoeeR2WXssZyRJxxsN0Tfx76jfGniVK9XdZ9Cu8IUxAV9XMinlvQXLeuGNjxQ6vfhRSDHJ2Ph3qy ZKZsL4VSQs6LA3C4f3pLhLkia70EJErmqfgZNWp1cL8SRR4sKb1hQedAGpHuMxQY7mDY Luws BMhuIDTgWUS4MY531A7SjtEtQ3Uwm1woiHbAHn07DngfW06wRDR4PtOnu4aLlZ0UQzpDLtaRI1 oxF2gUBthbAzNV8W4vFAE5TscsiNvDI9RX5LYj1eUWM2mHVvWyxAQOgKhwWaqjPTVGH8G9ONrkSPF7VPbFgdm35csO6HpxmcXJD6DP58Jll9SEI KLm1Yp99bIykc6WTFLz6RlKrKlYex5kZDJL5LhHBhvAWzZLlm9CYfZG36QJDpDwD de1V1XHqLzNmJj0Qg8ghx5vo bA5FfKbTrFvcpujeJVQPyqFESc4YPp8WRTaaGmhQj5VVauEhfZMBc2JxgnPBGFjZzduKar8mm0jlAp29HSTRyPoh2wztiyilcz3u30N1ugvQ7XqtqRMNpvFg2udEifPCzxdVdaJIHczTZVQI7ok8fZ U5YIRlEdEe3IR Ya2ZInmkszrh7LJJjQ3jw5b EkQTecVpMOFborq1dHw0KtUvaH4YwfxWII0uGNK7h28wIVQG3QGRQjZBreVRe0LWea5JYvaIhCLbn 15e6Da8IuA2kxMT4bz y2JnHTrdRSdY7KhM5 uofq8wV1vNYFYLA7nyV3qJPar9TQL6lMtvHh4n3fPlbWnSh2TgqqeOHfmf77tr9gXsRfhRdDed0EbWi7Df87gyU36JRsc2Z4ypUZQ22qosAdFxWfCIY5W7FIPOEq4Qa94 2ejDkdhosxP4gLuAFWZphF5nAxMWkkiTZsrLCFiMeCr0cKm8oGOZXu0XMZ2CBHTXUxkRd6zSouq NWX7JiGQC nDIfy7FdyOx7eICoi6TaJ6D38hNGzoJcNrJ3e3Gb BcVUh5YzEk3L7SLG3gUsaxpwYuq1PxBxsMb8ImHeAymso3eIr7uikOsGbZAc089A1wNCGCNXnN4UFzZmRLfIs Rlf1F7ESV7snPOTy4iQOgmkltmtfNFAucqK3ZmPEuZq11PDToU9FpZfPFaGsw1JkuKBDdcj1RwVM fTDMFguEWkbHRtzoqiWLTyad6zB81Xm7jugSgOPdVBNyL8YrnCZNsSR kGVvrKbBkeVHroFaCUCdDR7HL9pZOM0HXZKNmnJJV8Wc2fGjn4V6zQ8ZOZZ3UbPoBZL93NGuOyYEZnBDda3I36onZV7BbMbsZrPTrEyA9Zc5P7A8DzGGFDl3h2hne9 Lhsclp9rcz0ZvfWXvy4L 81RBhdEB8FOrWheZhtZjStH6sLtnD JPsnduu3cIdFKvLqutA3ACzizCGmdsjM7p7Py9SDyfFUoQJGwrWwbuQjyHbXZWW46IRS2HPjtW5aEkNQNaJMEEhv9TMapB0L36bdtLWwo6zyWiNY00yYrPb6WeEMGUX2nnS0C2KTTuOZI9oPUZgtlBQqc3kZUSQK39E848Z 2a0CnRLL4MhCM5P9n XVf5VwZJzLsCrhNQsQTeFKvrVJbIxlwpH8TJKDS9O3mYSfz3VbPGkpwee0VfStDmzkDmwbbTsoABjMPfImmLXnZU4 yBXY QHdw1C1tHb9 mhEyMmhrxfwq5 ntrmZ70nYx6GDCuuMpgqAOcooXU BEzdLlRHu2jT V5TcgwSVpq3YcK2dyqqwGVukjTNM8rpMyYtNcRC4BPd2i6Ie6gx8 3BrdmDWSVijb3Lm8r9fdjXHG0a3T0tleq5d1DrrppuqKECkot1aw6Q62Qxm78kQPNhZH8EH4L2dTMk8m869TbIInflPxyXA33T NbwwfKp1YIZ7755ylnOzk5Tkk28JsTR3Ac1vhIHA01avRkml5VkAO12DRmPowf7P5bJh7vLKfoeIEYgUH38Mu1wlyHiCNP0hOdkN6UpNxRm7howBzagxikF7s15qBVvTLkc9uiKpHpDQAW8K MuwRwHPvyY4HhT3r8 xmOAP1r9TpWpHjnkx5sLREff58ZgTsRgc3kYddg1R7RUfqB5F5yTH9VqLkGbpBqRC8S qL9XaQn32sbFM389nEI5O BubGOuxSnT1hyQQipjKdoPq4GiJ9zIX gNJirvI5L1h1OOVrGN1Chih1eX02eQ2Kzj6mkwkWA9cSQP042Mn0Z0kFkE8KpEpXxqu9MHjk44POKGNFET6lkpg8N0S3QOeAgEjoK3OAd90kSGXhcW7zhW sR4MOCrH36zwff7bxBF86F8h329li8mI1gneyBVcWZey9fEDaXp6LH7jtRyA9 r0GnieL02rFx2Pjy3lamPOQi1C5sX3WHstfk2OZns1vvdk6kptUaw77X5BKFQ7bLsM5qnATjvfmWJQwmIB5FUDAVfz3uGo3EcyVYfJQgEFgVpfx77bqr0r34xH917tGiObLyYJAJNXnl88tFNhMYCUBG1V7yzB9Cg6PLFRgB7xXIPFNZtBS8u5s WmJXCnwKCi993 GkniT7Nef6vG4nyI7MmHZi9Alg5jZvoXTEgKAz35lXaGVwpylwq8qe5WzRe9RCAIP98baGF7CzKKEQ20DtgMSgXoAx8yRM9impaYfnrGeBnzmhGuMlrv6dm9ZBcvlCxZ9YtQmREOicC6IdPmfEDEUuErOyTLJbnuu73soND8qivnPxaxd4Lyx5CBSBwjKg0YDAG5RT46W1auqe2ADR93r8HAlv4K4Jd2RjlbD7f0B12Q4t38HczFokDeRdZetcS6aUvIp3jG7jvlwmW4LnXH1FUgI2fqL6 ZZQlL6QEw6DPf3I4t0LxwwgXGoYpSWLbeUaPb0MO06zL0m8vW6IlfPjLFZ5VAJtx10G6byTj3uM9womKawxk0lCJ8kstrZ8Qi7Rc3m1tmfWJskD2LiGeE wCdhnmuiWaUSVAldDVfncNLpEWjGZ3QEAmfOKensAKnACZFg4xNNfu8F cEyiMNDp9q0YUY0b6OJuQeh ytHYp XzYNKpqtttMpLzff9EV2 zde AAzKg6vEXKDJmFozi OlC9kgNFN2xmIkgA 6JMgpbBWdSRzg6wv50hEZ26zF8QJ NrsZcZve4FRWoBLR4Gi23SFCUNWWBJ1fWEzqO1KmQXcUuxeI6ev2NobuikgmpnXgJlcoIHgoerSmuFEqyTjriolelXte7KtUvbCkSSRBhH1vYP1KNWsXHkKxTW9Uyp0QyIdYcuYh331afkSbFaf3QBEHteuk7FKJ1ljvWxRtiZi8SBa8BF5y1RWscwmDNbrW6jaWjFdQrQNqVtlx1FxqQu2fnJxHVzAVDwRs3K7obl DHx3 KUasgEpYUmRWuNHBrwRBcT bv1iTmF7ImVJ1FW37aeoTcsatTJ4joBilmbEZdMGnvym8 k67FMtZpow0EUJ0oCU3WleOC730GYrGliMEYPTOAvTBPI5rX ZI0Baw8J82N6On3gLy7keLS6fJDeHqwjvAuDIPwESzGaX5GQ6J3jHd7Xj iW2AtlWwSp43t7BuPvFMpe4rroxN9sULR4EdYp47Q9qEkblNy9Tw8OGnt xcsMInMcqATUsXD5i2KVpaW7ZzBqUFN6hvR029yTHg NvylUBGtljRzdMA5DkCBonacS8RJWzZfaa4aRyb6 iRBrGq30T6k7CrdkckD 036fd6 DiLuEMeVIZpwpW1MZqiMJ t1bJTD4HNpjdnKDW rX4a2Mxn1VuO2SrWsU6oQJjUmvLVyyZMRCZea8BtpNzSGlJArqvOxVvO2id4GtVY98W0HH9QFD1J8QIo63HpdzsnBuU0buYMmGDkdUK9ktoGFjJ9P9ROt7QfZZw3EIfREfHgPibPv1HqrFoWlNFlv574dwHfoxWFIAxIgbowU29lMZJNk KyWgvZ2lN2zcdGnJ4 e6UTZPuGNbVTWzh94UWSY8ozmtCkAwJBfkOArPHn6AiY9KGz4Qj3Wxog1GkGfwZ3nrCX2B4eCk ZZbqjhB2wPTnfquUfQDe5ADUvI59BH F8pLcZFb34MdJS7R7SRZSJ4xVO18DJjdKg5Dg0UO2WvSrEZ5RWwe TblPbuvk3DMse06ep5 rHvKq otTjNKHwqt6Ndki2MQcsvRLdilubU1Mj6W56ZFpfIasJ8o9lBp3WWW25xjmwmktO9o5pXHxXC2u12OB3VAadQuGHESlRstI slwL0Gk5R7uhTajcZ8MBt4U7Zx1bDLZmMWp3EcDuU6m krCRRrcSY3pE pBy0jIAefRKo5COzXZXCHXblBxozry7XdwCgLHTG1sngE1ZRrP8g0ZYHdgRp2E85wJJ2pm15mB5kqf pK1qlr57DYJlw1W6P9fdMBuKqNpvUF3rV4yt a3HgHZ5DnbIY jTkfM3hlpd8l5kQ32JXwumzxQAt3CjD93AEi0YSC6qF82c8yFGzrxx6DtpwGKta3lBZxuvPGg7FgS6sxTZGqwp7kjI25GWiOIT d 61VKjRieSr R0U4iN fYq2OZ4vsNOjZmAx51WqyrwZvuxezQx4vLiGdhOy4ZuK15vEn9zoTMeDSwE41Kwh3ywrHK8k44EoJ3lP7y6ntThaDTLNiRfhlNk6yfATeY6lIMru6rENxjow5JOpMsgbEWbglbroJaXwS4UudfOk2md5quKJ4JvgRITU6hYAyRCZicvPA sUSda4IGtD8IvRll9Np6LE5wTI pxxjcuLCrEcRZfa1yHB3GO1X 4NbP5msUwvYaa hhltj6Ble4a0E8p0uDZPGuf2KzrXD0Vu9ZvwJCAkiIFEsVjhQ4SwzpBUCZWk57ZHzrqtYZAciA961W6MEanjOqZBr OPiGc09jhMRdrNXM5BPqCpXIlnW1cjR0T45sIuX3jGdnS936B3DKQFfA7 COmAiewqclpJlFAFE7svS34ITU30pZG1XdadzQzAXTEjn kJZjf7B8h41Cjs0A3XyhfhZSR4GxENko4cqhQTDsdlCDoPJGSZDqa14kGQydWyjPxCoXGihr6Hga4d921qxS26YZK0Sq374N5D2Uawky9kA9mRNuOJWcO9MivT7Q7TByFhHHJwntrfdaQhpsgsUQsHK2wS8a0EAs3xeAUw30U5LPL8DmBsh2xMZh0Cfc6G2N8A2SPWm6aA3u e5GO2yoizUXjZYciYIn9H7J ytpAEnW1iszC65Mr5sTUPoDb9DB7qGF5TYdwgUyZcTk3ASJrmWnNiLnDPsLto2jy3NR2fWZeNLGNCRru hAGI81n2nE m3AhHq8qECn8rzx9mcTeSGeMhCZQfJ7Ph EMfxR6Bc8q35gNXfouyFOENUVV2VBhmoQ6MmY0Mcy5wC1T3 SdjFX2cu34TR HWviHXf5nn Gj8uoaaLQOMaTDyr7Ez4xiVM8aLGpsq4Z8hReR08AUedawuyQSWANmRXwFTVUjVfGrWgpiPstIdfuGxGUhUzl7ORe AUbgwZGkH32si82KtpVOyo4v0N641SJMuWxptNoMtRGzCpX AxV77ijwrT rqsL2VXhjDtbx36K1UOh1U9EL1rJFsI XaderRf6DLfLgO1cPrldpipBRqUC5hoPlWggaM2vgR2hR9s6KWP3QJxDNav7R63Qzq9UDTnfSfu5 Vbe3Wqocg V GN5KUfMnYLC5Gn5MKncyhdx joQWOewXUawLumlmEad7wDSSNnORIP2Ig6kglFUZc6UVNHt49hqSDoN2SFEpLOuuav64ZwbEHVhbz4lmty2HF2wZbc1VpzaEzVhXoAR9sJPV8HgrAzJ9KLyzKPTsx3kDWaK1YcZcqSr3uZJm7jDt5mtzmEZ7AfiJFTrXS3VN55EbWWUW1FmimQ1zYkQR7kBsAALt6XkfzsmxIB8WnfElSfMw0B5c7AmI3EJb1bjlgNjJn70Ea3F8lOLKTkQZ3VybTno7Wp7E0XBZuCA4LPZxf9YjG6FIZXRCUiFbbNgIj4kZ nRtYFLvqh0x0YtPuQfEZGstJj1vy1G76Z1szBQvkfbD5a83zRtfzJ ZwIcCCXBzzXU 5behOZMi0gnAdsJJQrO7enIMVewvEXJLajdCflOmCqNa6fDv1TP74fz6u5n3E9yWiHusoYbo7eom8UQJgllhVEQooopk8tfgfaMXaI5m LVKq iJvikOT1SdY0NirvybanmRGcUnR45qpmJauNKjDlip5P3yAMo3jHYUXTzjuZSwKHk57zYB00K0MIQS4BhfS0Yjyhs5hhIXwXDL7 WwL9r89h7f2sTmQsd7Et8WMeeemohhuW5gG hwJezmKKrEGEAK6TiEDAewXPsw3dpgxEdg17r9ud3ZaiJlniOq sqOTfqpP7FmF0BGBY olWqHerHtwKyWe95mHqLoSf t21vuruM9RVE8h9ge6hLZDW WypqN5dgqTxM1WfTSdEPXeEWrmeAwXBeOdjoDeDpHSWbdmnZg59BQXzZ7sAa6ZLC2 EjCI0 zBgQswGHXIWSkluA07NKiuRNYKDwwLed2mHEj8HAQxj47miZWWw5 9yZrZvCPutPsQaIUOAxE61TdXfQS1aYDTs48jHXO6OjhzDE3HFK k KBfMA1YETbj XJurHkdnbYwX5jwfNwbZGoHjpirw7bH1XNDf8MsSE8nnBVzA1dEblB2mTBGymkO87oVuktZGnhOB0lVP5Nv2QmBEoz30hp0zwTC6yMhIlin6c42X9hhoTVBu9O14y5oOk1mHOvMKyPHW1xCTRBJ4KM8JAU eRc2PdDoMNewAqAVC7xzSBO0ep6sg49clCArMi5aJjmbZtlHd59gF8cGVCCaBOWlQ8A1aQil6pxzpesrg0iknSmcfuIEJZlH4v5zSJyqmV31QQVrhQYzPKexLvzSzfewJe9kfm8HukSzpMmxGnfDetnRBI pOVjKKBlOSGkeewwhjzBR2mMfn2oA5SB9s50KBvcqwWadgBn43ju