{"id":26156,"date":"2020-07-15T19:05:00","date_gmt":"2020-07-15T19:05:00","guid":{"rendered":"http:\/\/3.85.220.248\/?p=26156"},"modified":"2024-05-01T07:23:07","modified_gmt":"2024-05-01T02:23:07","slug":"the-cross-collection-join-query","status":"publish","type":"post","link":"https:\/\/kmwllc.com\/index.php\/2020\/07\/15\/the-cross-collection-join-query\/","title":{"rendered":"The Cross Collection Join Query"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"26156\" class=\"elementor elementor-26156\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-6b8dda8f elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6b8dda8f\" data-element_type=\"section\" data-e-type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-thegem\"><div class=\"elementor-row\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3a343be\" data-id=\"3a343be\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-505fd24e flex-horizontal-align-default flex-horizontal-align-tablet-default flex-horizontal-align-mobile-default flex-vertical-align-default flex-vertical-align-tablet-default flex-vertical-align-mobile-default elementor-widget elementor-widget-text-editor\" data-id=\"505fd24e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"elementor-text-editor elementor-clearfix\">\r\n\t\t\t\t\t\t\n<p>For the first time ever Solr can now support a multi-sharded, distributed join query.&nbsp; &nbsp;As of Solr 8.6, there is a new join method; the Cross Collection Join Query (<a rel=\"noreferrer noopener\" href=\"https:\/\/issues.apache.org\/jira\/browse\/SOLR-13749\" target=\"_blank\">SOLR-13749<\/a>).&nbsp;&nbsp;Currently there are multiple ways to perform a join query in Solr:&nbsp;the Block Join query parser, Join query parser, Graph query parser and Streaming Expressions all can provide some notion of join capabilities.&nbsp; As the name implies, the Cross Collection Join query&nbsp; is specifically built to allow for queries to join documents across two different, distributed collections.&nbsp; &nbsp;This post covers the technical implementation of the Cross Collection Join, we\u2019ll be following this up soon with another post dedicated to sample use cases and benchmarks for using the new Cross Collection Join query.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">How it works<\/h4>\n\n\n\n<p>The Cross Collection Join is a new join method that executes a query against a remote Solr collection to retrieve the set of join keys that will be used as a filter query against the local Solr collection.&nbsp; The CrossCollectionJoinQuery will first query a remote solr collection and get back a streaming expression result of the join keys.&nbsp; As the join keys are streamed to the node, a bitset of the matching documents in the local index is built up.&nbsp; This avoids keeping the full set of join keys in memory at any given time.&nbsp; This bitset is then inserted into the filter cache upon successful execution as with the normal behavior of the solr filter cache.<\/p>\n\n\n\n<p><br>Additionally, if the local index is sharded according to the join key field, the Cross Collection query can leverage a secondary query parser called the \u201chash_range\u201d query parser.&nbsp; The hash_range query parser is responsible for returning only the documents that hash to a given range of values.&nbsp; If the local collection is routed based on the join key used, each shard participating in the Cross Collection Join Query will be able to retrieve only the join keys from the remote collection that potentially match in the local shard.&nbsp; This has the benefit of making sure that network traffic doesn\u2019t increase as the number of shards increases and allows for much greater scalability.<\/p>\n\n\n\n<p>The Cross Collection Join Query works with both String and Point types of fields.&nbsp; The field that is being used for the join key in the remote collection must also have docValues enabled.&nbsp; The field that is being used for the join key in the local collection must be a single valued string field in order to take advantage for the hash range optimization described above.&nbsp; Additionally, the documents in the local collection must be routed to shard based on the join key field for the optimization.&nbsp;&nbsp;<br>The remote solr collection does not have any specific sharding requirements.<\/p>\n\n\n\n<h4 class=\"has-black-color has-text-color wp-block-heading\">Example usage<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>{!join method=\"crossCollection\" fromIndex=\"otherCollection\" from=\"fromField\" to=\"toField\"}*:*\n \nor\n \n{!join method=\"crossCollection\" fromIndex=\"otherCollection\" from=\"fromField\" to=\"toField\" v=\"*:*\"}    (preferred)<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">{!join method=\"crossCollection\" fromIndex=\"otherCollection\" from=\"fromField\" to=\"toField\"}*:*\n \nor\n \n{!join method=\"crossCollection\" fromIndex=\"otherCollection\" from=\"fromField\" to=\"toField\" v=\"*:*\"}    (preferred)<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">glossary of terms<\/h4>\n\n\n\n<figure class=\"wp-block-table is-style-regular\"><table class=\"has-fixed-layout\"><tbody><tr><td>Term<\/td><td>Description<\/td><\/tr><tr><td>Local Collection<\/td><td>This is the main collection that is being queried.<\/td><\/tr><tr><td>Remote Collection<\/td><td>This is the collection that the Cross Collection Join Query will query to resolve the join keys.<\/td><\/tr><tr><td>CrossCollectionJoinQuery<\/td><td>The lucene query that executes a search to get back a set of join keys from a remote collection<\/td><\/tr><tr><td>HashRangeQuery<\/td><td>The lucene query that matches only the documents whose hash code on a field falls within a specified range.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">cross collection join query parameters<\/h4>\n\n\n\n<figure class=\"wp-block-table is-style-regular\"><table class=\"has-fixed-layout\"><tbody><tr><td>Param<\/td><td><strong>Required<\/strong><\/td><td><strong>Description<\/strong><\/td><\/tr><tr><td><em>All others<\/em><\/td><td><\/td><td>Any normal Solr parameter can also be specified as a local param.<\/td><\/tr><tr><td>fromIndex<\/td><td>Required<\/td><td>The name of the external Solr collection to be queried to retrieve the set of join key values (required)<\/td><\/tr><tr><td>from<\/td><td>Required<\/td><td>The join key field name in the external collection (required)<\/td><\/tr><tr><td>routed<\/td><td>Optional<\/td><td>true \/ false.&nbsp; If true, the Cross Collection Join query will use each shard\u2019s hash range to determine the set of join keys to retrieve for that shard.&nbsp; This parameter improves the performance of the cross-collection join, but it depends on the local collection being routed by the toField.&nbsp; If this parameter is not specified, the Cross Collection Join query will try to determine the correct value automatically.<\/td><\/tr><tr><td>solrUrl<\/td><td>Optional<\/td><td>The URL of the external Solr node to be queried (optional).&nbsp; The solrUrl must be added to the \u201callowSolrUrls\u201d list in the solrconfig.xml file<\/td><\/tr><tr><td>to<\/td><td>Required<\/td><td>The join key field name in the local collection<\/td><\/tr><tr><td>ttl<\/td><td>Optional<\/td><td>The length of time that a Cross Collection Join query in the cache will be considered valid, in seconds.&nbsp; Defaults to 3600 (one hour).&nbsp; The Cross Collection Join query will not be aware of changes to the remote collection, so if the remote collection is updated, cached Cross Collection Join queries may give inaccurate results.&nbsp; After the ttl period has expired, the Cross Collection Join query will re-execute the join against the remote collection.<\/td><\/tr><tr><td>v<\/td><td>See Note<\/td><td>The query to be executed against the external Solr collection to retrieve the set of join key values.&nbsp; Note:&nbsp; The original query can be passed at the end of the string or as the \u201cv\u201d parameter.&nbsp; It\u2019s recommended to use query parameter substitution with the \u201cv\u201d parameter to ensure no issues arise with the default query parsers.<\/td><\/tr><tr><td>zkHost<\/td><td>Optional<\/td><td>The connection string to be used to connect to Zookeeper.&nbsp; zkHost and solrUrl are both optional parameters, and at most one of them should be specified.&nbsp; If neither of zkHost or solrUrl are specified, the local Zookeeper cluster will be used. (optional)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Installation<\/h4>\n\n\n\n<p>In order to use the Hash Range query optimization, the solrconfig.xml for local and remote collections needs to be updated as defined below.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Solrconfig.xml \u2013 Local Collection<\/h5>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;queryParser name=\"join\" class=\"org.apache.solr.search.JoinQParserPlugin\"&gt;\n  &lt;str name=\"routerField\"&gt;product_id&lt;\/str&gt;\n&lt;\/queryParser&gt;<\/code><\/pre>\n\n\n\n<p>Normally, this query parser is automatically registered by Solr.&nbsp; In order to take advantage of the Hash Range optimization the routedField property must be set on the JoinQParser in the Solrconfig .xml.&nbsp; In this example, we\u2019ve specified the \u201cproduct_id\u201d field to indicate the field name that will support the routed=true parameter optimization.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Solrconfig.xml \u2013 Remote Collection<\/h5>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;cache name=\"hash_product_id\"\n       class=\"solr.LRUCache\"\n       size=\"128\"\n       initialSize=\"0\"\n       regenerator=\"solr.NoOpRegenerator\"\/&gt;<\/code><\/pre>\n\n\n\n<p>Make sure to define the cache for the Hash Range query with a size equal to the maximum number of segments that are expected to be in the index.&nbsp; (typically this number stays well below 100.)<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">potential issues<\/h4>\n\n\n\n<ol class=\"wp-block-list\"><li>A large number of join keys will take a lot of network bandwidth to transmit to all the shards.<\/li><li>The hash_product_id cache will not explicitly expunge entries until the max size is reached.<\/li><\/ol>\n\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div><\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-9f71eaa elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"9f71eaa\" data-element_type=\"section\" data-e-type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-thegem\"><div class=\"elementor-row\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-29340c4\" data-id=\"29340c4\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d2fd460 flex-horizontal-align-default flex-horizontal-align-tablet-default flex-horizontal-align-mobile-default flex-vertical-align-default flex-vertical-align-tablet-default flex-vertical-align-mobile-default elementor-widget elementor-widget-global elementor-global-28083 elementor-widget-post-navigation\" data-id=\"d2fd460\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"post-navigation.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-post-navigation\" role=\"navigation\" aria-label=\"Post Navigation\">\n\t\t\t<div class=\"elementor-post-navigation__prev elementor-post-navigation__link\">\n\t\t\t\t<a href=\"https:\/\/kmwllc.com\/index.php\/2020\/04\/01\/solr-json-facets-for-reporting-and-data-aggregation\/\" rel=\"prev\"><span class=\"elementor-post-navigation__link__prev\"><span class=\"post-navigation__prev--label\">Previous Post<\/span><span class=\"post-navigation__prev--title\">Solr JSON Facets for Reporting and Data Aggregation<\/span><\/span><\/a>\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"elementor-post-navigation__next elementor-post-navigation__link\">\n\t\t\t\t<a href=\"https:\/\/kmwllc.com\/index.php\/2021\/06\/12\/solr-payload-inequalities\/\" rel=\"next\"><span class=\"elementor-post-navigation__link__next\"><span class=\"post-navigation__next--label\">Next Post<\/span><span class=\"post-navigation__next--title\">Solr Payload Inequalities<\/span><\/span><\/a>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div><\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>The KMW team&#8217;s contribution to Solr 8.6 is a new Cross Collection Join query method, enabling Solr to support a multi-sharded distributed query for the first time. We&#8217;ll tell you all about how it works.<\/p>\n","protected":false},"author":3,"featured_media":29708,"comment_status":"closed","ping_status":"open","sticky":false,"template":"elementor_theme","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[36,37],"tags":[],"class_list":{"0":"post-26156","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-search","8":"category-solr"},"aioseo_notices":[],"post_meta_fields":{"_wp_page_template":["elementor_theme"],"_edit_lock":["1717037289:7"],"_zilla_likes":["3"],"_wp_old_date":["2021-03-05"],"_edit_last":["7"],"_customize_sidebars":["yes"],"thegem_page_data":["a:190:{s:10:\"title_show\";s:7:\"default\";s:11:\"title_style\";s:1:\"2\";s:14:\"title_template\";s:5:\"27835\";s:23:\"title_use_page_settings\";i:0;s:12:\"title_xlarge\";i:0;s:18:\"title_rich_content\";i:0;s:13:\"title_content\";s:0:\"\";s:21:\"title_background_type\";s:5:\"color\";s:22:\"title_background_image\";s:0:\"\";s:29:\"title_background_image_repeat\";i:0;s:27:\"title_background_position_x\";s:6:\"center\";s:27:\"title_background_position_y\";s:3:\"top\";s:21:\"title_background_size\";s:5:\"cover\";s:28:\"title_background_image_color\";s:0:\"\";s:30:\"title_background_image_overlay\";s:0:\"\";s:30:\"title_background_gradient_type\";s:6:\"linear\";s:31:\"title_background_gradient_angle\";i:90;s:34:\"title_background_gradient_position\";s:13:\"center center\";s:38:\"title_background_gradient_point1_color\";s:9:\"#00BCD4BF\";s:41:\"title_background_gradient_point1_position\";i:0;s:38:\"title_background_gradient_point2_color\";s:9:\"#354093BF\";s:41:\"title_background_gradient_point2_position\";i:100;s:23:\"title_background_effect\";s:6:\"normal\";s:36:\"title_background_ken_burns_direction\";s:7:\"zoom_in\";s:43:\"title_background_ken_burns_transition_speed\";i:15000;s:37:\"title_background_video_play_on_mobile\";i:0;s:22:\"title_background_color\";s:7:\"#333144\";s:27:\"title_background_video_type\";s:0:\"\";s:22:\"title_background_video\";s:0:\"\";s:35:\"title_background_video_aspect_ratio\";s:0:\"\";s:36:\"title_background_video_overlay_color\";s:0:\"\";s:38:\"title_background_video_overlay_opacity\";s:0:\"\";s:29:\"title_background_video_poster\";s:0:\"\";s:19:\"title_menu_on_video\";s:0:\"\";s:16:\"title_text_color\";s:7:\"#ffffff\";s:24:\"title_excerpt_text_color\";s:7:\"#ffffff\";s:13:\"title_excerpt\";s:0:\"\";s:17:\"title_title_width\";i:0;s:19:\"title_excerpt_width\";i:0;s:22:\"title_font_preset_html\";s:0:\"\";s:23:\"title_font_preset_style\";s:0:\"\";s:24:\"title_font_preset_weight\";s:0:\"\";s:27:\"title_font_preset_transform\";s:0:\"\";s:30:\"title_excerpt_font_preset_html\";s:0:\"\";s:31:\"title_excerpt_font_preset_style\";s:0:\"\";s:32:\"title_excerpt_font_preset_weight\";s:0:\"\";s:35:\"title_excerpt_font_preset_transform\";s:0:\"\";s:17:\"title_padding_top\";i:80;s:24:\"title_padding_top_tablet\";i:80;s:24:\"title_padding_top_mobile\";i:80;s:20:\"title_padding_bottom\";i:80;s:27:\"title_padding_bottom_tablet\";i:80;s:27:\"title_padding_bottom_mobile\";i:80;s:18:\"title_padding_left\";i:0;s:25:\"title_padding_left_tablet\";i:0;s:25:\"title_padding_left_mobile\";i:0;s:19:\"title_padding_right\";i:0;s:26:\"title_padding_right_tablet\";i:0;s:26:\"title_padding_right_mobile\";i:0;s:16:\"title_top_margin\";s:0:\"\";s:23:\"title_top_margin_tablet\";i:0;s:23:\"title_top_margin_mobile\";i:0;s:24:\"title_excerpt_top_margin\";i:18;s:31:\"title_excerpt_top_margin_tablet\";i:18;s:31:\"title_excerpt_top_margin_mobile\";i:18;s:17:\"title_breadcrumbs\";i:1;s:15:\"title_alignment\";s:0:\"\";s:15:\"title_icon_pack\";s:7:\"elegant\";s:10:\"title_icon\";s:0:\"\";s:16:\"title_icon_color\";s:0:\"\";s:18:\"title_icon_color_2\";s:0:\"\";s:27:\"title_icon_background_color\";s:0:\"\";s:16:\"title_icon_shape\";s:6:\"circle\";s:23:\"title_icon_border_color\";s:0:\"\";s:15:\"title_icon_size\";s:5:\"large\";s:16:\"title_icon_style\";s:0:\"\";s:18:\"title_icon_opacity\";d:0;s:25:\"breadcrumbs_default_color\";s:0:\"\";s:24:\"breadcrumbs_active_color\";s:0:\"\";s:23:\"breadcrumbs_hover_color\";s:0:\"\";s:27:\"title_breadcrumbs_alignment\";s:6:\"center\";s:18:\"header_transparent\";i:0;s:14:\"header_opacity\";i:0;s:22:\"header_menu_logo_light\";i:0;s:20:\"header_hide_top_area\";s:7:\"default\";s:27:\"header_hide_top_area_tablet\";s:7:\"default\";s:27:\"header_hide_top_area_mobile\";s:7:\"default\";s:9:\"menu_show\";s:7:\"default\";s:12:\"menu_options\";s:7:\"default\";s:18:\"header_custom_menu\";i:0;s:27:\"header_top_area_transparent\";i:0;s:23:\"header_top_area_opacity\";i:0;s:16:\"top_area_options\";s:7:\"default\";s:13:\"header_source\";s:7:\"default\";s:14:\"header_builder\";s:1:\"0\";s:29:\"header_builder_sticky_desktop\";i:0;s:28:\"header_builder_sticky_mobile\";i:0;s:34:\"header_builder_sticky_hide_desktop\";i:0;s:33:\"header_builder_sticky_hide_mobile\";i:1;s:21:\"header_builder_sticky\";s:1:\"0\";s:29:\"header_builder_sticky_opacity\";i:80;s:26:\"header_builder_light_color\";s:7:\"#FFFFFF\";s:32:\"header_builder_light_color_hover\";s:7:\"#00bcd4\";s:20:\"main_background_type\";b:0;s:21:\"main_background_color\";s:7:\"#ffffff\";s:21:\"main_background_image\";s:0:\"\";s:28:\"main_background_image_repeat\";i:0;s:26:\"main_background_position_x\";s:6:\"center\";s:26:\"main_background_position_y\";s:6:\"center\";s:20:\"main_background_size\";s:4:\"auto\";s:27:\"main_background_image_color\";s:0:\"\";s:29:\"main_background_image_overlay\";s:0:\"\";s:29:\"main_background_gradient_type\";s:6:\"linear\";s:30:\"main_background_gradient_angle\";i:90;s:33:\"main_background_gradient_position\";s:0:\"\";s:37:\"main_background_gradient_point1_color\";s:9:\"#E9ECDAFF\";s:40:\"main_background_gradient_point1_position\";i:0;s:37:\"main_background_gradient_point2_color\";s:9:\"#D5F6FAFF\";s:40:\"main_background_gradient_point2_position\";i:100;s:23:\"main_background_pattern\";s:0:\"\";s:19:\"content_padding_top\";i:135;s:26:\"content_padding_top_tablet\";s:0:\"\";s:26:\"content_padding_top_mobile\";s:0:\"\";s:22:\"content_padding_bottom\";i:110;s:29:\"content_padding_bottom_tablet\";s:0:\"\";s:29:\"content_padding_bottom_mobile\";s:0:\"\";s:20:\"content_area_options\";s:7:\"default\";s:18:\"footer_custom_show\";s:7:\"default\";s:13:\"footer_custom\";s:5:\"24822\";s:19:\"footer_hide_default\";s:7:\"default\";s:23:\"footer_hide_widget_area\";s:7:\"default\";s:16:\"effects_disabled\";i:0;s:17:\"effects_one_pager\";i:0;s:23:\"effects_parallax_footer\";i:0;s:24:\"effects_no_bottom_margin\";i:0;s:21:\"effects_no_top_margin\";i:0;s:19:\"redirect_to_subpage\";i:0;s:19:\"effects_hide_header\";s:7:\"default\";s:19:\"effects_hide_footer\";s:7:\"default\";s:21:\"effects_page_scroller\";i:0;s:28:\"effects_page_scroller_mobile\";i:0;s:26:\"effects_page_scroller_type\";s:8:\"advanced\";s:22:\"fullpage_disabled_dots\";i:0;s:19:\"fullpage_style_dots\";s:7:\"outline\";s:31:\"fullpage_disabled_tooltips_dots\";i:0;s:25:\"fullpage_fixed_background\";b:0;s:26:\"fullpage_enable_continuous\";i:0;s:24:\"fullpage_disabled_mobile\";i:0;s:22:\"fullpage_scroll_effect\";s:6:\"normal\";s:21:\"enable_page_preloader\";s:7:\"default\";s:14:\"slideshow_type\";s:0:\"\";s:19:\"slideshow_slideshow\";s:0:\"\";s:21:\"slideshow_layerslider\";s:0:\"\";s:19:\"slideshow_revslider\";s:0:\"\";s:19:\"slideshow_preloader\";i:1;s:12:\"sidebar_show\";s:8:\"disabled\";s:16:\"sidebar_position\";s:4:\"left\";s:14:\"sidebar_sticky\";i:0;s:24:\"product_header_separator\";i:0;s:23:\"page_layout_breadcrumbs\";s:7:\"default\";s:37:\"page_layout_breadcrumbs_default_color\";s:9:\"#99A9B5FF\";s:36:\"page_layout_breadcrumbs_active_color\";s:9:\"#3C3950FF\";s:35:\"page_layout_breadcrumbs_hover_color\";s:9:\"#3C3950FF\";s:33:\"page_layout_breadcrumbs_alignment\";s:4:\"left\";s:38:\"page_layout_breadcrumbs_bottom_spacing\";s:1:\"0\";s:37:\"page_layout_breadcrumbs_shop_category\";i:0;s:18:\"delay_js_execution\";i:0;s:13:\"disable_cache\";i:0;s:27:\"title_video_overlay_opacity\";s:0:\"\";s:31:\"title_breadcrumbs_shop_category\";s:1:\"0\";s:20:\"title_padding_locked\";s:0:\"\";s:27:\"title_padding_tablet_locked\";s:0:\"\";s:27:\"title_padding_mobile_locked\";s:0:\"\";s:24:\"title_background_pattern\";s:0:\"\";s:30:\"title_background_video_overlay\";s:0:\"\";s:16:\"title_icon__pack\";s:0:\"\";s:21:\"title_icon_shape_show\";s:0:\"\";s:25:\"footer_widget_woocommerce\";s:1:\"1\";s:19:\"portfolio_item_data\";a:9:{s:8:\"back_url\";s:0:\"\";s:9:\"highlight\";s:0:\"\";s:14:\"highlight_type\";s:0:\"\";s:14:\"overview_title\";s:0:\"\";s:16:\"overview_summary\";s:0:\"\";s:12:\"project_link\";s:0:\"\";s:12:\"project_text\";s:0:\"\";s:9:\"fullwidth\";s:0:\"\";s:19:\"project_button_show\";s:0:\"\";}s:23:\"portfolio_elements_data\";a:7:{s:23:\"portfolio_page_elements\";s:7:\"default\";s:19:\"portfolio_hide_date\";s:0:\"\";s:19:\"portfolio_hide_sets\";s:0:\"\";s:20:\"portfolio_hide_likes\";s:0:\"\";s:22:\"portfolio_hide_socials\";s:0:\"\";s:29:\"portfolio_hide_top_navigation\";s:0:\"\";s:32:\"portfolio_hide_bottom_navigation\";s:0:\"\";}s:17:\"product_item_data\";a:109:{s:9:\"highlight\";s:0:\"\";s:14:\"highlight_type\";s:7:\"squared\";s:28:\"thegem_product_disable_hover\";s:1:\"0\";s:10:\"size_guide\";s:7:\"default\";s:16:\"size_guide_image\";s:0:\"\";s:23:\"product_layout_settings\";s:7:\"default\";s:21:\"product_layout_source\";s:7:\"default\";s:24:\"product_builder_template\";s:0:\"\";s:19:\"product_page_layout\";s:7:\"default\";s:25:\"product_page_layout_style\";s:15:\"horizontal_tabs\";s:28:\"product_page_layout_centered\";s:1:\"0\";s:39:\"product_page_layout_centered_top_margin\";s:2:\"42\";s:34:\"product_page_layout_centered_boxed\";s:1:\"0\";s:40:\"product_page_layout_centered_boxed_color\";s:0:\"\";s:29:\"product_page_layout_fullwidth\";s:1:\"0\";s:26:\"product_page_layout_sticky\";s:1:\"0\";s:33:\"product_page_layout_sticky_offset\";s:1:\"0\";s:28:\"product_page_skeleton_loader\";s:1:\"0\";s:30:\"product_page_layout_background\";s:0:\"\";s:30:\"product_page_layout_title_area\";s:8:\"disabled\";s:29:\"product_page_ajax_add_to_cart\";s:1:\"1\";s:31:\"product_page_desc_review_source\";s:17:\"extra_description\";s:31:\"product_page_desc_review_layout\";s:4:\"tabs\";s:42:\"product_page_desc_review_layout_tabs_style\";s:10:\"horizontal\";s:46:\"product_page_desc_review_layout_tabs_alignment\";s:4:\"left\";s:44:\"product_page_desc_review_layout_acc_position\";s:13:\"below_gallery\";s:65:\"product_page_desc_review_layout_one_by_one_description_background\";s:9:\"#F4F6F7FF\";s:69:\"product_page_desc_review_layout_one_by_one_additional_info_background\";s:9:\"#FFFFFFFF\";s:61:\"product_page_desc_review_layout_one_by_one_reviews_background\";s:9:\"#F4F6F7FF\";s:36:\"product_page_desc_review_description\";s:1:\"1\";s:42:\"product_page_desc_review_description_title\";s:11:\"Description\";s:40:\"product_page_desc_review_additional_info\";s:1:\"1\";s:46:\"product_page_desc_review_additional_info_title\";s:15:\"Additional Info\";s:32:\"product_page_desc_review_reviews\";s:1:\"1\";s:38:\"product_page_desc_review_reviews_title\";s:7:\"Reviews\";s:36:\"product_page_button_add_to_cart_text\";s:11:\"Add to Cart\";s:36:\"product_page_button_add_to_cart_icon\";s:4:\"f1e7\";s:41:\"product_page_button_add_to_cart_icon_pack\";s:8:\"material\";s:45:\"product_page_button_add_to_cart_icon_position\";s:4:\"left\";s:40:\"product_page_button_add_to_wishlist_icon\";s:4:\"f37b\";s:45:\"product_page_button_add_to_wishlist_icon_pack\";s:8:\"material\";s:42:\"product_page_button_added_to_wishlist_icon\";s:4:\"f377\";s:47:\"product_page_button_added_to_wishlist_icon_pack\";s:8:\"material\";s:41:\"product_page_button_clear_attributes_text\";s:15:\"Clear selection\";s:31:\"product_page_elements_prev_next\";s:1:\"1\";s:38:\"product_page_elements_preview_on_hover\";s:1:\"1\";s:34:\"product_page_elements_back_to_shop\";s:1:\"1\";s:39:\"product_page_elements_back_to_shop_link\";s:9:\"main_shop\";s:50:\"product_page_elements_back_to_shop_link_custom_url\";s:0:\"\";s:27:\"product_page_elements_title\";s:1:\"1\";s:32:\"product_page_elements_attributes\";s:1:\"0\";s:37:\"product_page_elements_attributes_data\";s:0:\"\";s:29:\"product_page_elements_reviews\";s:1:\"1\";s:34:\"product_page_elements_reviews_text\";s:16:\"customer reviews\";s:27:\"product_page_elements_price\";s:1:\"1\";s:41:\"product_page_elements_price_strikethrough\";s:1:\"1\";s:33:\"product_page_elements_description\";s:1:\"1\";s:34:\"product_page_elements_stock_amount\";s:1:\"1\";s:39:\"product_page_elements_stock_amount_text\";s:17:\"Products in stock\";s:32:\"product_page_elements_size_guide\";s:1:\"1\";s:25:\"product_page_elements_sku\";s:1:\"1\";s:31:\"product_page_elements_sku_title\";s:3:\"SKU\";s:32:\"product_page_elements_categories\";s:1:\"1\";s:38:\"product_page_elements_categories_title\";s:10:\"Categories\";s:26:\"product_page_elements_tags\";s:1:\"1\";s:32:\"product_page_elements_tags_title\";s:4:\"Tags\";s:27:\"product_page_elements_share\";s:1:\"1\";s:33:\"product_page_elements_share_title\";s:5:\"Share\";s:36:\"product_page_elements_share_facebook\";s:1:\"1\";s:35:\"product_page_elements_share_twitter\";s:1:\"1\";s:37:\"product_page_elements_share_pinterest\";s:1:\"1\";s:34:\"product_page_elements_share_tumblr\";s:1:\"1\";s:36:\"product_page_elements_share_linkedin\";s:1:\"1\";s:34:\"product_page_elements_share_reddit\";s:1:\"1\";s:28:\"product_page_elements_upsell\";s:1:\"1\";s:34:\"product_page_elements_upsell_title\";s:17:\"You may also like\";s:44:\"product_page_elements_upsell_title_alignment\";s:4:\"left\";s:34:\"product_page_elements_upsell_items\";s:2:\"-1\";s:44:\"product_page_elements_upsell_columns_desktop\";s:2:\"4x\";s:43:\"product_page_elements_upsell_columns_tablet\";s:2:\"3x\";s:43:\"product_page_elements_upsell_columns_mobile\";s:2:\"2x\";s:40:\"product_page_elements_upsell_columns_100\";s:1:\"5\";s:29:\"product_page_elements_related\";s:1:\"1\";s:35:\"product_page_elements_related_title\";s:16:\"Related Products\";s:45:\"product_page_elements_related_title_alignment\";s:4:\"left\";s:35:\"product_page_elements_related_items\";s:2:\"-1\";s:45:\"product_page_elements_related_columns_desktop\";s:2:\"4x\";s:44:\"product_page_elements_related_columns_tablet\";s:2:\"3x\";s:44:\"product_page_elements_related_columns_mobile\";s:2:\"2x\";s:41:\"product_page_elements_related_columns_100\";s:1:\"5\";s:15:\"product_gallery\";s:7:\"enabled\";s:20:\"product_gallery_type\";s:10:\"horizontal\";s:31:\"product_gallery_column_position\";s:4:\"left\";s:28:\"product_gallery_column_width\";s:2:\"50\";s:26:\"product_gallery_show_image\";s:5:\"hover\";s:20:\"product_gallery_zoom\";s:1:\"1\";s:24:\"product_gallery_lightbox\";s:1:\"1\";s:22:\"product_gallery_labels\";s:1:\"1\";s:26:\"product_gallery_label_sale\";s:1:\"1\";s:25:\"product_gallery_label_new\";s:1:\"1\";s:31:\"product_gallery_label_out_stock\";s:1:\"1\";s:27:\"product_gallery_auto_height\";s:1:\"1\";s:30:\"product_gallery_elements_color\";s:0:\"\";s:28:\"product_gallery_grid_columns\";s:2:\"1x\";s:25:\"product_gallery_grid_gaps\";s:2:\"42\";s:30:\"product_gallery_grid_gaps_hide\";s:1:\"0\";s:31:\"product_gallery_grid_top_margin\";s:1:\"0\";s:30:\"product_gallery_video_autoplay\";s:1:\"0\";s:15:\"size_guide_text\";s:10:\"Size guide\";}s:25:\"product_archive_item_data\";a:2:{s:29:\"product_archive_layout_source\";s:7:\"default\";s:32:\"product_archive_builder_template\";s:0:\"\";}s:22:\"blog_archive_item_data\";a:2:{s:26:\"blog_archive_layout_source\";s:7:\"default\";s:29:\"blog_archive_builder_template\";s:0:\"\";}s:24:\"options_current_contents\";N;s:16:\"options_modified\";N;s:34:\"options_outside_parameter_modified\";b:0;s:22:\"options_saved_contents\";N;s:8:\"settings\";a:3:{s:5:\"theme\";s:5:\"light\";s:24:\"background_image_gallery\";a:0:{}s:21:\"colorpicker_favorites\";a:1:{s:7:\"default\";a:0:{}}}s:26:\"delay_js_execution_desktop\";s:1:\"0\";s:25:\"delay_js_execution_mobile\";s:1:\"0\";}"],"thegem_post_general_item_data":["a:22:{s:20:\"post_layout_settings\";s:7:\"default\";s:18:\"post_layout_source\";s:7:\"default\";s:21:\"post_builder_template\";s:1:\"0\";s:26:\"show_featured_posts_slider\";i:0;s:21:\"show_featured_content\";s:8:\"disabled\";s:10:\"video_type\";s:7:\"youtube\";s:5:\"video\";s:0:\"\";s:18:\"video_aspect_ratio\";s:0:\"\";s:10:\"quote_text\";s:0:\"\";s:12:\"quote_author\";s:0:\"\";s:16:\"quote_background\";s:0:\"\";s:18:\"quote_author_color\";s:0:\"\";s:5:\"audio\";s:0:\"\";s:7:\"gallery\";i:0;s:18:\"gallery_autoscroll\";i:0;s:9:\"highlight\";i:0;s:14:\"highlight_type\";s:7:\"squared\";s:15:\"highlight_style\";s:7:\"default\";s:31:\"highlight_title_left_background\";s:0:\"\";s:26:\"highlight_title_left_color\";s:0:\"\";s:32:\"highlight_title_right_background\";s:0:\"\";s:27:\"highlight_title_right_color\";s:0:\"\";}"],"thegem_show_featured_posts_slider":["0"],"_elementor_edit_mode":["builder"],"_elementor_template_type":["wp-post"],"_elementor_version":["3.18.3"],"_elementor_data":["[{\"id\":\"6b8dda8f\",\"elType\":\"section\",\"settings\":[],\"elements\":[{\"id\":\"3a343be\",\"elType\":\"column\",\"settings\":{\"_column_size\":100,\"thegem_column_breakpoints_list\":[]},\"elements\":[{\"id\":\"505fd24e\",\"elType\":\"widget\",\"settings\":{\"editor\":\"<!-- wp:paragraph -->\\n<p>For the first time ever Solr can now support a multi-sharded, distributed join query.&nbsp; &nbsp;As of Solr 8.6, there is a new join method; the Cross Collection Join Query (<a rel=\\\"noreferrer noopener\\\" href=\\\"https:\\\/\\\/issues.apache.org\\\/jira\\\/browse\\\/SOLR-13749\\\" target=\\\"_blank\\\">SOLR-13749<\\\/a>).&nbsp;&nbsp;Currently there are multiple ways to perform a join query in Solr:&nbsp;the Block Join query parser, Join query parser, Graph query parser and Streaming Expressions all can provide some notion of join capabilities.&nbsp; As the name implies, the Cross Collection Join query&nbsp; is specifically built to allow for queries to join documents across two different, distributed collections.&nbsp; &nbsp;This post covers the technical implementation of the Cross Collection Join, we\\u2019ll be following this up soon with another post dedicated to sample use cases and benchmarks for using the new Cross Collection Join query.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<!-- wp:heading {\\\"level\\\":4} -->\\n<h4>How it works<\\\/h4>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:paragraph -->\\n<p>The Cross Collection Join is a new join method that executes a query against a remote Solr collection to retrieve the set of join keys that will be used as a filter query against the local Solr collection.&nbsp; The CrossCollectionJoinQuery will first query a remote solr collection and get back a streaming expression result of the join keys.&nbsp; As the join keys are streamed to the node, a bitset of the matching documents in the local index is built up.&nbsp; This avoids keeping the full set of join keys in memory at any given time.&nbsp; This bitset is then inserted into the filter cache upon successful execution as with the normal behavior of the solr filter cache.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<!-- wp:paragraph -->\\n<p><br>Additionally, if the local index is sharded according to the join key field, the Cross Collection query can leverage a secondary query parser called the \\u201chash_range\\u201d query parser.&nbsp; The hash_range query parser is responsible for returning only the documents that hash to a given range of values.&nbsp; If the local collection is routed based on the join key used, each shard participating in the Cross Collection Join Query will be able to retrieve only the join keys from the remote collection that potentially match in the local shard.&nbsp; This has the benefit of making sure that network traffic doesn\\u2019t increase as the number of shards increases and allows for much greater scalability.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<!-- wp:paragraph -->\\n<p>The Cross Collection Join Query works with both String and Point types of fields.&nbsp; The field that is being used for the join key in the remote collection must also have docValues enabled.&nbsp; The field that is being used for the join key in the local collection must be a single valued string field in order to take advantage for the hash range optimization described above.&nbsp; Additionally, the documents in the local collection must be routed to shard based on the join key field for the optimization.&nbsp;&nbsp;<br>The remote solr collection does not have any specific sharding requirements.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<!-- wp:heading {\\\"level\\\":4,\\\"textColor\\\":\\\"black\\\"} -->\\n<h4 class=\\\"has-black-color has-text-color\\\">Example usage<\\\/h4>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:code -->\\n<pre class=\\\"wp-block-code\\\"><code>{!join method=\\\"crossCollection\\\" fromIndex=\\\"otherCollection\\\" from=\\\"fromField\\\" to=\\\"toField\\\"}*:*\\n \\nor\\n \\n{!join method=\\\"crossCollection\\\" fromIndex=\\\"otherCollection\\\" from=\\\"fromField\\\" to=\\\"toField\\\" v=\\\"*:*\\\"}    (preferred)<\\\/code><\\\/pre>\\n<!-- \\\/wp:code -->\\n\\n<!-- wp:preformatted -->\\n<pre class=\\\"wp-block-preformatted\\\">{!join method=\\\"crossCollection\\\" fromIndex=\\\"otherCollection\\\" from=\\\"fromField\\\" to=\\\"toField\\\"}*:*\\n \\nor\\n \\n{!join method=\\\"crossCollection\\\" fromIndex=\\\"otherCollection\\\" from=\\\"fromField\\\" to=\\\"toField\\\" v=\\\"*:*\\\"}    (preferred)<\\\/pre>\\n<!-- \\\/wp:preformatted -->\\n\\n<!-- wp:heading {\\\"level\\\":4} -->\\n<h4>glossary of terms<\\\/h4>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:table {\\\"hasFixedLayout\\\":true,\\\"className\\\":\\\"is-style-regular\\\"} -->\\n<figure class=\\\"wp-block-table is-style-regular\\\"><table class=\\\"has-fixed-layout\\\"><tbody><tr><td>Term<\\\/td><td>Description<\\\/td><\\\/tr><tr><td>Local Collection<\\\/td><td>This is the main collection that is being queried.<\\\/td><\\\/tr><tr><td>Remote Collection<\\\/td><td>This is the collection that the Cross Collection Join Query will query to resolve the join keys.<\\\/td><\\\/tr><tr><td>CrossCollectionJoinQuery<\\\/td><td>The lucene query that executes a search to get back a set of join keys from a remote collection<\\\/td><\\\/tr><tr><td>HashRangeQuery<\\\/td><td>The lucene query that matches only the documents whose hash code on a field falls within a specified range.<\\\/td><\\\/tr><\\\/tbody><\\\/table><\\\/figure>\\n<!-- \\\/wp:table -->\\n\\n<!-- wp:heading {\\\"level\\\":4} -->\\n<h4>cross collection join query parameters<\\\/h4>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:table {\\\"hasFixedLayout\\\":true,\\\"className\\\":\\\"is-style-regular\\\"} -->\\n<figure class=\\\"wp-block-table is-style-regular\\\"><table class=\\\"has-fixed-layout\\\"><tbody><tr><td>Param<\\\/td><td><strong>Required<\\\/strong><\\\/td><td><strong>Description<\\\/strong><\\\/td><\\\/tr><tr><td><em>All others<\\\/em><\\\/td><td><\\\/td><td>Any normal Solr parameter can also be specified as a local param.<\\\/td><\\\/tr><tr><td>fromIndex<\\\/td><td>Required<\\\/td><td>The name of the external Solr collection to be queried to retrieve the set of join key values (required)<\\\/td><\\\/tr><tr><td>from<\\\/td><td>Required<\\\/td><td>The join key field name in the external collection (required)<\\\/td><\\\/tr><tr><td>routed<\\\/td><td>Optional<\\\/td><td>true \\\/ false.&nbsp; If true, the Cross Collection Join query will use each shard\\u2019s hash range to determine the set of join keys to retrieve for that shard.&nbsp; This parameter improves the performance of the cross-collection join, but it depends on the local collection being routed by the toField.&nbsp; If this parameter is not specified, the Cross Collection Join query will try to determine the correct value automatically.<\\\/td><\\\/tr><tr><td>solrUrl<\\\/td><td>Optional<\\\/td><td>The URL of the external Solr node to be queried (optional).&nbsp; The solrUrl must be added to the \\u201callowSolrUrls\\u201d list in the solrconfig.xml file<\\\/td><\\\/tr><tr><td>to<\\\/td><td>Required<\\\/td><td>The join key field name in the local collection<\\\/td><\\\/tr><tr><td>ttl<\\\/td><td>Optional<\\\/td><td>The length of time that a Cross Collection Join query in the cache will be considered valid, in seconds.&nbsp; Defaults to 3600 (one hour).&nbsp; The Cross Collection Join query will not be aware of changes to the remote collection, so if the remote collection is updated, cached Cross Collection Join queries may give inaccurate results.&nbsp; After the ttl period has expired, the Cross Collection Join query will re-execute the join against the remote collection.<\\\/td><\\\/tr><tr><td>v<\\\/td><td>See Note<\\\/td><td>The query to be executed against the external Solr collection to retrieve the set of join key values.&nbsp; Note:&nbsp; The original query can be passed at the end of the string or as the \\u201cv\\u201d parameter.&nbsp; It\\u2019s recommended to use query parameter substitution with the \\u201cv\\u201d parameter to ensure no issues arise with the default query parsers.<\\\/td><\\\/tr><tr><td>zkHost<\\\/td><td>Optional<\\\/td><td>The connection string to be used to connect to Zookeeper.&nbsp; zkHost and solrUrl are both optional parameters, and at most one of them should be specified.&nbsp; If neither of zkHost or solrUrl are specified, the local Zookeeper cluster will be used. (optional)<\\\/td><\\\/tr><\\\/tbody><\\\/table><\\\/figure>\\n<!-- \\\/wp:table -->\\n\\n<!-- wp:heading {\\\"level\\\":4} -->\\n<h4>Installation<\\\/h4>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:paragraph -->\\n<p>In order to use the Hash Range query optimization, the solrconfig.xml for local and remote collections needs to be updated as defined below.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<!-- wp:heading {\\\"level\\\":5} -->\\n<h5>Solrconfig.xml \\u2013 Local Collection<\\\/h5>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:code -->\\n<pre class=\\\"wp-block-code\\\"><code>&lt;queryParser name=\\\"join\\\" class=\\\"org.apache.solr.search.JoinQParserPlugin\\\"&gt;\\n  &lt;str name=\\\"routerField\\\"&gt;product_id&lt;\\\/str&gt;\\n&lt;\\\/queryParser&gt;<\\\/code><\\\/pre>\\n<!-- \\\/wp:code -->\\n\\n<!-- wp:paragraph -->\\n<p>Normally, this query parser is automatically registered by Solr.&nbsp; In order to take advantage of the Hash Range optimization the routedField property must be set on the JoinQParser in the Solrconfig .xml.&nbsp; In this example, we\\u2019ve specified the \\u201cproduct_id\\u201d field to indicate the field name that will support the routed=true parameter optimization.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<!-- wp:heading {\\\"level\\\":5} -->\\n<h5>Solrconfig.xml \\u2013 Remote Collection<\\\/h5>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:code -->\\n<pre class=\\\"wp-block-code\\\"><code>&lt;cache name=\\\"hash_product_id\\\"\\n       class=\\\"solr.LRUCache\\\"\\n       size=\\\"128\\\"\\n       initialSize=\\\"0\\\"\\n       regenerator=\\\"solr.NoOpRegenerator\\\"\\\/&gt;<\\\/code><\\\/pre>\\n<!-- \\\/wp:code -->\\n\\n<!-- wp:paragraph -->\\n<p>Make sure to define the cache for the Hash Range query with a size equal to the maximum number of segments that are expected to be in the index.&nbsp; (typically this number stays well below 100.)<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<!-- wp:heading {\\\"level\\\":4} -->\\n<h4>potential issues<\\\/h4>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:list {\\\"ordered\\\":true} -->\\n<ol><li>A large number of join keys will take a lot of network bandwidth to transmit to all the shards.<\\\/li><li>The hash_product_id cache will not explicitly expunge entries until the max size is reached.<\\\/li><\\\/ol>\\n<!-- \\\/wp:list -->\"},\"elements\":[],\"widgetType\":\"text-editor\"}],\"isInner\":false}],\"isInner\":false},{\"id\":\"9f71eaa\",\"elType\":\"section\",\"settings\":[],\"elements\":[{\"id\":\"29340c4\",\"elType\":\"column\",\"settings\":{\"_column_size\":100,\"_inline_size\":null,\"thegem_column_breakpoints_list\":[]},\"elements\":[{\"id\":\"d2fd460\",\"elType\":\"widget\",\"settings\":{\"prev_label\":\"Previous Post\",\"next_label\":\"Next Post\",\"show_borders\":\"\",\"title_typography_typography\":\"custom\",\"title_typography_font_size\":{\"unit\":\"px\",\"size\":14,\"sizes\":[]},\"title_typography_font_weight\":\"700\",\"__globals__\":{\"arrow_color\":\"globals\\\/colors?id=primary\",\"label_color\":\"globals\\\/colors?id=secondary\"},\"arrow\":\"fa fa-caret-left\",\"show_arrow\":\"\"},\"elements\":[],\"widgetType\":\"global\",\"templateID\":\"28083\"}],\"isInner\":false}],\"isInner\":false}]"],"_thumbnail_id":["29708"],"thegem_page_data_old":["a:46:{s:11:\"title_style\";s:1:\"1\";s:14:\"title_template\";i:0;s:23:\"title_use_page_settings\";i:0;s:12:\"title_xlarge\";i:0;s:18:\"title_rich_content\";i:0;s:13:\"title_content\";s:0:\"\";s:22:\"title_background_image\";s:0:\"\";s:25:\"title_background_parallax\";i:0;s:22:\"title_background_color\";s:0:\"\";s:16:\"title_video_type\";s:0:\"\";s:22:\"title_video_background\";s:0:\"\";s:24:\"title_video_aspect_ratio\";s:0:\"\";s:25:\"title_video_overlay_color\";s:0:\"\";s:27:\"title_video_overlay_opacity\";s:0:\"\";s:18:\"title_video_poster\";s:0:\"\";s:19:\"title_menu_on_video\";s:0:\"\";s:16:\"title_text_color\";s:0:\"\";s:24:\"title_excerpt_text_color\";s:0:\"\";s:13:\"title_excerpt\";s:0:\"\";s:17:\"title_title_width\";s:1:\"0\";s:19:\"title_excerpt_width\";s:1:\"0\";s:17:\"title_padding_top\";s:2:\"80\";s:20:\"title_padding_bottom\";s:2:\"80\";s:16:\"title_top_margin\";s:1:\"0\";s:24:\"title_excerpt_top_margin\";s:2:\"18\";s:17:\"title_breadcrumbs\";s:1:\"1\";s:15:\"title_alignment\";s:0:\"\";s:15:\"title_icon_pack\";s:7:\"elegant\";s:10:\"title_icon\";s:0:\"\";s:16:\"title_icon_color\";s:0:\"\";s:18:\"title_icon_color_2\";s:0:\"\";s:27:\"title_icon_background_color\";s:0:\"\";s:16:\"title_icon_shape\";s:6:\"circle\";s:23:\"title_icon_border_color\";s:0:\"\";s:15:\"title_icon_size\";s:5:\"large\";s:16:\"title_icon_style\";s:0:\"\";s:18:\"title_icon_opacity\";d:0;s:14:\"header_opacity\";s:1:\"0\";s:23:\"header_top_area_opacity\";s:1:\"0\";s:13:\"footer_custom\";s:5:\"24822\";s:16:\"sidebar_position\";s:0:\"\";s:14:\"slideshow_type\";s:0:\"\";s:19:\"slideshow_slideshow\";s:0:\"\";s:19:\"fullpage_style_dots\";s:7:\"outline\";s:22:\"fullpage_scroll_effect\";s:6:\"normal\";s:14:\"sidebar_sticky\";i:0;}"],"thegem_post_general_item_data_old":["a:19:{s:26:\"show_featured_posts_slider\";i:0;s:21:\"show_featured_content\";i:0;s:10:\"video_type\";s:7:\"youtube\";s:5:\"video\";s:0:\"\";s:18:\"video_aspect_ratio\";s:0:\"\";s:10:\"quote_text\";s:0:\"\";s:12:\"quote_author\";s:0:\"\";s:16:\"quote_background\";s:0:\"\";s:18:\"quote_author_color\";s:0:\"\";s:5:\"audio\";s:0:\"\";s:7:\"gallery\";i:0;s:18:\"gallery_autoscroll\";i:0;s:9:\"highlight\";i:0;s:14:\"highlight_type\";s:7:\"squared\";s:15:\"highlight_style\";s:7:\"default\";s:31:\"highlight_title_left_background\";s:0:\"\";s:26:\"highlight_title_left_color\";s:0:\"\";s:32:\"highlight_title_right_background\";s:0:\"\";s:27:\"highlight_title_right_color\";s:0:\"\";}"],"_oembed_79d813f23eb66ee4bdc588fa6494d268":["{{unknown}}"],"thegem_post_page_elements_data":["a:12:{s:13:\"post_elements\";s:7:\"default\";s:11:\"show_author\";i:0;s:16:\"blog_hide_author\";i:0;s:14:\"blog_hide_date\";i:0;s:26:\"blog_hide_date_in_blog_cat\";i:0;s:20:\"blog_hide_categories\";i:0;s:14:\"blog_hide_tags\";i:0;s:18:\"blog_hide_comments\";i:0;s:15:\"blog_hide_likes\";i:0;s:20:\"blog_hide_navigation\";i:0;s:17:\"blog_hide_socials\";i:0;s:17:\"blog_hide_realted\";i:0;}"],"_elementor_pro_version":["3.18.3"],"_last_editor_used_jetpack":["block-editor"],"thegem_popups_data":["a:2:{s:20:\"popups_layout_source\";s:7:\"default\";s:12:\"thegemPopups\";a:0:{}}"],"_yoast_wpseo_primary_category":["36"],"_yoast_wpseo_content_score":["30"],"_yoast_wpseo_estimated-reading-time-minutes":["5"],"_yoast_wpseo_wordproof_timestamp":[""],"_elementor_controls_usage":["a:4:{s:11:\"text-editor\";a:3:{s:5:\"count\";i:1;s:15:\"control_percent\";i:0;s:8:\"controls\";a:1:{s:7:\"content\";a:1:{s:14:\"section_editor\";a:1:{s:6:\"editor\";i:1;}}}}s:6:\"column\";a:3:{s:5:\"count\";i:2;s:15:\"control_percent\";i:0;s:8:\"controls\";a:1:{s:6:\"layout\";a:1:{s:6:\"layout\";a:1:{s:12:\"_inline_size\";i:1;}}}}s:7:\"section\";a:3:{s:5:\"count\";i:2;s:15:\"control_percent\";i:0;s:8:\"controls\";a:0:{}}s:15:\"post-navigation\";a:3:{s:5:\"count\";i:1;s:15:\"control_percent\";i:2;s:8:\"controls\";a:2:{s:7:\"content\";a:1:{s:31:\"section_post_navigation_content\";a:5:{s:10:\"prev_label\";i:1;s:10:\"next_label\";i:1;s:12:\"show_borders\";i:1;s:5:\"arrow\";i:1;s:10:\"show_arrow\";i:1;}}s:5:\"style\";a:1:{s:11:\"title_style\";a:3:{s:27:\"title_typography_typography\";i:1;s:26:\"title_typography_font_size\";i:1;s:28:\"title_typography_font_weight\";i:1;}}}}}"],"_elementor_page_assets":["a:2:{s:7:\"scripts\";a:2:{i:0;s:18:\"elementor-frontend\";i:1;s:15:\"post-navigation\";}s:6:\"styles\";a:1:{i:0;s:22:\"widget-post-navigation\";}}"],"_elementor_css":["a:6:{s:4:\"time\";i:1775603516;s:5:\"fonts\";a:0:{}s:5:\"icons\";a:0:{}s:20:\"dynamic_elements_ids\";a:0:{}s:6:\"status\";s:4:\"file\";i:0;s:0:\"\";}"],"_elementor_element_cache":["{\"timeout\":1776429034,\"value\":{\"content\":\"\\t\\t<section class=\\\"elementor-section elementor-top-section elementor-element elementor-element-6b8dda8f elementor-section-boxed elementor-section-height-default elementor-section-height-default\\\" data-id=\\\"6b8dda8f\\\" data-element_type=\\\"section\\\" data-e-type=\\\"section\\\">\\r\\n\\t\\t\\t\\t\\t\\t<div class=\\\"elementor-container elementor-column-gap-thegem\\\"><div class=\\\"elementor-row\\\">\\r\\n\\t\\t\\t\\t\\t<div class=\\\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3a343be\\\" data-id=\\\"3a343be\\\" data-element_type=\\\"column\\\" data-e-type=\\\"column\\\">\\n\\t\\t\\t<div class=\\\"elementor-widget-wrap elementor-element-populated\\\">\\n\\t\\t\\t\\t[elementor-element k=\\\"9109a976d8649ee6d2c8fef8daebbb8b\\\" data=\\\"eyJpZCI6IjUwNWZkMjRlIiwiZWxUeXBlIjoid2lkZ2V0Iiwic2V0dGluZ3MiOnsiZWRpdG9yIjoiPCEtLSB3cDpwYXJhZ3JhcGggLS0+XG48cD5Gb3IgdGhlIGZpcnN0IHRpbWUgZXZlciBTb2xyIGNhbiBub3cgc3VwcG9ydCBhIG11bHRpLXNoYXJkZWQsIGRpc3RyaWJ1dGVkIGpvaW4gcXVlcnkuJm5ic3A7ICZuYnNwO0FzIG9mIFNvbHIgOC42LCB0aGVyZSBpcyBhIG5ldyBqb2luIG1ldGhvZDsgdGhlIENyb3NzIENvbGxlY3Rpb24gSm9pbiBRdWVyeSAoPGEgcmVsPVwibm9yZWZlcnJlciBub29wZW5lclwiIGhyZWY9XCJodHRwczpcL1wvaXNzdWVzLmFwYWNoZS5vcmdcL2ppcmFcL2Jyb3dzZVwvU09MUi0xMzc0OVwiIHRhcmdldD1cIl9ibGFua1wiPlNPTFItMTM3NDk8XC9hPikuJm5ic3A7Jm5ic3A7Q3VycmVudGx5IHRoZXJlIGFyZSBtdWx0aXBsZSB3YXlzIHRvIHBlcmZvcm0gYSBqb2luIHF1ZXJ5IGluIFNvbHI6Jm5ic3A7dGhlIEJsb2NrIEpvaW4gcXVlcnkgcGFyc2VyLCBKb2luIHF1ZXJ5IHBhcnNlciwgR3JhcGggcXVlcnkgcGFyc2VyIGFuZCBTdHJlYW1pbmcgRXhwcmVzc2lvbnMgYWxsIGNhbiBwcm92aWRlIHNvbWUgbm90aW9uIG9mIGpvaW4gY2FwYWJpbGl0aWVzLiZuYnNwOyBBcyB0aGUgbmFtZSBpbXBsaWVzLCB0aGUgQ3Jvc3MgQ29sbGVjdGlvbiBKb2luIHF1ZXJ5Jm5ic3A7IGlzIHNwZWNpZmljYWxseSBidWlsdCB0byBhbGxvdyBmb3IgcXVlcmllcyB0byBqb2luIGRvY3VtZW50cyBhY3Jvc3MgdHdvIGRpZmZlcmVudCwgZGlzdHJpYnV0ZWQgY29sbGVjdGlvbnMuJm5ic3A7ICZuYnNwO1RoaXMgcG9zdCBjb3ZlcnMgdGhlIHRlY2huaWNhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ3Jvc3MgQ29sbGVjdGlvbiBKb2luLCB3ZVx1MjAxOWxsIGJlIGZvbGxvd2luZyB0aGlzIHVwIHNvb24gd2l0aCBhbm90aGVyIHBvc3QgZGVkaWNhdGVkIHRvIHNhbXBsZSB1c2UgY2FzZXMgYW5kIGJlbmNobWFya3MgZm9yIHVzaW5nIHRoZSBuZXcgQ3Jvc3MgQ29sbGVjdGlvbiBKb2luIHF1ZXJ5LjxcL3A+XG48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPlxuXG48IS0tIHdwOmhlYWRpbmcge1wibGV2ZWxcIjo0fSAtLT5cbjxoND5Ib3cgaXQgd29ya3M8XC9oND5cbjwhLS0gXC93cDpoZWFkaW5nIC0tPlxuXG48IS0tIHdwOnBhcmFncmFwaCAtLT5cbjxwPlRoZSBDcm9zcyBDb2xsZWN0aW9uIEpvaW4gaXMgYSBuZXcgam9pbiBtZXRob2QgdGhhdCBleGVjdXRlcyBhIHF1ZXJ5IGFnYWluc3QgYSByZW1vdGUgU29sciBjb2xsZWN0aW9uIHRvIHJldHJpZXZlIHRoZSBzZXQgb2Ygam9pbiBrZXlzIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGEgZmlsdGVyIHF1ZXJ5IGFnYWluc3QgdGhlIGxvY2FsIFNvbHIgY29sbGVjdGlvbi4mbmJzcDsgVGhlIENyb3NzQ29sbGVjdGlvbkpvaW5RdWVyeSB3aWxsIGZpcnN0IHF1ZXJ5IGEgcmVtb3RlIHNvbHIgY29sbGVjdGlvbiBhbmQgZ2V0IGJhY2sgYSBzdHJlYW1pbmcgZXhwcmVzc2lvbiByZXN1bHQgb2YgdGhlIGpvaW4ga2V5cy4mbmJzcDsgQXMgdGhlIGpvaW4ga2V5cyBhcmUgc3RyZWFtZWQgdG8gdGhlIG5vZGUsIGEgYml0c2V0IG9mIHRoZSBtYXRjaGluZyBkb2N1bWVudHMgaW4gdGhlIGxvY2FsIGluZGV4IGlzIGJ1aWx0IHVwLiZuYnNwOyBUaGlzIGF2b2lkcyBrZWVwaW5nIHRoZSBmdWxsIHNldCBvZiBqb2luIGtleXMgaW4gbWVtb3J5IGF0IGFueSBnaXZlbiB0aW1lLiZuYnNwOyBUaGlzIGJpdHNldCBpcyB0aGVuIGluc2VydGVkIGludG8gdGhlIGZpbHRlciBjYWNoZSB1cG9uIHN1Y2Nlc3NmdWwgZXhlY3V0aW9uIGFzIHdpdGggdGhlIG5vcm1hbCBiZWhhdmlvciBvZiB0aGUgc29sciBmaWx0ZXIgY2FjaGUuPFwvcD5cbjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+XG5cbjwhLS0gd3A6cGFyYWdyYXBoIC0tPlxuPHA+PGJyPkFkZGl0aW9uYWxseSwgaWYgdGhlIGxvY2FsIGluZGV4IGlzIHNoYXJkZWQgYWNjb3JkaW5nIHRvIHRoZSBqb2luIGtleSBmaWVsZCwgdGhlIENyb3NzIENvbGxlY3Rpb24gcXVlcnkgY2FuIGxldmVyYWdlIGEgc2Vjb25kYXJ5IHF1ZXJ5IHBhcnNlciBjYWxsZWQgdGhlIFx1MjAxY2hhc2hfcmFuZ2VcdTIwMWQgcXVlcnkgcGFyc2VyLiZuYnNwOyBUaGUgaGFzaF9yYW5nZSBxdWVyeSBwYXJzZXIgaXMgcmVzcG9uc2libGUgZm9yIHJldHVybmluZyBvbmx5IHRoZSBkb2N1bWVudHMgdGhhdCBoYXNoIHRvIGEgZ2l2ZW4gcmFuZ2Ugb2YgdmFsdWVzLiZuYnNwOyBJZiB0aGUgbG9jYWwgY29sbGVjdGlvbiBpcyByb3V0ZWQgYmFzZWQgb24gdGhlIGpvaW4ga2V5IHVzZWQsIGVhY2ggc2hhcmQgcGFydGljaXBhdGluZyBpbiB0aGUgQ3Jvc3MgQ29sbGVjdGlvbiBKb2luIFF1ZXJ5IHdpbGwgYmUgYWJsZSB0byByZXRyaWV2ZSBvbmx5IHRoZSBqb2luIGtleXMgZnJvbSB0aGUgcmVtb3RlIGNvbGxlY3Rpb24gdGhhdCBwb3RlbnRpYWxseSBtYXRjaCBpbiB0aGUgbG9jYWwgc2hhcmQuJm5ic3A7IFRoaXMgaGFzIHRoZSBiZW5lZml0IG9mIG1ha2luZyBzdXJlIHRoYXQgbmV0d29yayB0cmFmZmljIGRvZXNuXHUyMDE5dCBpbmNyZWFzZSBhcyB0aGUgbnVtYmVyIG9mIHNoYXJkcyBpbmNyZWFzZXMgYW5kIGFsbG93cyBmb3IgbXVjaCBncmVhdGVyIHNjYWxhYmlsaXR5LjxcL3A+XG48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPlxuXG48IS0tIHdwOnBhcmFncmFwaCAtLT5cbjxwPlRoZSBDcm9zcyBDb2xsZWN0aW9uIEpvaW4gUXVlcnkgd29ya3Mgd2l0aCBib3RoIFN0cmluZyBhbmQgUG9pbnQgdHlwZXMgb2YgZmllbGRzLiZuYnNwOyBUaGUgZmllbGQgdGhhdCBpcyBiZWluZyB1c2VkIGZvciB0aGUgam9pbiBrZXkgaW4gdGhlIHJlbW90ZSBjb2xsZWN0aW9uIG11c3QgYWxzbyBoYXZlIGRvY1ZhbHVlcyBlbmFibGVkLiZuYnNwOyBUaGUgZmllbGQgdGhhdCBpcyBiZWluZyB1c2VkIGZvciB0aGUgam9pbiBrZXkgaW4gdGhlIGxvY2FsIGNvbGxlY3Rpb24gbXVzdCBiZSBhIHNpbmdsZSB2YWx1ZWQgc3RyaW5nIGZpZWxkIGluIG9yZGVyIHRvIHRha2UgYWR2YW50YWdlIGZvciB0aGUgaGFzaCByYW5nZSBvcHRpbWl6YXRpb24gZGVzY3JpYmVkIGFib3ZlLiZuYnNwOyBBZGRpdGlvbmFsbHksIHRoZSBkb2N1bWVudHMgaW4gdGhlIGxvY2FsIGNvbGxlY3Rpb24gbXVzdCBiZSByb3V0ZWQgdG8gc2hhcmQgYmFzZWQgb24gdGhlIGpvaW4ga2V5IGZpZWxkIGZvciB0aGUgb3B0aW1pemF0aW9uLiZuYnNwOyZuYnNwOzxicj5UaGUgcmVtb3RlIHNvbHIgY29sbGVjdGlvbiBkb2VzIG5vdCBoYXZlIGFueSBzcGVjaWZpYyBzaGFyZGluZyByZXF1aXJlbWVudHMuPFwvcD5cbjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+XG5cbjwhLS0gd3A6aGVhZGluZyB7XCJsZXZlbFwiOjQsXCJ0ZXh0Q29sb3JcIjpcImJsYWNrXCJ9IC0tPlxuPGg0IGNsYXNzPVwiaGFzLWJsYWNrLWNvbG9yIGhhcy10ZXh0LWNvbG9yXCI+RXhhbXBsZSB1c2FnZTxcL2g0PlxuPCEtLSBcL3dwOmhlYWRpbmcgLS0+XG5cbjwhLS0gd3A6Y29kZSAtLT5cbjxwcmUgY2xhc3M9XCJ3cC1ibG9jay1jb2RlXCI+PGNvZGU+eyFqb2luIG1ldGhvZD1cImNyb3NzQ29sbGVjdGlvblwiIGZyb21JbmRleD1cIm90aGVyQ29sbGVjdGlvblwiIGZyb209XCJmcm9tRmllbGRcIiB0bz1cInRvRmllbGRcIn0qOipcbiBcbm9yXG4gXG57IWpvaW4gbWV0aG9kPVwiY3Jvc3NDb2xsZWN0aW9uXCIgZnJvbUluZGV4PVwib3RoZXJDb2xsZWN0aW9uXCIgZnJvbT1cImZyb21GaWVsZFwiIHRvPVwidG9GaWVsZFwiIHY9XCIqOipcIn0gICAgKHByZWZlcnJlZCk8XC9jb2RlPjxcL3ByZT5cbjwhLS0gXC93cDpjb2RlIC0tPlxuXG48IS0tIHdwOnByZWZvcm1hdHRlZCAtLT5cbjxwcmUgY2xhc3M9XCJ3cC1ibG9jay1wcmVmb3JtYXR0ZWRcIj57IWpvaW4gbWV0aG9kPVwiY3Jvc3NDb2xsZWN0aW9uXCIgZnJvbUluZGV4PVwib3RoZXJDb2xsZWN0aW9uXCIgZnJvbT1cImZyb21GaWVsZFwiIHRvPVwidG9GaWVsZFwifSo6KlxuIFxub3JcbiBcbnsham9pbiBtZXRob2Q9XCJjcm9zc0NvbGxlY3Rpb25cIiBmcm9tSW5kZXg9XCJvdGhlckNvbGxlY3Rpb25cIiBmcm9tPVwiZnJvbUZpZWxkXCIgdG89XCJ0b0ZpZWxkXCIgdj1cIio6KlwifSAgICAocHJlZmVycmVkKTxcL3ByZT5cbjwhLS0gXC93cDpwcmVmb3JtYXR0ZWQgLS0+XG5cbjwhLS0gd3A6aGVhZGluZyB7XCJsZXZlbFwiOjR9IC0tPlxuPGg0Pmdsb3NzYXJ5IG9mIHRlcm1zPFwvaDQ+XG48IS0tIFwvd3A6aGVhZGluZyAtLT5cblxuPCEtLSB3cDp0YWJsZSB7XCJoYXNGaXhlZExheW91dFwiOnRydWUsXCJjbGFzc05hbWVcIjpcImlzLXN0eWxlLXJlZ3VsYXJcIn0gLS0+XG48ZmlndXJlIGNsYXNzPVwid3AtYmxvY2stdGFibGUgaXMtc3R5bGUtcmVndWxhclwiPjx0YWJsZSBjbGFzcz1cImhhcy1maXhlZC1sYXlvdXRcIj48dGJvZHk+PHRyPjx0ZD5UZXJtPFwvdGQ+PHRkPkRlc2NyaXB0aW9uPFwvdGQ+PFwvdHI+PHRyPjx0ZD5Mb2NhbCBDb2xsZWN0aW9uPFwvdGQ+PHRkPlRoaXMgaXMgdGhlIG1haW4gY29sbGVjdGlvbiB0aGF0IGlzIGJlaW5nIHF1ZXJpZWQuPFwvdGQ+PFwvdHI+PHRyPjx0ZD5SZW1vdGUgQ29sbGVjdGlvbjxcL3RkPjx0ZD5UaGlzIGlzIHRoZSBjb2xsZWN0aW9uIHRoYXQgdGhlIENyb3NzIENvbGxlY3Rpb24gSm9pbiBRdWVyeSB3aWxsIHF1ZXJ5IHRvIHJlc29sdmUgdGhlIGpvaW4ga2V5cy48XC90ZD48XC90cj48dHI+PHRkPkNyb3NzQ29sbGVjdGlvbkpvaW5RdWVyeTxcL3RkPjx0ZD5UaGUgbHVjZW5lIHF1ZXJ5IHRoYXQgZXhlY3V0ZXMgYSBzZWFyY2ggdG8gZ2V0IGJhY2sgYSBzZXQgb2Ygam9pbiBrZXlzIGZyb20gYSByZW1vdGUgY29sbGVjdGlvbjxcL3RkPjxcL3RyPjx0cj48dGQ+SGFzaFJhbmdlUXVlcnk8XC90ZD48dGQ+VGhlIGx1Y2VuZSBxdWVyeSB0aGF0IG1hdGNoZXMgb25seSB0aGUgZG9jdW1lbnRzIHdob3NlIGhhc2ggY29kZSBvbiBhIGZpZWxkIGZhbGxzIHdpdGhpbiBhIHNwZWNpZmllZCByYW5nZS48XC90ZD48XC90cj48XC90Ym9keT48XC90YWJsZT48XC9maWd1cmU+XG48IS0tIFwvd3A6dGFibGUgLS0+XG5cbjwhLS0gd3A6aGVhZGluZyB7XCJsZXZlbFwiOjR9IC0tPlxuPGg0PmNyb3NzIGNvbGxlY3Rpb24gam9pbiBxdWVyeSBwYXJhbWV0ZXJzPFwvaDQ+XG48IS0tIFwvd3A6aGVhZGluZyAtLT5cblxuPCEtLSB3cDp0YWJsZSB7XCJoYXNGaXhlZExheW91dFwiOnRydWUsXCJjbGFzc05hbWVcIjpcImlzLXN0eWxlLXJlZ3VsYXJcIn0gLS0+XG48ZmlndXJlIGNsYXNzPVwid3AtYmxvY2stdGFibGUgaXMtc3R5bGUtcmVndWxhclwiPjx0YWJsZSBjbGFzcz1cImhhcy1maXhlZC1sYXlvdXRcIj48dGJvZHk+PHRyPjx0ZD5QYXJhbTxcL3RkPjx0ZD48c3Ryb25nPlJlcXVpcmVkPFwvc3Ryb25nPjxcL3RkPjx0ZD48c3Ryb25nPkRlc2NyaXB0aW9uPFwvc3Ryb25nPjxcL3RkPjxcL3RyPjx0cj48dGQ+PGVtPkFsbCBvdGhlcnM8XC9lbT48XC90ZD48dGQ+PFwvdGQ+PHRkPkFueSBub3JtYWwgU29sciBwYXJhbWV0ZXIgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGFzIGEgbG9jYWwgcGFyYW0uPFwvdGQ+PFwvdHI+PHRyPjx0ZD5mcm9tSW5kZXg8XC90ZD48dGQ+UmVxdWlyZWQ8XC90ZD48dGQ+VGhlIG5hbWUgb2YgdGhlIGV4dGVybmFsIFNvbHIgY29sbGVjdGlvbiB0byBiZSBxdWVyaWVkIHRvIHJldHJpZXZlIHRoZSBzZXQgb2Ygam9pbiBrZXkgdmFsdWVzIChyZXF1aXJlZCk8XC90ZD48XC90cj48dHI+PHRkPmZyb208XC90ZD48dGQ+UmVxdWlyZWQ8XC90ZD48dGQ+VGhlIGpvaW4ga2V5IGZpZWxkIG5hbWUgaW4gdGhlIGV4dGVybmFsIGNvbGxlY3Rpb24gKHJlcXVpcmVkKTxcL3RkPjxcL3RyPjx0cj48dGQ+cm91dGVkPFwvdGQ+PHRkPk9wdGlvbmFsPFwvdGQ+PHRkPnRydWUgXC8gZmFsc2UuJm5ic3A7IElmIHRydWUsIHRoZSBDcm9zcyBDb2xsZWN0aW9uIEpvaW4gcXVlcnkgd2lsbCB1c2UgZWFjaCBzaGFyZFx1MjAxOXMgaGFzaCByYW5nZSB0byBkZXRlcm1pbmUgdGhlIHNldCBvZiBqb2luIGtleXMgdG8gcmV0cmlldmUgZm9yIHRoYXQgc2hhcmQuJm5ic3A7IFRoaXMgcGFyYW1ldGVyIGltcHJvdmVzIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgY3Jvc3MtY29sbGVjdGlvbiBqb2luLCBidXQgaXQgZGVwZW5kcyBvbiB0aGUgbG9jYWwgY29sbGVjdGlvbiBiZWluZyByb3V0ZWQgYnkgdGhlIHRvRmllbGQuJm5ic3A7IElmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBDcm9zcyBDb2xsZWN0aW9uIEpvaW4gcXVlcnkgd2lsbCB0cnkgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHZhbHVlIGF1dG9tYXRpY2FsbHkuPFwvdGQ+PFwvdHI+PHRyPjx0ZD5zb2xyVXJsPFwvdGQ+PHRkPk9wdGlvbmFsPFwvdGQ+PHRkPlRoZSBVUkwgb2YgdGhlIGV4dGVybmFsIFNvbHIgbm9kZSB0byBiZSBxdWVyaWVkIChvcHRpb25hbCkuJm5ic3A7IFRoZSBzb2xyVXJsIG11c3QgYmUgYWRkZWQgdG8gdGhlIFx1MjAxY2FsbG93U29sclVybHNcdTIwMWQgbGlzdCBpbiB0aGUgc29scmNvbmZpZy54bWwgZmlsZTxcL3RkPjxcL3RyPjx0cj48dGQ+dG88XC90ZD48dGQ+UmVxdWlyZWQ8XC90ZD48dGQ+VGhlIGpvaW4ga2V5IGZpZWxkIG5hbWUgaW4gdGhlIGxvY2FsIGNvbGxlY3Rpb248XC90ZD48XC90cj48dHI+PHRkPnR0bDxcL3RkPjx0ZD5PcHRpb25hbDxcL3RkPjx0ZD5UaGUgbGVuZ3RoIG9mIHRpbWUgdGhhdCBhIENyb3NzIENvbGxlY3Rpb24gSm9pbiBxdWVyeSBpbiB0aGUgY2FjaGUgd2lsbCBiZSBjb25zaWRlcmVkIHZhbGlkLCBpbiBzZWNvbmRzLiZuYnNwOyBEZWZhdWx0cyB0byAzNjAwIChvbmUgaG91cikuJm5ic3A7IFRoZSBDcm9zcyBDb2xsZWN0aW9uIEpvaW4gcXVlcnkgd2lsbCBub3QgYmUgYXdhcmUgb2YgY2hhbmdlcyB0byB0aGUgcmVtb3RlIGNvbGxlY3Rpb24sIHNvIGlmIHRoZSByZW1vdGUgY29sbGVjdGlvbiBpcyB1cGRhdGVkLCBjYWNoZWQgQ3Jvc3MgQ29sbGVjdGlvbiBKb2luIHF1ZXJpZXMgbWF5IGdpdmUgaW5hY2N1cmF0ZSByZXN1bHRzLiZuYnNwOyBBZnRlciB0aGUgdHRsIHBlcmlvZCBoYXMgZXhwaXJlZCwgdGhlIENyb3NzIENvbGxlY3Rpb24gSm9pbiBxdWVyeSB3aWxsIHJlLWV4ZWN1dGUgdGhlIGpvaW4gYWdhaW5zdCB0aGUgcmVtb3RlIGNvbGxlY3Rpb24uPFwvdGQ+PFwvdHI+PHRyPjx0ZD52PFwvdGQ+PHRkPlNlZSBOb3RlPFwvdGQ+PHRkPlRoZSBxdWVyeSB0byBiZSBleGVjdXRlZCBhZ2FpbnN0IHRoZSBleHRlcm5hbCBTb2xyIGNvbGxlY3Rpb24gdG8gcmV0cmlldmUgdGhlIHNldCBvZiBqb2luIGtleSB2YWx1ZXMuJm5ic3A7IE5vdGU6Jm5ic3A7IFRoZSBvcmlnaW5hbCBxdWVyeSBjYW4gYmUgcGFzc2VkIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyBvciBhcyB0aGUgXHUyMDFjdlx1MjAxZCBwYXJhbWV0ZXIuJm5ic3A7IEl0XHUyMDE5cyByZWNvbW1lbmRlZCB0byB1c2UgcXVlcnkgcGFyYW1ldGVyIHN1YnN0aXR1dGlvbiB3aXRoIHRoZSBcdTIwMWN2XHUyMDFkIHBhcmFtZXRlciB0byBlbnN1cmUgbm8gaXNzdWVzIGFyaXNlIHdpdGggdGhlIGRlZmF1bHQgcXVlcnkgcGFyc2Vycy48XC90ZD48XC90cj48dHI+PHRkPnprSG9zdDxcL3RkPjx0ZD5PcHRpb25hbDxcL3RkPjx0ZD5UaGUgY29ubmVjdGlvbiBzdHJpbmcgdG8gYmUgdXNlZCB0byBjb25uZWN0IHRvIFpvb2tlZXBlci4mbmJzcDsgemtIb3N0IGFuZCBzb2xyVXJsIGFyZSBib3RoIG9wdGlvbmFsIHBhcmFtZXRlcnMsIGFuZCBhdCBtb3N0IG9uZSBvZiB0aGVtIHNob3VsZCBiZSBzcGVjaWZpZWQuJm5ic3A7IElmIG5laXRoZXIgb2YgemtIb3N0IG9yIHNvbHJVcmwgYXJlIHNwZWNpZmllZCwgdGhlIGxvY2FsIFpvb2tlZXBlciBjbHVzdGVyIHdpbGwgYmUgdXNlZC4gKG9wdGlvbmFsKTxcL3RkPjxcL3RyPjxcL3Rib2R5PjxcL3RhYmxlPjxcL2ZpZ3VyZT5cbjwhLS0gXC93cDp0YWJsZSAtLT5cblxuPCEtLSB3cDpoZWFkaW5nIHtcImxldmVsXCI6NH0gLS0+XG48aDQ+SW5zdGFsbGF0aW9uPFwvaDQ+XG48IS0tIFwvd3A6aGVhZGluZyAtLT5cblxuPCEtLSB3cDpwYXJhZ3JhcGggLS0+XG48cD5JbiBvcmRlciB0byB1c2UgdGhlIEhhc2ggUmFuZ2UgcXVlcnkgb3B0aW1pemF0aW9uLCB0aGUgc29scmNvbmZpZy54bWwgZm9yIGxvY2FsIGFuZCByZW1vdGUgY29sbGVjdGlvbnMgbmVlZHMgdG8gYmUgdXBkYXRlZCBhcyBkZWZpbmVkIGJlbG93LjxcL3A+XG48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPlxuXG48IS0tIHdwOmhlYWRpbmcge1wibGV2ZWxcIjo1fSAtLT5cbjxoNT5Tb2xyY29uZmlnLnhtbCBcdTIwMTMgTG9jYWwgQ29sbGVjdGlvbjxcL2g1PlxuPCEtLSBcL3dwOmhlYWRpbmcgLS0+XG5cbjwhLS0gd3A6Y29kZSAtLT5cbjxwcmUgY2xhc3M9XCJ3cC1ibG9jay1jb2RlXCI+PGNvZGU+Jmx0O3F1ZXJ5UGFyc2VyIG5hbWU9XCJqb2luXCIgY2xhc3M9XCJvcmcuYXBhY2hlLnNvbHIuc2VhcmNoLkpvaW5RUGFyc2VyUGx1Z2luXCImZ3Q7XG4gICZsdDtzdHIgbmFtZT1cInJvdXRlckZpZWxkXCImZ3Q7cHJvZHVjdF9pZCZsdDtcL3N0ciZndDtcbiZsdDtcL3F1ZXJ5UGFyc2VyJmd0OzxcL2NvZGU+PFwvcHJlPlxuPCEtLSBcL3dwOmNvZGUgLS0+XG5cbjwhLS0gd3A6cGFyYWdyYXBoIC0tPlxuPHA+Tm9ybWFsbHksIHRoaXMgcXVlcnkgcGFyc2VyIGlzIGF1dG9tYXRpY2FsbHkgcmVnaXN0ZXJlZCBieSBTb2xyLiZuYnNwOyBJbiBvcmRlciB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgSGFzaCBSYW5nZSBvcHRpbWl6YXRpb24gdGhlIHJvdXRlZEZpZWxkIHByb3BlcnR5IG11c3QgYmUgc2V0IG9uIHRoZSBKb2luUVBhcnNlciBpbiB0aGUgU29scmNvbmZpZyAueG1sLiZuYnNwOyBJbiB0aGlzIGV4YW1wbGUsIHdlXHUyMDE5dmUgc3BlY2lmaWVkIHRoZSBcdTIwMWNwcm9kdWN0X2lkXHUyMDFkIGZpZWxkIHRvIGluZGljYXRlIHRoZSBmaWVsZCBuYW1lIHRoYXQgd2lsbCBzdXBwb3J0IHRoZSByb3V0ZWQ9dHJ1ZSBwYXJhbWV0ZXIgb3B0aW1pemF0aW9uLjxcL3A+XG48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPlxuXG48IS0tIHdwOmhlYWRpbmcge1wibGV2ZWxcIjo1fSAtLT5cbjxoNT5Tb2xyY29uZmlnLnhtbCBcdTIwMTMgUmVtb3RlIENvbGxlY3Rpb248XC9oNT5cbjwhLS0gXC93cDpoZWFkaW5nIC0tPlxuXG48IS0tIHdwOmNvZGUgLS0+XG48cHJlIGNsYXNzPVwid3AtYmxvY2stY29kZVwiPjxjb2RlPiZsdDtjYWNoZSBuYW1lPVwiaGFzaF9wcm9kdWN0X2lkXCJcbiAgICAgICBjbGFzcz1cInNvbHIuTFJVQ2FjaGVcIlxuICAgICAgIHNpemU9XCIxMjhcIlxuICAgICAgIGluaXRpYWxTaXplPVwiMFwiXG4gICAgICAgcmVnZW5lcmF0b3I9XCJzb2xyLk5vT3BSZWdlbmVyYXRvclwiXC8mZ3Q7PFwvY29kZT48XC9wcmU+XG48IS0tIFwvd3A6Y29kZSAtLT5cblxuPCEtLSB3cDpwYXJhZ3JhcGggLS0+XG48cD5NYWtlIHN1cmUgdG8gZGVmaW5lIHRoZSBjYWNoZSBmb3IgdGhlIEhhc2ggUmFuZ2UgcXVlcnkgd2l0aCBhIHNpemUgZXF1YWwgdG8gdGhlIG1heGltdW0gbnVtYmVyIG9mIHNlZ21lbnRzIHRoYXQgYXJlIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBpbmRleC4mbmJzcDsgKHR5cGljYWxseSB0aGlzIG51bWJlciBzdGF5cyB3ZWxsIGJlbG93IDEwMC4pPFwvcD5cbjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+XG5cbjwhLS0gd3A6aGVhZGluZyB7XCJsZXZlbFwiOjR9IC0tPlxuPGg0PnBvdGVudGlhbCBpc3N1ZXM8XC9oND5cbjwhLS0gXC93cDpoZWFkaW5nIC0tPlxuXG48IS0tIHdwOmxpc3Qge1wib3JkZXJlZFwiOnRydWV9IC0tPlxuPG9sPjxsaT5BIGxhcmdlIG51bWJlciBvZiBqb2luIGtleXMgd2lsbCB0YWtlIGEgbG90IG9mIG5ldHdvcmsgYmFuZHdpZHRoIHRvIHRyYW5zbWl0IHRvIGFsbCB0aGUgc2hhcmRzLjxcL2xpPjxsaT5UaGUgaGFzaF9wcm9kdWN0X2lkIGNhY2hlIHdpbGwgbm90IGV4cGxpY2l0bHkgZXhwdW5nZSBlbnRyaWVzIHVudGlsIHRoZSBtYXggc2l6ZSBpcyByZWFjaGVkLjxcL2xpPjxcL29sPlxuPCEtLSBcL3dwOmxpc3QgLS0+In0sImVsZW1lbnRzIjpbXSwid2lkZ2V0VHlwZSI6InRleHQtZWRpdG9yIn0=\\\"]\\t\\t\\t<\\\/div>\\n\\t\\t<\\\/div>\\n\\t\\t\\t\\t\\t<\\\/div><\\\/div>\\r\\n\\t\\t<\\\/section>\\r\\n\\t\\t\\t\\t<section class=\\\"elementor-section elementor-top-section elementor-element elementor-element-9f71eaa elementor-section-boxed elementor-section-height-default elementor-section-height-default\\\" data-id=\\\"9f71eaa\\\" data-element_type=\\\"section\\\" data-e-type=\\\"section\\\">\\r\\n\\t\\t\\t\\t\\t\\t<div class=\\\"elementor-container elementor-column-gap-thegem\\\"><div class=\\\"elementor-row\\\">\\r\\n\\t\\t\\t\\t\\t<div class=\\\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-29340c4\\\" data-id=\\\"29340c4\\\" data-element_type=\\\"column\\\" data-e-type=\\\"column\\\">\\n\\t\\t\\t<div class=\\\"elementor-widget-wrap elementor-element-populated\\\">\\n\\t\\t\\t\\t[elementor-element k=\\\"9109a976d8649ee6d2c8fef8daebbb8b\\\" data=\\\"eyJpZCI6ImQyZmQ0NjAiLCJlbFR5cGUiOiJ3aWRnZXQiLCJzZXR0aW5ncyI6eyJwcmV2X2xhYmVsIjoiUHJldmlvdXMgUG9zdCIsIm5leHRfbGFiZWwiOiJOZXh0IFBvc3QiLCJzaG93X2JvcmRlcnMiOiIiLCJ0aXRsZV90eXBvZ3JhcGh5X3R5cG9ncmFwaHkiOiJjdXN0b20iLCJ0aXRsZV90eXBvZ3JhcGh5X2ZvbnRfc2l6ZSI6eyJ1bml0IjoicHgiLCJzaXplIjoxNCwic2l6ZXMiOltdfSwidGl0bGVfdHlwb2dyYXBoeV9mb250X3dlaWdodCI6IjcwMCIsIl9fZ2xvYmFsc19fIjp7ImFycm93X2NvbG9yIjoiZ2xvYmFsc1wvY29sb3JzP2lkPXByaW1hcnkiLCJsYWJlbF9jb2xvciI6Imdsb2JhbHNcL2NvbG9ycz9pZD1zZWNvbmRhcnkifSwiYXJyb3ciOiJmYSBmYS1jYXJldC1sZWZ0Iiwic2hvd19hcnJvdyI6IiJ9LCJlbGVtZW50cyI6W10sIndpZGdldFR5cGUiOiJnbG9iYWwiLCJ0ZW1wbGF0ZUlEIjoiMjgwODMifQ==\\\"]\\t\\t\\t<\\\/div>\\n\\t\\t<\\\/div>\\n\\t\\t\\t\\t\\t<\\\/div><\\\/div>\\r\\n\\t\\t<\\\/section>\\r\\n\\t\\t\",\"scripts\":[],\"styles\":[]}}"]},"jetpack_featured_media_url":"https:\/\/kmwllc.com\/wp-content\/uploads\/2020\/07\/blog_CCJQ1200x900-min.png","menu_order":0,"_links":{"self":[{"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/posts\/26156","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/comments?post=26156"}],"version-history":[{"count":11,"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/posts\/26156\/revisions"}],"predecessor-version":[{"id":29752,"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/posts\/26156\/revisions\/29752"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/media\/29708"}],"wp:attachment":[{"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/media?parent=26156"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/categories?post=26156"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/tags?post=26156"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}