Przeszukaj Wiedzodajnię

Przejdź do wyszukiwarki globalnej

Poradniki na Twój Email

Praktyczne informacje i specjalne oferty prosto na Twoją skrzynkę email.

Wpisz Email: 
 

Ostatnie Artykuły

Jak dodać pasek z informacją o ciasteczkach
 
Apptiker - czyli narzędzia dla strony www
 
Mierzymy wydajność strony internetowej
 
Mniej znane funkcje Google
 
Wielkie zmiany w Google
 

Ostatni komentarz

Subskrybuj kanał RSS

Kanał RSS

Od teraz o wszystkim co godne uwagi dowiesz się błyskawicznie.

U nas jesteś bezpieczny

website security

Ty też możesz chronić stronę i swoich Klientów. Sprawdź szczegóły.

Apptiker

Varnish Cache

Autor: , Data publikacji , Kategoria: Hosting, Rynek IT;
Varnish Cache

Varnish to dopalacz aplikacji webowych (cache HTTP reverse proxy) pozwalający przyśpieszyć ich działanie nawet kilkaset razy, jednocześnie zmniejszając obciążenia generowane przez nie na serwerze.

Co serwer webowy robi? Przede wszystkim odbiera żądania i zwraca odpowiedzi HTTP. W idealnym świecie serwer zwracałby dane natychmiast bez wykonywania jakiejkolwiek dodatkowej pracy, ale w rzeczywistości nie jest tak kolorowo. Zanim odpowiedź zostanie zwrócona do przeglądarki www użytkownika, serwer musi się nieźle napracować. Zobaczmy jak typowy serwer www obsługuje żądania, a potem przyjrzymy się co robi Varnish aby mu pomóc.

Każdy serwer jest inny, jednak w typowym środowisku serwer www musi przejść szereg etapów obsługi każdego żądania jakie odbiera. Zaczyna od zrodzenia nowego procesu do obsługi żądania, a następnie może chcieć odczytać skrypty z dysku, uruchomić interpretera danego języka (np PHP) aby skompilować kod skryptów i wykonać go. Z kolei proces wykonywania kodu skryptu może wymagać podjęcia kolejnej pracy jak generowanie zapytań do baz danych, uruchamianie kolejnych skryptów czy pobieranie większych ilości plików z dysku. Pomnóż to przez setki lub tysiące żądań i od razu widać jak serwer musi się napracować, żeby dać nam to czego od niego oczekujemy. Co gorsza wiele z żądań jest powtarzalnych jednak serwer ich nie pamięta dlatego za każdym powtórzonym żądaniem wykonuje dokładnie tą samą pracę od początku. Przy dużej ilości żądań, gdy serwer staje się przeciążony próbując wywiązać się ze swojego zadania najczęściej pojawiają się problemy.

Nieco inaczej cała praca serwera wygląda w sytuacji gdy wykorzystujemy Varnish'a. Żądanie odbierane jest przez Varnish, a nie bezpośrednio przez serwer www. Varnish sprawdza co jest wymagane w danym żądaniu i przekazuje odpowiedni wniosek do serwera webowego. Serwer wykonuje swoją standardową pracę i przekazuje odpowiedź do Varnish'a, a ten dalej do przeglądarki www użytkownika.

No dobrze, ale co to w takiej sytuacji zmienia poza tym, że dodatkowo do pracy jaką serwer ma wykonać dochodzi jeszcze komunikacja z aplikacją Varnish? No właśnie wygląda na to, że takie rozwiązanie nie jest pomocne, ale przyjrzyjmy co dzieje się dalej.

Varnish ma możliwość przechowywania w swojej pamięci podręcznej odpowiedzi jakie otrzymuje od serwera webowego i może z tej pamięci skorzystać w przyszłości. Dzięki temu gdy pojawi się kolejne żądanie, które wcześniej zostało obsłużone przez Varnish'a odpowiedź zaserwuje on ze swojej pamięci nie męcząc serwera kolejnymi pytaniami o to samo. Takie działanie sprawia, że obciążenie serwera WWW jest znacznie redukowane, czas reakcji jest lepszy, a do tego można obsłużyć więcej żądań. Jedną z rzeczy, która sprawia, że Varnish jest tak szybki to fakt, że dane przechowuje w pamięci podręcznej, a nie na dysku. To oraz inne cechy tego rozwiązania sprawiają że działa on jak prawdziwy demon szybkości. Wymaga to oczywiście odpowiedniej konfiguracji i podjęcia działań eliminujących buforowanie zduplikowanych elementów, co może znacznie uszczuplić zasoby pamięci aplikacji. Jednak warto.

Rozpoczęte przez nas testy mają na celu wdrożenie tej technologii w niedalekiej przyszłości na kontach hostingowych naszych Klientów, co powinno przynieść wiele korzyści zwłaszcza dla większych serwisów, stron ecommerce i innych aplikacji wymagających znacznych zasobów obliczeniowych serwera.

Strona projektu: https://www.varnish-cache.org

 

Ocena: 42546425454254442543425424254142540425394253842537425364253542534425334253242531425304252942528425274252642525425244252342522425214252042519425184251742516425154251442513425124251142510425094250842507425064250542504425034250242501425004249942498424974249642495424944249342492424914249042489424884248742486424854248442483424824248142480424794247842477424764247542474424734247242471424704246942468424674246642465424644246342462424614246042459424584245742456424554245442453424524245142450424494244842447424464244542444424434244242441424404243942438424374243642435424344243342432424314243042429424284242742426424254242442423424224242142420424194241842417424164241542414424134241242411424104240942408424074240642405424044240342402424014240042399423984239742396423954239442393423924239142390423894238842387423864238542384423834238242381423804237942378423774237642375423744237342372423714237042369423684236742366423654236442363423624236142360423594235842357423564235542354423534235242351423504234942348423474234642345423444234342342423414234042339423384233742336423354233442333423324233142330423294232842327423264232542324423234232242321423204231942318423174231642315423144231342312423114231042309423084230742306423054230442303423024230142300422994229842297422964229542294422934229242291422904228942288422874228642285422844228342282422814228042279422784227742276422754227442273422724227142270422694226842267422664226542264422634226242261422604225942258422574225642255422544225342252422514225042249422484224742246422454224442243422424224142240422394223842237422364223542234422334223242231422304222942228422274222642225422244222342222422214222042219422184221742216422154221442213422124221142210422094220842207422064220542204422034220242201422004219942198421974219642195421944219342192421914219042189421884218742186421854218442183421824218142180421794217842177421764217542174421734217242171421704216942168421674216642165421644216342162421614216042159421584215742156421554215442153421524215142150421494214842147421464214542144421434214242141421404213942138421374213642135421344213342132421314213042129421284212742126421254212442123421224212142120421194211842117421164211542114421134211242111421104210942108421074210642105421044210342102421014210042099420984209742096420954209442093420924209142090420894208842087420864208542084420834208242081420804207942078420774207642075420744207342072420714207042069420684206742066420654206442063420624206142060420594205842057420564205542054420534205242051420504204942048420474204642045420444204342042420414204042039420384203742036420354203442033420324203142030420294202842027420264202542024420234202242021420204201942018420174201642015420144201342012420114201042009420084200742006420054200442003420024200142000419994199841997419964199541994419934199241991419904198941988419874198641985419844198341982419814198041979419784197741976419754197441973419724197141970419694196841967419664196541964419634196241961419604195941958419574195641955419544195341952419514195041949419484194741946419454194441943419424194141940419394193841937419364193541934419334193241931419304192941928419274192641925419244192341922419214192041919419184191741916419154191441913419124191141910419094190841907419064190541904419034190241901419004189941898418974189641895418944189341892418914189041889418884188741886418854188441883418824188141880418794187841877418764187541874418734187241871418704186941868418674186641865418644186341862418614186041859418584185741856418554185441853418524185141850418494184841847418464184541844418434184241841418404183941838418374183641835418344183341832418314183041829418284182741826418254182441823418224182141820418194181841817418164181541814418134181241811418104180941808418074180641805418044180341802418014180041799417984179741796417954179441793417924179141790417894178841787417864178541784417834178241781417804177941778417774177641775417744177341772417714177041769417684176741766417654176441763417624176141760417594175841757417564175541754417534175241751417504174941748417474174641745417444174341742417414174041739417384173741736417354173441733417324173141730417294172841727417264172541724417234172241721417204171941718417174171641715417144171341712417114171041709417084170741706417054170441703417024170141700416994169841697416964169541694416934169241691416904168941688416874168641685416844168341682416814168041679416784167741676416754167441673416724167141670416694166841667416664166541664416634166241661416604165941658416574165641655416544165341652416514165041649416484164741646416454164441643416424164141640416394163841637416364163541634416334163241631416304162941628416274162641625416244162341622416214162041619416184161741616416154161441613416124161141610416094160841607416064160541604416034160241601416004159941598415974159641595415944159341592415914159041589415884158741586415854158441583415824158141580415794157841577415764157541574415734157241571415704156941568415674156641565415644156341562415614156041559415584155741556415554155441553415524155141550415494154841547415464154541544415434154241541415404153941538415374153641535415344153341532415314153041529415284152741526415254152441523415224152141520415194151841517415164151541514415134151241511415104150941508415074150641505415044150341502415014150041499414984149741496414954149441493414924149141490414894148841487414864148541484414834148241481414804147941478414774147641475414744147341472414714147041469414684146741466414654146441463414624146141460414594145841457414564145541454414534145241451414504144941448414474144641445414444144341442414414144041439414384143741436414354143441433414324143141430414294142841427414264142541424414234142241421414204141941418414174141641415414144141341412414114141041409414084140741406414054140441403414024140141400413994139841397413964139541394413934139241391413904138941388413874138641385413844138341382413814138041379413784137741376413754137441373413724137141370413694136841367413664136541364413634136241361413604135941358413574135641355413544135341352413514135041349413484134741346413454134441343413424134141340413394133841337413364133541334413334133241331413304132941328413274132641325413244132341322413214132041319413184131741316413154131441313413124131141310413094130841307413064130541304413034130241301413004129941298412974129641295412944129341292412914129041289412884128741286412854128441283412824128141280412794127841277412764127541274412734127241271412704126941268412674126641265412644126341262412614126041259412584125741256412554125441253412524125141250412494124841247412464124541244412434124241241412404123941238412374123641235412344123341232412314123041229412284122741226412254122441223412224122141220412194121841217412164121541214412134121241211412104120941208412074120641205412044120341202412014120041199411984119741196411954119441193411924119141190411894118841187411864118541184411834118241181411804117941178411774117641175411744117341172411714117041169411684116741166411654116441163411624116141160411594115841157411564115541154411534115241151411504114941148411474114641145411444114341142411414114041139411384113741136411354113441133411324113141130411294112841127411264112541124411234112241121411204111941118411174111641115411144111341112411114111041109411084110741106411054110441103411024110141100410994109841097410964109541094410934109241091410904108941088410874108641085410844108341082410814108041079410784107741076410754107441073410724107141070410694106841067410664106541064410634106241061410604105941058410574105641055410544105341052410514105041049410484104741046410454104441043410424104141040410394103841037410364103541034410334103241031410304102941028410274102641025410244102341022410214102041019410184101741016410154101441013410124101141010410094100841007410064100541004410034100241001410004099940998409974099640995409944099340992409914099040989409884098740986409854098440983409824098140980409794097840977409764097540974409734097240971409704096940968409674096640965409644096340962409614096040959409584095740956409554095440953409524095140950409494094840947409464094540944409434094240941409404093940938409374093640935409344093340932409314093040929409284092740926409254092440923409224092140920409194091840917409164091540914409134091240911409104090940908409074090640905409044090340902409014090040899408984089740896408954089440893408924089140890408894088840887408864088540884408834088240881408804087940878408774087640875408744087340872408714087040869408684086740866408654086440863408624086140860408594085840857408564085540854408534085240851408504084940848408474084640845408444084340842408414084040839408384083740836408354083440833408324083140830408294082840827408264082540824408234082240821408204081940818408174081640815408144081340812408114081040809408084080740806408054080440803408024080140800407994079840797407964079540794407934079240791407904078940788407874078640785407844078340782407814078040779407784077740776407754077440773407724077140770407694076840767407664076540764407634076240761407604075940758407574075640755407544075340752407514075040749407484074740746407454074440743407424074140740407394073840737407364073540734407334073240731407304072940728407274072640725407244072340722407214072040719407184071740716407154071440713407124071140710407094070840707407064070540704407034070240701407004069940698406974069640695406944069340692406914069040689406884068740686406854068440683406824068140680406794067840677406764067540674406734067240671406704066940668406674066640665406644066340662406614066040659406584065740656406554065440653406524065140650406494064840647406464064540644406434064240641406404063940638406374063640635406344063340632406314063040629406284062740626406254062440623406224062140620406194061840617406164061540614406134061240611406104060940608406074060640605406044060340602406014060040599405984059740596405954059440593405924059140590405894058840587405864058540584405834058240581405804057940578405774057640575405744057340572405714057040569405684056740566405654056440563405624056140560405594055840557405564055540554405534055240551405504054940548405474054640545405444054340542405414054040539405384053740536405354053440533405324053140530405294052840527405264052540524405234052240521405204051940518405174051640515405144051340512405114051040509405084050740506405054050440503405024050140500404994049840497404964049540494404934049240491404904048940488404874048640485404844048340482404814048040479404784047740476404754047440473404724047140470404694046840467404664046540464404634046240461404604045940458404574045640455404544045340452404514045040449404484044740446404454044440443404424044140440404394043840437404364043540434404334043240431404304042940428404274042640425404244042340422404214042040419404184041740416404154041440413404124041140410404094040840407404064040540404404034040240401404004039940398403974039640395403944039340392403914039040389403884038740386403854038440383403824038140380403794037840377403764037540374403734037240371403704036940368403674036640365403644036340362403614036040359403584035740356403554035440353403524035140350403494034840347403464034540344403434034240341403404033940338403374033640335403344033340332403314033040329403284032740326403254032440323403224032140320403194031840317403164031540314403134031240311403104030940308403074030640305403044030340302403014030040299402984029740296402954029440293402924029140290402894028840287402864028540284402834028240281402804027940278402774027640275402744027340272402714027040269402684026740266402654026440263402624026140260402594025840257402564025540254402534025240251402504024940248402474024640245402444024340242402414024040239402384023740236402354023440233402324023140230402294022840227402264022540224402234022240221402204021940218402174021640215402144021340212402114021040209402084020740206402054020440203402024020140200401994019840197401964019540194401934019240191401904018940188401874018640185401844018340182401814018040179401784017740176401754017440173401724017140170401694016840167401664016540164401634016240161401604015940158401574015640155401544015340152401514015040149401484014740146401454014440143401424014140140401394013840137401364013540134401334013240131401304012940128401274012640125401244012340122401214012040119401184011740116401154011440113401124011140110401094010840107401064010540104401034010240101401004009940098400974009640095400944009340092400914009040089400884008740086400854008440083400824008140080400794007840077400764007540074400734007240071400704006940068400674006640065400644006340062400614006040059400584005740056400554005440053400524005140050400494004840047400464004540044400434004240041400404003940038400374003640035400344003340032400314003040029400284002740026400254002440023400224002140020400194001840017400164001540014400134001240011400104000940008400074000640005400044000340002400014000039999399983999739996399953999439993399923999139990399893998839987399863998539984399833998239981399803997939978399773997639975399743997339972399713997039969399683996739966399653996439963399623996139960399593995839957399563995539954399533995239951399503994939948399473994639945399443994339942399413994039939399383993739936399353993439933399323993139930399293992839927399263992539924399233992239921399203991939918399173991639915399143991339912399113991039909399083990739906399053990439903399023990139900398993989839897398963989539894398933989239891398903988939888398873988639885398843988339882398813988039879398783987739876398753987439873398723987139870398693986839867398663986539864398633986239861398603985939858398573985639855398543985339852398513985039849398483984739846398453984439843398423984139840398393983839837398363983539834398333983239831398303982939828398273982639825398243982339822398213982039819398183981739816398153981439813398123981139810398093980839807398063980539804398033980239801398003979939798397973979639795397943979339792397913979039789397883978739786397853978439783397823978139780397793977839777397763977539774397733977239771397703976939768397673976639765397643976339762397613976039759397583975739756397553975439753397523975139750397493974839747397463974539744397433974239741397403973939738397373973639735397343973339732397313973039729397283972739726397253972439723397223972139720397193971839717397163971539714397133971239711397103970939708397073970639705397043970339702397013970039699396983969739696396953969439693396923969139690396893968839687396863968539684396833968239681396803967939678396773967639675396743967339672396713967039669396683966739666396653966439663396623966139660396593965839657396563965539654396533965239651396503964939648396473964639645396443964339642396413964039639396383963739636396353963439633396323963139630396293962839627396263962539624396233962239621396203961939618396173961639615396143961339612396113961039609396083960739606396053960439603396023960139600395993959839597395963959539594395933959239591395903958939588395873958639585395843958339582395813958039579395783957739576395753957439573395723957139570395693956839567395663956539564395633956239561395603955939558395573955639555395543955339552395513955039549395483954739546395453954439543395423954139540395393953839537395363953539534395333953239531395303952939528395273952639525395243952339522395213952039519395183951739516395153951439513395123951139510395093950839507395063950539504395033950239501395003949939498394973949639495394943949339492394913949039489394883948739486394853948439483394823948139480394793947839477394763947539474394733947239471394703946939468394673946639465394643946339462394613946039459394583945739456394553945439453394523945139450394493944839447394463944539444394433944239441394403943939438394373943639435394343943339432394313943039429394283942739426394253942439423394223942139420394193941839417394163941539414394133941239411394103940939408394073940639405394043940339402394013940039399393983939739396393953939439393393923939139390393893938839387393863938539384393833938239381393803937939378393773937639375393743937339372393713937039369393683936739366393653936439363393623936139360393593935839357393563935539354393533935239351393503934939348393473934639345393443934339342393413934039339393383933739336393353933439333393323933139330393293932839327393263932539324393233932239321393203931939318393173931639315393143931339312393113931039309393083930739306393053930439303393023930139300392993929839297392963929539294392933929239291392903928939288392873928639285392843928339282392813928039279392783927739276392753927439273392723927139270392693926839267392663926539264392633926239261392603925939258392573925639255392543925339252392513925039249392483924739246392453924439243392423924139240392393923839237392363923539234392333923239231392303922939228392273922639225392243922339222392213922039219392183921739216392153921439213392123921139210392093920839207392063920539204392033920239201392003919939198391973919639195391943919339192391913919039189391883918739186391853918439183391823918139180391793917839177391763917539174391733917239171391703916939168391673916639165391643916339162391613916039159391583915739156391553915439153391523915139150391493914839147391463914539144391433914239141391403913939138391373913639135391343913339132391313913039129391283912739126391253912439123391223912139120391193911839117391163911539114391133911239111391103910939108391073910639105391043910339102391013910039099390983909739096390953909439093390923909139090390893908839087390863908539084390833908239081390803907939078390773907639075390743907339072390713907039069390683906739066390653906439063390623906139060390593905839057390563905539054390533905239051390503904939048390473904639045390443904339042390413904039039390383903739036390353903439033390323903139030390293902839027390263902539024390233902239021390203901939018390173901639015390143901339012390113901039009390083900739006390053900439003390023900139000389993899838997389963899538994389933899238991389903898938988389873898638985389843898338982389813898038979389783897738976389753897438973389723897138970389693896838967389663896538964389633896238961389603895938958389573895638955389543895338952389513895038949389483894738946389453894438943389423894138940389393893838937389363893538934389333893238931389303892938928389273892638925389243892338922389213892038919389183891738916389153891438913389123891138910389093890838907389063890538904389033890238901389003889938898388973889638895388943889338892388913889038889388883888738886388853888438883388823888138880388793887838877388763887538874388733887238871388703886938868388673886638865388643886338862388613886038859388583885738856388553885438853388523885138850388493884838847388463884538844388433884238841388403883938838388373883638835388343883338832388313883038829388283882738826388253882438823388223882138820388193881838817388163881538814388133881238811388103880938808388073880638805388043880338802388013880038799387983879738796387953879438793387923879138790387893878838787387863878538784387833878238781387803877938778387773877638775387743877338772387713877038769387683876738766387653876438763387623876138760387593875838757387563875538754387533875238751387503874938748387473874638745387443874338742387413874038739387383873738736387353873438733387323873138730387293872838727387263872538724387233872238721387203871938718387173871638715387143871338712387113871038709387083870738706387053870438703387023870138700386993869838697386963869538694386933869238691386903868938688386873868638685386843868338682386813868038679386783867738676386753867438673386723867138670386693866838667386663866538664386633866238661386603865938658386573865638655386543865338652386513865038649386483864738646386453864438643386423864138640386393863838637386363863538634386333863238631386303862938628386273862638625386243862338622386213862038619386183861738616386153861438613386123861138610386093860838607386063860538604386033860238601386003859938598385973859638595385943859338592385913859038589385883858738586385853858438583385823858138580385793857838577385763857538574385733857238571385703856938568385673856638565385643856338562385613856038559385583855738556385553855438553385523855138550385493854838547385463854538544385433854238541385403853938538385373853638535385343853338532385313853038529385283852738526385253852438523385223852138520385193851838517385163851538514385133851238511385103850938508385073850638505385043850338502385013850038499384983849738496384953849438493384923849138490384893848838487384863848538484384833848238481384803847938478384773847638475384743847338472384713847038469384683846738466384653846438463384623846138460384593845838457384563845538454384533845238451384503844938448384473844638445384443844338442384413844038439384383843738436384353843438433384323843138430384293842838427384263842538424384233842238421384203841938418384173841638415384143841338412384113841038409384083840738406384053840438403384023840138400383993839838397383963839538394383933839238391383903838938388383873838638385383843838338382383813838038379383783837738376383753837438373383723837138370383693836838367383663836538364383633836238361383603835938358383573835638355383543835338352383513835038349383483834738346383453834438343383423834138340383393833838337383363833538334383333833238331383303832938328383273832638325383243832338322383213832038319383183831738316383153831438313383123831138310383093830838307383063830538304383033830238301383003829938298382973829638295382943829338292382913829038289382883828738286382853828438283382823828138280382793827838277382763827538274382733827238271382703826938268382673826638265382643826338262382613826038259382583825738256382553825438253382523825138250382493824838247382463824538244382433824238241382403823938238382373823638235382343823338232382313823038229382283822738226382253822438223382223822138220382193821838217382163821538214382133821238211382103820938208382073820638205382043820338202382013820038199381983819738196381953819438193381923819138190381893818838187381863818538184381833818238181381803817938178381773817638175381743817338172381713817038169381683816738166381653816438163381623816138160381593815838157381563815538154381533815238151381503814938148381473814638145381443814338142381413814038139381383813738136381353813438133381323813138130381293812838127381263812538124381233812238121381203811938118381173811638115381143811338112381113811038109381083810738106381053810438103381023810138100380993809838097380963809538094380933809238091380903808938088380873808638085380843808338082380813808038079380783807738076380753807438073380723807138070380693806838067380663806538064380633806238061380603805938058380573805638055380543805338052380513805038049380483804738046380453804438043380423804138040380393803838037380363803538034380333803238031380303802938028380273802638025380243802338022380213802038019380183801738016380153801438013380123801138010380093800838007380063800538004380033800238001380003799937998379973799637995379943799337992379913799037989379883798737986379853798437983379823798137980379793797837977379763797537974379733797237971379703796937968379673796637965379643796337962379613796037959379583795737956379553795437953379523795137950379493794837947379463794537944379433794237941379403793937938379373793637935379343793337932379313793037929379283792737926379253792437923379223792137920379193791837917379163791537914379133791237911379103790937908379073790637905379043790337902379013790037899378983789737896378953789437893378923789137890378893788837887378863788537884378833788237881378803787937878378773787637875378743787337872378713787037869378683786737866378653786437863378623786137860378593785837857378563785537854378533785237851378503784937848378473784637845378443784337842378413784037839378383783737836378353783437833378323783137830378293782837827378263782537824378233782237821378203781937818378173781637815378143781337812378113781037809378083780737806378053780437803378023780137800377993779837797377963779537794377933779237791377903778937788377873778637785377843778337782377813778037779377783777737776377753777437773377723777137770377693776837767377663776537764377633776237761377603775937758377573775637755377543775337752377513775037749377483774737746377453774437743377423774137740377393773837737377363773537734377333773237731377303772937728377273772637725377243772337722377213772037719377183771737716377153771437713377123771137710377093770837707377063770537704377033770237701377003769937698376973769637695376943769337692376913769037689376883768737686376853768437683376823768137680376793767837677376763767537674376733767237671376703766937668376673766637665376643766337662376613766037659376583765737656376553765437653376523765137650376493764837647376463764537644376433764237641376403763937638376373763637635376343763337632376313763037629376283762737626376253762437623376223762137620376193761837617376163761537614376133761237611376103760937608376073760637605376043760337602376013760037599375983759737596375953759437593375923759137590375893758837587375863758537584375833758237581375803757937578375773757637575375743757337572375713757037569375683756737566375653756437563375623756137560375593755837557375563755537554375533755237551375503754937548375473754637545375443754337542375413754037539375383753737536375353753437533375323753137530375293752837527375263752537524375233752237521375203751937518375173751637515375143751337512375113751037509375083750737506375053750437503375023750137500374993749837497374963749537494374933749237491374903748937488374873748637485374843748337482374813748037479374783747737476374753747437473374723747137470374693746837467374663746537464374633746237461374603745937458374573745637455374543745337452374513745037449374483744737446374453744437443374423744137440374393743837437374363743537434374333743237431374303742937428374273742637425374243742337422374213742037419374183741737416374153741437413374123741137410374093740837407374063740537404374033740237401374003739937398373973739637395373943739337392373913739037389373883738737386373853738437383373823738137380373793737837377373763737537374373733737237371373703736937368373673736637365373643736337362373613736037359373583735737356373553735437353373523735137350373493734837347373463734537344373433734237341373403733937338373373733637335373343733337332373313733037329373283732737326373253732437323373223732137320373193731837317373163731537314373133731237311373103730937308373073730637305373043730337302373013730037299372983729737296372953729437293372923729137290372893728837287372863728537284372833728237281372803727937278372773727637275372743727337272372713727037269372683726737266372653726437263372623726137260372593725837257372563725537254372533725237251372503724937248372473724637245372443724337242372413724037239372383723737236372353723437233372323723137230372293722837227372263722537224372233722237221372203721937218372173721637215372143721337212372113721037209372083720737206372053720437203372023720137200371993719837197371963719537194371933719237191371903718937188371873718637185371843718337182371813718037179371783717737176371753717437173371723717137170371693716837167371663716537164371633716237161371603715937158371573715637155371543715337152371513715037149371483714737146371453714437143371423714137140371393713837137371363713537134371333713237131371303712937128371273712637125371243712337122371213712037119371183711737116371153711437113371123711137110371093710837107371063710537104371033710237101371003709937098370973709637095370943709337092370913709037089370883708737086370853708437083370823708137080370793707837077370763707537074370733707237071370703706937068370673706637065370643706337062370613706037059370583705737056370553705437053370523705137050370493704837047370463704537044370433704237041370403703937038370373703637035370343703337032370313703037029370283702737026370253702437023370223702137020370193701837017370163701537014370133701237011370103700937008370073700637005370043700337002370013700036999369983699736996369953699436993369923699136990369893698836987369863698536984369833698236981369803697936978369773697636975369743697336972369713697036969369683696736966369653696436963369623696136960369593695836957369563695536954369533695236951369503694936948369473694636945369443694336942369413694036939369383693736936369353693436933369323693136930369293692836927369263692536924369233692236921369203691936918369173691636915369143691336912369113691036909369083690736906369053690436903369023690136900368993689836897368963689536894368933689236891368903688936888368873688636885368843688336882368813688036879368783687736876368753687436873368723687136870368693686836867368663686536864368633686236861368603685936858368573685636855368543685336852368513685036849368483684736846368453684436843368423684136840368393683836837368363683536834368333683236831368303682936828368273682636825368243682336822368213682036819368183681736816368153681436813368123681136810368093680836807368063680536804368033680236801368003679936798367973679636795367943679336792367913679036789367883678736786367853678436783367823678136780367793677836777367763677536774367733677236771367703676936768367673676636765367643676336762367613676036759367583675736756367553675436753367523675136750367493674836747367463674536744367433674236741367403673936738367373673636735367343673336732367313673036729367283672736726367253672436723367223672136720367193671836717367163671536714367133671236711367103670936708367073670636705367043670336702367013670036699366983669736696366953669436693366923669136690366893668836687366863668536684366833668236681366803667936678366773667636675366743667336672366713667036669366683666736666366653666436663366623666136660366593665836657366563665536654366533665236651366503664936648366473664636645366443664336642366413664036639366383663736636366353663436633366323663136630366293662836627366263662536624366233662236621366203661936618366173661636615366143661336612366113661036609366083660736606366053660436603366023660136600365993659836597365963659536594365933659236591365903658936588365873658636585365843658336582365813658036579365783657736576365753657436573365723657136570365693656836567365663656536564365633656236561365603655936558365573655636555365543655336552365513655036549365483654736546365453654436543365423654136540365393653836537365363653536534365333653236531365303652936528365273652636525365243652336522365213652036519365183651736516365153651436513365123651136510365093650836507365063650536504365033650236501365003649936498364973649636495364943649336492364913649036489364883648736486364853648436483364823648136480364793647836477364763647536474364733647236471364703646936468364673646636465364643646336462364613646036459364583645736456364553645436453364523645136450364493644836447364463644536444364433644236441364403643936438364373643636435364343643336432364313643036429364283642736426364253642436423364223642136420364193641836417364163641536414364133641236411364103640936408364073640636405364043640336402364013640036399363983639736396363953639436393363923639136390363893638836387363863638536384363833638236381363803637936378363773637636375363743637336372363713637036369363683636736366363653636436363363623636136360363593635836357363563635536354363533635236351363503634936348363473634636345363443634336342363413634036339363383633736336363353633436333363323633136330363293632836327363263632536324363233632236321363203631936318363173631636315363143631336312363113631036309363083630736306363053630436303363023630136300362993629836297362963629536294362933629236291362903628936288362873628636285362843628336282362813628036279362783627736276362753627436273362723627136270362693626836267362663626536264362633626236261362603625936258362573625636255362543625336252362513625036249362483624736246362453624436243362423624136240362393623836237362363623536234362333623236231362303622936228362273622636225362243622336222362213622036219362183621736216362153621436213362123621136210362093620836207362063620536204362033620236201362003619936198361973619636195361943619336192361913619036189361883618736186361853618436183361823618136180361793617836177361763617536174361733617236171361703616936168361673616636165361643616336162361613616036159361583615736156361553615436153361523615136150361493614836147361463614536144361433614236141361403613936138361373613636135361343613336132361313613036129361283612736126361253612436123361223612136120361193611836117361163611536114361133611236111361103610936108361073610636105361043610336102361013610036099360983609736096360953609436093360923609136090360893608836087360863608536084360833608236081360803607936078360773607636075360743607336072360713607036069360683606736066360653606436063360623606136060360593605836057360563605536054360533605236051360503604936048360473604636045360443604336042360413604036039360383603736036360353603436033360323603136030360293602836027360263602536024360233602236021360203601936018360173601636015360143601336012360113601036009360083600736006360053600436003360023600136000359993599835997359963599535994359933599235991359903598935988359873598635985359843598335982359813598035979359783597735976359753597435973359723597135970359693596835967359663596535964359633596235961359603595935958359573595635955359543595335952359513595035949359483594735946359453594435943359423594135940359393593835937359363593535934359333593235931359303592935928359273592635925359243592335922359213592035919359183591735916359153591435913359123591135910359093590835907359063590535904359033590235901359003589935898358973589635895358943589335892358913589035889358883588735886358853588435883358823588135880358793587835877358763587535874358733587235871358703586935868358673586635865358643586335862358613586035859358583585735856358553585435853358523585135850358493584835847358463584535844358433584235841358403583935838358373583635835358343583335832358313583035829358283582735826358253582435823358223582135820358193581835817358163581535814358133581235811358103580935808358073580635805358043580335802358013580035799357983579735796357953579435793357923579135790357893578835787357863578535784357833578235781357803577935778357773577635775357743577335772357713577035769357683576735766357653576435763357623576135760357593575835757357563575535754357533575235751357503574935748357473574635745357443574335742357413574035739357383573735736357353573435733357323573135730357293572835727357263572535724357233572235721357203571935718357173571635715357143571335712357113571035709357083570735706357053570435703357023570135700356993569835697356963569535694356933569235691356903568935688356873568635685356843568335682356813568035679356783567735676356753567435673356723567135670356693566835667356663566535664356633566235661356603565935658356573565635655356543565335652356513565035649356483564735646356453564435643356423564135640356393563835637356363563535634356333563235631356303562935628356273562635625356243562335622356213562035619356183561735616356153561435613356123561135610356093560835607356063560535604356033560235601356003559935598355973559635595355943559335592355913559035589355883558735586355853558435583355823558135580355793557835577355763557535574355733557235571355703556935568355673556635565355643556335562355613556035559355583555735556355553555435553355523555135550355493554835547355463554535544355433554235541355403553935538355373553635535355343553335532355313553035529355283552735526355253552435523355223552135520355193551835517355163551535514355133551235511355103550935508355073550635505355043550335502355013550035499354983549735496354953549435493354923549135490354893548835487354863548535484354833548235481354803547935478354773547635475354743547335472354713547035469354683546735466354653546435463354623546135460354593545835457354563545535454354533545235451354503544935448354473544635445354443544335442354413544035439354383543735436354353543435433354323543135430354293542835427354263542535424354233542235421354203541935418354173541635415354143541335412354113541035409354083540735406354053540435403354023540135400353993539835397353963539535394353933539235391353903538935388353873538635385353843538335382353813538035379353783537735376353753537435373353723537135370353693536835367353663536535364353633536235361353603535935358353573535635355353543535335352353513535035349353483534735346353453534435343353423534135340353393533835337353363533535334353333533235331353303532935328353273532635325353243532335322353213532035319353183531735316353153531435313353123531135310353093530835307353063530535304353033530235301353003529935298352973529635295352943529335292352913529035289352883528735286352853528435283352823528135280352793527835277352763527535274352733527235271352703526935268352673526635265352643526335262352613526035259352583525735256352553525435253352523525135250352493524835247352463524535244352433524235241352403523935238352373523635235352343523335232352313523035229352283522735226352253522435223352223522135220352193521835217352163521535214352133521235211352103520935208352073520635205352043520335202352013520035199351983519735196351953519435193351923519135190351893518835187351863518535184351833518235181351803517935178351773517635175351743517335172351713517035169351683516735166351653516435163351623516135160351593515835157351563515535154351533515235151351503514935148351473514635145351443514335142351413514035139351383513735136351353513435133351323513135130351293512835127351263512535124351233512235121351203511935118351173511635115351143511335112351113511035109351083510735106351053510435103351023510135100350993509835097350963509535094350933509235091350903508935088350873508635085350843508335082350813508035079350783507735076350753507435073350723507135070350693506835067