{"id":23157,"date":"2015-07-24T12:04:56","date_gmt":"2015-07-24T06:34:56","guid":{"rendered":"http:\/\/www.tothenew.com\/blog\/?p=23157"},"modified":"2015-07-24T13:47:18","modified_gmt":"2015-07-24T08:17:18","slug":"when-details-in-principal-object-of-spring-security-are-not-sufficient","status":"publish","type":"post","link":"https:\/\/www.tothenew.com\/blog\/when-details-in-principal-object-of-spring-security-are-not-sufficient\/","title":{"rendered":"When details in principal object of spring security are not sufficient"},"content":{"rendered":"<p>Sometimes we need to access details of current logged in user but that will be an additional database query. To save that query we can use principal object of Spring security which provides details of logged in user . But by default principal object have few fields like id, username and password.<\/p>\n<p>If we need to access user&#8217;s name \/ email Id or any other field of user then we have to make a database query. To save this query we can add more details in principal object.<\/p>\n<p>Spring security returns instance of GrailsUser. We can add more fields in grails user by extending it and creating a new class having more fields which are required. To achieve this, following are the changes need to be done:<\/p>\n<p>1. Create a new class which will extend GrailsUser and will have required additional fields.<\/p>\n<p>[code language=&#8221;java&#8221;]<br \/>\nclass MyOwnGrailsUser extends GrailsUser {<br \/>\n  String emailId, userNameToDisplay  \/\/ additional fields<br \/>\n public MyOwnGrailsUser(User user, Collection authorities) {<br \/>\n  super(user.username, user.password, user.enabled, !user.accountExpired,<br \/>\n  !user.passwordExpired, !user.accountLocked, authorities, user.id);<br \/>\n  this.emailId = user.emailId<br \/>\n  this.userNameToDisplay = user.userNameToDisplay<br \/>\n }<br \/>\n}<br \/>\n[\/code]<\/p>\n<p>2. We need to implement interface GrailsUserDetailsService to return instance of MyOwnGrailsUser.<br \/>\nFor implementing GrailsUserDetailsService we need to override loadUserByUsername method which will return instance of MyOwnGrailsUser class.<\/p>\n<p>[code language=&#8221;java&#8221;]<br \/>\nclass MyOwnUserDetailsService implements GrailsUserDetailsService {<br \/>\n  UserDetails loadUserByUsername(String username, boolean loadRoles)<br \/>\n  throws UsernameNotFoundException {<br \/>\n  User user = User.findByUsername(username)<br \/>\n  def authorities = user.authorities.collect { new GrantedAuthorityImpl(it.authority) }<br \/>\n  return MyOwnGrailsUser(user,authorities)<br \/>\n }<br \/>\n}<br \/>\n[\/code]<\/p>\n<p>3. Also update resources.groovy for new bean of MyOwnUserDetailsService.<\/p>\n<p>[code language=&#8221;java&#8221;]<br \/>\nbeans = {<br \/>\n userDetailsService(MyOwnUserDetailsService)<br \/>\n}<br \/>\n[\/code]<\/p>\n<p>Now whenever we use springSecurityService.principal to get principal object it will return instance of our MyOwnGrailsUser class with additional fields.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sometimes we need to access details of current logged in user but that will be an additional database query. To save that query we can use principal object of Spring security which provides details of logged in user . But by default principal object have few fields like id, username and password. If we need [&hellip;]<\/p>\n","protected":false},"author":180,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":12,"footnotes":""},"categories":[7,1],"tags":[4840,4844,477,4841,672],"class_list":["post-23157","post","type-post","status-publish","format-standard","hentry","category-grails","category-technology","tag-grails","tag-java","tag-optimization","tag-spring","tag-spring-security"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Sometimes we need to access details of current logged in user but that will be an additional database query. To save that query we can use principal object of Spring security which provides details of logged in user . But by default principal object have few fields like id, username and password. If we need\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Lovin Saini\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.tothenew.com\/blog\/when-details-in-principal-object-of-spring-security-are-not-sufficient\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"TO THE NEW BLOG\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"When details in principal object of spring security are not sufficient | TO THE NEW Blog\" \/>\n\t\t<meta property=\"og:description\" content=\"Sometimes we need to access details of current logged in user but that will be an additional database query. To save that query we can use principal object of Spring security which provides details of logged in user . But by default principal object have few fields like id, username and password. If we need\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.tothenew.com\/blog\/when-details-in-principal-object-of-spring-security-are-not-sufficient\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/www.tothenew.com\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/www.tothenew.com\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png\" \/>\n\t\t<meta property=\"article:tag\" content=\"grails\" \/>\n\t\t<meta property=\"article:tag\" content=\"technology\" \/>\n\t\t<meta property=\"article:tag\" content=\"java\" \/>\n\t\t<meta property=\"article:tag\" content=\"optimization\" \/>\n\t\t<meta property=\"article:tag\" content=\"spring\" \/>\n\t\t<meta property=\"article:tag\" content=\"spring security\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2015-07-24T06:34:56+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2015-07-24T08:17:18+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@tothenew\" \/>\n\t\t<meta name=\"twitter:title\" content=\"When details in principal object of spring security are not sufficient | TO THE NEW Blog\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Sometimes we need to access details of current logged in user but that will be an additional database query. To save that query we can use principal object of Spring security which provides details of logged in user . But by default principal object have few fields like id, username and password. If we need\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/www.tothenew.com\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/when-details-in-principal-object-of-spring-security-are-not-sufficient\\\/#article\",\"name\":\"When details in principal object of spring security are not sufficient | TO THE NEW Blog\",\"headline\":\"When details in principal object of spring security are not sufficient\",\"author\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/lovin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#organization\"},\"datePublished\":\"2015-07-24T12:04:56+05:30\",\"dateModified\":\"2015-07-24T13:47:18+05:30\",\"inLanguage\":\"en-US\",\"commentCount\":2,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/when-details-in-principal-object-of-spring-security-are-not-sufficient\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/when-details-in-principal-object-of-spring-security-are-not-sufficient\\\/#webpage\"},\"articleSection\":\"Grails, Technology, Grails, Java, optimization, Spring, spring security\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/when-details-in-principal-object-of-spring-security-are-not-sufficient\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.tothenew.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/technology\\\/#listItem\",\"name\":\"Technology\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/technology\\\/#listItem\",\"position\":2,\"name\":\"Technology\",\"item\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/technology\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/when-details-in-principal-object-of-spring-security-are-not-sufficient\\\/#listItem\",\"name\":\"When details in principal object of spring security are not sufficient\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/when-details-in-principal-object-of-spring-security-are-not-sufficient\\\/#listItem\",\"position\":3,\"name\":\"When details in principal object of spring security are not sufficient\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/technology\\\/#listItem\",\"name\":\"Technology\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#organization\",\"name\":\"TO THE NEW Blog\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/lovin\\\/#author\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/lovin\\\/\",\"name\":\"Lovin Saini\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/when-details-in-principal-object-of-spring-security-are-not-sufficient\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3167e13a82471322a375185207258a9b3a50f780ff53cad7288d42897edd6bf9?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Lovin Saini\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/when-details-in-principal-object-of-spring-security-are-not-sufficient\\\/#webpage\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/when-details-in-principal-object-of-spring-security-are-not-sufficient\\\/\",\"name\":\"When details in principal object of spring security are not sufficient | TO THE NEW Blog\",\"description\":\"Sometimes we need to access details of current logged in user but that will be an additional database query. To save that query we can use principal object of Spring security which provides details of logged in user . But by default principal object have few fields like id, username and password. If we need\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/when-details-in-principal-object-of-spring-security-are-not-sufficient\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/lovin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/lovin\\\/#author\"},\"datePublished\":\"2015-07-24T12:04:56+05:30\",\"dateModified\":\"2015-07-24T13:47:18+05:30\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/\",\"name\":\"TO THE NEW Blog\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"When details in principal object of spring security are not sufficient | TO THE NEW Blog","description":"Sometimes we need to access details of current logged in user but that will be an additional database query. To save that query we can use principal object of Spring security which provides details of logged in user . But by default principal object have few fields like id, username and password. If we need","canonical_url":"https:\/\/www.tothenew.com\/blog\/when-details-in-principal-object-of-spring-security-are-not-sufficient\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.tothenew.com\/blog\/when-details-in-principal-object-of-spring-security-are-not-sufficient\/#article","name":"When details in principal object of spring security are not sufficient | TO THE NEW Blog","headline":"When details in principal object of spring security are not sufficient","author":{"@id":"https:\/\/www.tothenew.com\/blog\/author\/lovin\/#author"},"publisher":{"@id":"https:\/\/www.tothenew.com\/blog\/#organization"},"datePublished":"2015-07-24T12:04:56+05:30","dateModified":"2015-07-24T13:47:18+05:30","inLanguage":"en-US","commentCount":2,"mainEntityOfPage":{"@id":"https:\/\/www.tothenew.com\/blog\/when-details-in-principal-object-of-spring-security-are-not-sufficient\/#webpage"},"isPartOf":{"@id":"https:\/\/www.tothenew.com\/blog\/when-details-in-principal-object-of-spring-security-are-not-sufficient\/#webpage"},"articleSection":"Grails, Technology, Grails, Java, optimization, Spring, spring security"},{"@type":"BreadcrumbList","@id":"https:\/\/www.tothenew.com\/blog\/when-details-in-principal-object-of-spring-security-are-not-sufficient\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.tothenew.com\/blog#listItem","position":1,"name":"Home","item":"https:\/\/www.tothenew.com\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/www.tothenew.com\/blog\/category\/technology\/#listItem","name":"Technology"}},{"@type":"ListItem","@id":"https:\/\/www.tothenew.com\/blog\/category\/technology\/#listItem","position":2,"name":"Technology","item":"https:\/\/www.tothenew.com\/blog\/category\/technology\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.tothenew.com\/blog\/when-details-in-principal-object-of-spring-security-are-not-sufficient\/#listItem","name":"When details in principal object of spring security are not sufficient"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.tothenew.com\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.tothenew.com\/blog\/when-details-in-principal-object-of-spring-security-are-not-sufficient\/#listItem","position":3,"name":"When details in principal object of spring security are not sufficient","previousItem":{"@type":"ListItem","@id":"https:\/\/www.tothenew.com\/blog\/category\/technology\/#listItem","name":"Technology"}}]},{"@type":"Organization","@id":"https:\/\/www.tothenew.com\/blog\/#organization","name":"TO THE NEW Blog","url":"https:\/\/www.tothenew.com\/blog\/"},{"@type":"Person","@id":"https:\/\/www.tothenew.com\/blog\/author\/lovin\/#author","url":"https:\/\/www.tothenew.com\/blog\/author\/lovin\/","name":"Lovin Saini","image":{"@type":"ImageObject","@id":"https:\/\/www.tothenew.com\/blog\/when-details-in-principal-object-of-spring-security-are-not-sufficient\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/3167e13a82471322a375185207258a9b3a50f780ff53cad7288d42897edd6bf9?s=96&d=mm&r=g","width":96,"height":96,"caption":"Lovin Saini"}},{"@type":"WebPage","@id":"https:\/\/www.tothenew.com\/blog\/when-details-in-principal-object-of-spring-security-are-not-sufficient\/#webpage","url":"https:\/\/www.tothenew.com\/blog\/when-details-in-principal-object-of-spring-security-are-not-sufficient\/","name":"When details in principal object of spring security are not sufficient | TO THE NEW Blog","description":"Sometimes we need to access details of current logged in user but that will be an additional database query. To save that query we can use principal object of Spring security which provides details of logged in user . But by default principal object have few fields like id, username and password. If we need","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.tothenew.com\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/www.tothenew.com\/blog\/when-details-in-principal-object-of-spring-security-are-not-sufficient\/#breadcrumblist"},"author":{"@id":"https:\/\/www.tothenew.com\/blog\/author\/lovin\/#author"},"creator":{"@id":"https:\/\/www.tothenew.com\/blog\/author\/lovin\/#author"},"datePublished":"2015-07-24T12:04:56+05:30","dateModified":"2015-07-24T13:47:18+05:30"},{"@type":"WebSite","@id":"https:\/\/www.tothenew.com\/blog\/#website","url":"https:\/\/www.tothenew.com\/blog\/","name":"TO THE NEW Blog","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.tothenew.com\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"TO THE NEW BLOG","og:type":"article","og:title":"When details in principal object of spring security are not sufficient | TO THE NEW Blog","og:description":"Sometimes we need to access details of current logged in user but that will be an additional database query. To save that query we can use principal object of Spring security which provides details of logged in user . But by default principal object have few fields like id, username and password. If we need","og:url":"https:\/\/www.tothenew.com\/blog\/when-details-in-principal-object-of-spring-security-are-not-sufficient\/","og:image":"https:\/\/www.tothenew.com\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png","og:image:secure_url":"https:\/\/www.tothenew.com\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png","article:tag":{"0":"grails","1":"technology","3":"java","4":"optimization","5":"spring","6":"spring security"},"article:published_time":"2015-07-24T06:34:56+00:00","article:modified_time":"2015-07-24T08:17:18+00:00","twitter:card":"summary","twitter:site":"@tothenew","twitter:title":"When details in principal object of spring security are not sufficient | TO THE NEW Blog","twitter:description":"Sometimes we need to access details of current logged in user but that will be an additional database query. To save that query we can use principal object of Spring security which provides details of logged in user . But by default principal object have few fields like id, username and password. If we need","twitter:image":"https:\/\/www.tothenew.com\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png"},"aioseo_meta_data":{"post_id":"23157","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":"","og_description":"","og_object_type":"article","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":"","og_custom_url":null,"og_article_section":"","og_article_tags":"","twitter_use_og":false,"twitter_card":"summary","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":"Article","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,"limit_modified_date":false,"created":"2021-04-29 17:17:41","updated":"2024-02-29 09:28:21","focus_keyword":null,"additional_keywords":null,"truseo_locale":null,"ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.tothenew.com\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.tothenew.com\/blog\/category\/technology\/\" title=\"Technology\">Technology<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tWhen details in principal object of spring security are not sufficient\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.tothenew.com\/blog"},{"label":"Technology","link":"https:\/\/www.tothenew.com\/blog\/category\/technology\/"},{"label":"When details in principal object of spring security are not sufficient","link":"https:\/\/www.tothenew.com\/blog\/when-details-in-principal-object-of-spring-security-are-not-sufficient\/"}],"_links":{"self":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/23157","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/users\/180"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/comments?post=23157"}],"version-history":[{"count":0,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/23157\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/media?parent=23157"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/categories?post=23157"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/tags?post=23157"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}