{"id":85697,"date":"2020-06-18T13:42:52","date_gmt":"2020-06-18T11:42:52","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/chto-takoe-service-mesh"},"modified":"2020-06-18T13:42:52","modified_gmt":"2020-06-18T11:42:52","slug":"chto-takoe-service-mesh","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/chto-takoe-service-mesh","title":{"rendered":"\u0160to je Service Mesh?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><b><i>Ponovo pozdravljamo!.. Uo\u010di po\u010detka te\u010daja <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/UNlX\/\">\u00abArhitekt softvera\u00bb<\/a><\/noindex> pripremili smo jo\u0161 jedan koristan prijevod.<\/i><\/b><\/p>\n<p><img decoding=\"async\" alt=\"\u0160to je Service Mesh?\" src=\"\/wp-content\/uploads\/2020\/06\/afc53e48443ce4a402b6b1cba1184e6c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n Service Mesh je konfigurabilni infrastrukturni sloj s niskom latencijom koji je potreban za obradu velikih koli\u010dina mre\u017enih me\u0111uprocesnih komunikacija izme\u0111u aplikacijskih su\u010delja (API). Service Mesh osigurava brzu, pouzdanu i sigurnu komunikaciju izme\u0111u kontejneriziranih i \u010desto efemernih servisa infrastrukturnih aplikacija. Service Mesh pru\u017ea mogu\u0107nosti kao \u0161to su otkrivanje servisa, ravnote\u017ea optere\u0107enja, enkripcija, prozirnost, pra\u0107enje, autentifikacija i autorizacija, kao i podr\u0161ku za uzorak automatskog prekida\u010da (<i>circuit breaker<\/i>).<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n Service Mesh se obi\u010dno implementira pru\u017eanjem svakom instancu servisa instancu proxyja, koja se naziva <i>Sidecar. Sidecar<\/i> obra\u0111uje komunikacije izme\u0111u servisa, provodi pra\u0107enje i rje\u0161ava probleme sigurnosti, tj. sve \u0161to mo\u017ee biti apstrahirano od pojedina\u010dnih servisa. Na taj na\u010din, programeri mogu pisati, odr\u017eavati i upravljati kodom aplikacije unutar servisa, dok sistemski administratori mogu raditi sa Service Meshom i pokretati aplikaciju.<\/p>\n<p>Istio od Googlea, IBM-a i Lyft-a trenutno je najpoznatija arhitektura Service Mesh. Kubernetes, koji je izvorno razvijen u Googleu, sada je jedini okvir za orkestraciju kontejnera koji podr\u017eava Istio. Dobavlja\u010di poku\u0161avaju stvoriti komercijalne verzije Istio s podr\u0161kom. Zanimljivo je \u0161to \u0107e novoga mo\u0107i unijeti u projekat otvorenog koda.<\/p>\n<p>Me\u0111utim, Istio nije jedina opcija, jer se razvijaju i druge implementacije Service Mesh. Uzorak <code>sidecar proxy<\/code> je najpopularnija implementacija, sude\u0107i prema projektima poput Buoyant, HashiCorp, Solo.io i drugih. Postoje i alternativne arhitekture: tehnolo\u0161ki alat Netflix je jedan od pristupa, gdje se funkcionalnost Service Mesh ostvaruje putem biblioteka Ribbon, Hysterix, Eureka, Archaius, kao i takvih platformi kao \u0161to je Azure Service Fabric.<\/p>\n<p>Service Mesh tako\u0111er ima svoju vlastitu terminologiju za komponente-servise i funkcije:<\/p>\n<ul>\n<li><b>Okvir za orkestraciju kontejnera<\/b>. Kako se sve vi\u0161e kontejnera dodaje u infrastrukturu aplikacije, pojavljuje se potreba za posebnim alatom za pra\u0107enje i upravljanje kontejnerima \u2013 okvirom za orkestraciju kontejnera. Kubernetes je \u010dvrsto zauzeo ovu ni\u0161u, toliko da \u010dak i njegovi glavni konkurenti Docker Swarm i Mesosphere DC\/OS nude integraciju s Kubernetesom kao alternativu.<\/li>\n<li><b>Usluge i instance (Kubernetes podovi)<\/b>. Instanca je jedina pokrenuta kopija mikroslu\u017ebe. Ponekad jedna instanca predstavlja jedan kontejner. U Kubernetesu, instanca se sastoji od male grupe neovisnih kontejnera, koja se naziva pod. Klijenti rijetko direktno pristupaju instanci ili podu, \u010de\u0161\u0107e se obra\u0107aju usluzi koja predstavlja skup identi\u010dnih, skalabilnih i otpornih instanci ili podova (replika).<\/li>\n<li><b>Sidecar Proxy<\/b>. Sidecar Proxy radi s jednom instancom ili podom. Su\u0161tina Sidecar Proxy-a je usmjeravanje ili proksiranje prometa koji dolazi od kontejnera s kojim radi, kao i povratni promet. Sidecar komunicira s drugim Sidecar Proxy-ima i upravlja njime okvir orkestracije. Mnoge implementacije Service Mesh-a koriste Sidecar Proxy za presretanje i upravljanje sav ulaznim i izlaznim prometom instance ili poda.<\/li>\n<li><b>Otkrivanje usluga<\/b>. Kada instanci treba komunicirati s drugom uslugom, treba prona\u0107i (otkriti) ispravnu i dostupnu instancu te druge usluge. Obi\u010dno instanca izvr\u0161ava pretragu putem DNS-a. Okvir orkestracije kontejnera dr\u017ei popis instanci koje su spremne primati zahtjeve i pru\u017ea su\u010delje za DNS-upite.<\/li>\n<li><b>Upravljanje optere\u0107enjem<\/b>. Ve\u0107ina okvira za orkestraciju kontejnera osigurava upravljanje optere\u0107enjem na 4. razini (transport). Service Mesh implementira slo\u017eenije upravljanje optere\u0107enjem na 7. razini (aplikacijskoj), bogatije algoritmima i u\u010dinkovitije u upravljanju prometom. Parametri upravljanja optere\u0107enjem mogu se mijenjati putem API-ja, \u0161to omogu\u0107ava orkestraciju blue-green ili kanarinskog implementiranja.<\/li>\n<li><b>Enkripcija<\/b>. Service Mesh mo\u017ee \u0161ifrirati i de\u0161ifrirati zahtjeve i odgovore, sklanjaju\u0107i to optere\u0107enje s usluga. Service Mesh tako\u0111er mo\u017ee pobolj\u0161ati performanse prioritetiziranjem ili ponovnim kori\u0161tenjem postoje\u0107ih trajnih veza, smanjuju\u0107i potrebu za skupim izra\u010dunima za postavljanje novih veza. Naj\u010de\u0161\u0107a implementacija \u0161ifriranja prometa je <i>mutual TLS (mTLS)<\/i>, gdje infrastruktura javnog klju\u010da (PKI) generira i distribuira certifikate i klju\u010deve za kori\u0161tenje u Sidecar Proxy.<\/li>\n<li><b>Autentikacija i autorizacija<\/b>. Service Mesh mo\u017ee autorizirati i autentificirati zahtjeve upu\u0107ene izvana ili iznutra aplikacije, \u0161alju\u0107i instancama samo validirane zahtjeve.<\/li>\n<li><b>Podr\u0161ka za obrazac automatskog isklju\u010divanja<\/b>. Service Mesh podr\u017eava <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/microservices-reference-architecture-nginx-circuit-breaker-pattern\/\">obrazac automatskog isklju\u010divanja<\/a><\/noindex>, koji izolira nezdrave instance, a zatim ih postupno vra\u0107a u skup zdravih instanci po potrebi.<\/li>\n<\/ul>\n<p>\nOnaj dio aplikacije Service Mesh koji upravlja mre\u017enim prometom izme\u0111u instanci se zove <i>Data Plane<\/i>. Kreiranje i implementacija konfiguracije koja upravlja pona\u0161anjem <i>Data Plane<\/i>, obavlja se pomo\u0107u odvojenog <i>Control Plane<\/i>. <i>Control Plane<\/i> koji obi\u010dno uklju\u010duje ili je osmi\u0161ljen da se pove\u017ee s API, CLI ili GUI za upravljanje aplikacijom.<\/p>\n<p><img decoding=\"async\" alt=\"\u0160to je Service Mesh?\" src=\"\/wp-content\/uploads\/2020\/06\/130fe71904f72a76dfe8e8dbc405e498.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Control Plane u Service Mesh distribuira konfiguraciju izme\u0111u Sidecar Proxy i Data Plane.<\/i><\/p>\n<p>\u010cesto se arhitektura Service Mesh primjenjuje za rje\u0161avanje slo\u017eenih operativnih zadataka s kori\u0161tenjem kontejnera i mikroservisa. Pioni\u0107i u podru\u010dju <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/introduction-to-microservices\/\">mikroservisa<\/a><\/noindex> su takve tvrtke kao \u0161to su Lyft, Netflix i Twitter, koje pru\u017eaju stabilno funkcionalne usluge milijunima korisnika \u0161irom svijeta. (<noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/microservices-at-netflix-architectural-best-practices\/\">Ovdje se mo\u017eete upoznati s detaljnim opisom nekih arhitektonskih zadataka s kojima se suo\u010dio Netflix<\/a><\/noindex>). Za manje zahtjevne aplikacijske zadatke vjerojatno \u0107e biti dovoljni jednostavniji obrasci.<\/p>\n<p>Arhitektura Service Mesh vjerojatno nikada ne\u0107e biti odgovor na sva pitanja vezana uz rad aplikacija i njihovu isporuku. Arhitekti i programeri imaju ogroman arsenal alata, a samo jedan od njih \u2014 \u010deki\u0107, koji me\u0111u brojnim zadacima treba rje\u0161avati samo jedan \u2014 zakucavanje \u010davala. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/introducing-the-nginx-microservices-reference-architecture\/\">Referentna arhitektura mikroservisa od NGINX<\/a><\/noindex>, na primjer, uklju\u010duje nekoliko razli\u010ditih modela koji nude kontinuirani spektar pristupa rje\u0161avanju problema putem mikroslu\u017ebi.<\/p>\n<p>Elementi koji se povezuju u arhitekturi Service Mesh, kao \u0161to su NGINX, kontejneri, Kubernetes i mikroslu\u017ebe kao arhitektonski pristup, mogu se jednako produktivno koristiti i u realizacijama bez Service Mesh. Na primjer, Istio je razvijen kao sveobuhvatna arhitektura Service Mesh, ali modularnost sugerira da razvija\u010di mogu birati i primjenjivati samo one komponente tehnologije koje su im potrebne. Imaju\u0107i to na umu, potrebno je oblikovati jasno razumijevanje koncepta Service Mesh, \u010dak i ako niste sigurni da li \u0107ete ga ikada mo\u0107i potpuno implementirati u aplikaciji.<\/p>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/UNlX\/\">Modularni monoliti i DDD<\/a><\/noindex><\/p>\n<p>Izvor: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/506916\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0418 \u0441\u043d\u043e\u0432\u0430 \u0437\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435!.. \u0412 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043a\u0443\u0440\u0441\u0430 \u00ab\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u043e\u0440 \u041f\u041e\u00bb \u043c\u044b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0438 \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0432\u043e\u0434. Service Mesh \u2013 \u044d\u0442\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441 \u043d\u0438\u0437\u043a\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043c\u0430 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043c\u0435\u0436\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043d\u044b\u0445 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (API). Service Mesh \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0443\u044e, \u043d\u0430\u0434\u0451\u0436\u043d\u0443\u044e \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0443\u044e \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u044e \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0438 \u0447\u0430\u0441\u0442\u043e \u044d\u0444\u0435\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":85698,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-85697","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0418 \u0441\u043d\u043e\u0432\u0430 \u0437\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435!..\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/chto-takoe-service-mesh\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Service Mesh? | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0418 \u0441\u043d\u043e\u0432\u0430 \u0437\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435!..\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/chto-takoe-service-mesh\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-06-18T11:42:52+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-06-18T11:42:52+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47\u0160to je Service Mesh? | ProHoster","description":"I opet, zdravo!..","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/chto-takoe-service-mesh","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Service Mesh? | ProHoster","og:description":"\u0418 \u0441\u043d\u043e\u0432\u0430 \u0437\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435!..","og:url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/chto-takoe-service-mesh","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-06-18T11:42:52+00:00","article:modified_time":"2020-06-18T11:42:52+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"85697","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 14:32:46","updated":"2022-09-28 09:55:06","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/85697","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=85697"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/85697\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/85698"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=85697"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=85697"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=85697"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}